From a77785fd74a11995294bc0a8a0ec0fa3aa75d308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 9 Apr 2025 08:50:22 +0000 Subject: [PATCH 01/35] Step score initial approach. Add score to task_status ros message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../robothon_taskboard_msgs/msg/TaskStatus.msg | 1 + idf/taskboard/main/microros/MicroROSTypes.hpp | 15 +++++++++++++++ idf/taskboard/main/network/JSONHandler.hpp | 1 + idf/taskboard/main/task/ParallelTask.hpp | 10 ++++++++++ idf/taskboard/main/task/SequentialTask.hpp | 15 +++++++++++++++ .../main/task/SimultaneousConditionTask.hpp | 2 ++ idf/taskboard/main/task/Task.hpp | 10 ++++++++++ idf/taskboard/main/task/TaskStep.hpp | 9 +++++++++ idf/taskboard/main/task/TaskStepEqual.hpp | 6 ++++++ idf/taskboard/main/task/TaskStepEqualToRandom.hpp | 6 ++++++ .../main/task/TaskStepGreaterEqualThan.hpp | 6 ++++++ 11 files changed, 81 insertions(+) diff --git a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStatus.msg b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStatus.msg index 000b79c..8038445 100644 --- a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStatus.msg +++ b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStatus.msg @@ -5,4 +5,5 @@ bool waiting_precondition builtin_interfaces/Time elapsed_time TaskStep[] steps bool[] status +float32[] score builtin_interfaces/Time[] finish_times \ No newline at end of file diff --git a/idf/taskboard/main/microros/MicroROSTypes.hpp b/idf/taskboard/main/microros/MicroROSTypes.hpp index 70c58d4..d75da07 100644 --- a/idf/taskboard/main/microros/MicroROSTypes.hpp +++ b/idf/taskboard/main/microros/MicroROSTypes.hpp @@ -103,6 +103,10 @@ struct MicroROSTypes microros_msg_.status.size = task.total_steps(); microros_msg_.status.capacity = task.total_steps(); + microros_msg_.score.data = new float[task.total_steps()]; + microros_msg_.score.size = task.total_steps(); + microros_msg_.score.capacity = task.total_steps(); + microros_msg_.finish_times.data = new builtin_interfaces__msg__Time[task.total_steps()]; microros_msg_.finish_times.size = task.total_steps(); microros_msg_.finish_times.capacity = task.total_steps(); @@ -167,10 +171,12 @@ struct MicroROSTypes if (task.step_done(i)) { + microros_msg_.score.data[i] = task.step_score(i); microros_msg_.finish_times.data[i] = usec_to_microros(task.step_done_time(i)); } else { + microros_msg_.score.data[i] = {}; microros_msg_.finish_times.data[i] = {}; } } @@ -203,6 +209,10 @@ struct MicroROSTypes microros_msg_.status.size = 0; microros_msg_.status.capacity = 0; + microros_msg_.score.data = nullptr; + microros_msg_.score.size = 0; + microros_msg_.score.capacity = 0; + microros_msg_.finish_times.data = nullptr; microros_msg_.finish_times.size = 0; microros_msg_.finish_times.capacity = 0; @@ -244,6 +254,11 @@ struct MicroROSTypes delete microros_msg_.status.data; } + if (microros_msg_.score.data != nullptr) + { + delete microros_msg_.score.data; + } + if (microros_msg_.finish_times.data != nullptr) { delete microros_msg_.finish_times.data; diff --git a/idf/taskboard/main/network/JSONHandler.hpp b/idf/taskboard/main/network/JSONHandler.hpp index f1c74e7..6421424 100644 --- a/idf/taskboard/main/network/JSONHandler.hpp +++ b/idf/taskboard/main/network/JSONHandler.hpp @@ -252,6 +252,7 @@ struct JSONHandler if (task.step_done(i)) { + cJSON_AddNumberToObject(step, "score", task.step_score(i)); cJSON_AddNumberToObject(step, "finish_time", task.step_done_time(i) / 1e6); } diff --git a/idf/taskboard/main/task/ParallelTask.hpp b/idf/taskboard/main/task/ParallelTask.hpp index bb320e3..be7e24b 100644 --- a/idf/taskboard/main/task/ParallelTask.hpp +++ b/idf/taskboard/main/task/ParallelTask.hpp @@ -29,6 +29,7 @@ struct ParallelTask : : Task(steps, task_name, false) { steps_status_.resize(steps.size(), false); + steps_score_.resize(steps.size(), -1.0f); steps_finish_time_.resize(steps.size(), -1); } @@ -63,6 +64,7 @@ struct ParallelTask : if (!steps_status_[i] && steps_[i]->success()) { steps_status_[i] = true; + steps_score_[i] = steps_[i]->score(); steps_finish_time_[i] = elapsed_time(); ret = true; } @@ -92,6 +94,13 @@ struct ParallelTask : return steps_status_[step]; } + /// Virtual method implementation + float step_score( + size_t step) const override + { + return steps_score_[step]; + } + /// Virtual method implementation int64_t step_done_time( size_t step) const override @@ -109,5 +118,6 @@ struct ParallelTask : protected: std::vector steps_status_; ///< Completion status for each step + std::vector steps_score_; ///< Score for each step std::vector steps_finish_time_; ///< Completion status for each step }; diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index 601b035..fdaccc5 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -58,6 +58,7 @@ struct SequentialTask : // Initialize step finish time if not done yet if (steps_finish_time_.size() == 0) { + steps_score_.resize(steps_.size(), -1.0f); steps_finish_time_.resize(steps_.size(), -1); } @@ -65,6 +66,7 @@ struct SequentialTask : { if (steps_[current_step_]->success()) { + steps_score_[current_step_] = steps_[current_step_]->score(); steps_finish_time_[current_step_] = elapsed_time(); current_step_++; @@ -94,6 +96,18 @@ struct SequentialTask : return step < current_step_; } + /// Virtual method implementation + float step_score( + size_t step) const override + { + if (step >= steps_score_.size()) + { + return -1; + } + + return steps_score_[step]; + } + /// Virtual method implementation int64_t step_done_time( size_t step) const override @@ -116,5 +130,6 @@ struct SequentialTask : private: size_t current_step_ = 0; ///< Index of current step being executed + std::vector steps_score_; ///< Score for each step std::vector steps_finish_time_; ///< Completion status for each step }; diff --git a/idf/taskboard/main/task/SimultaneousConditionTask.hpp b/idf/taskboard/main/task/SimultaneousConditionTask.hpp index e276cff..ca1f3c9 100644 --- a/idf/taskboard/main/task/SimultaneousConditionTask.hpp +++ b/idf/taskboard/main/task/SimultaneousConditionTask.hpp @@ -50,10 +50,12 @@ struct SimultaneousConditionTask : if (!state) { + steps_score_[i] = -1.0f; steps_finish_time_[i] = -1; } else { + steps_score_[i] = steps_[i]->score(); steps_finish_time_[i] = elapsed_time(); } } diff --git a/idf/taskboard/main/task/Task.hpp b/idf/taskboard/main/task/Task.hpp index ccec98c..7ac80bc 100644 --- a/idf/taskboard/main/task/Task.hpp +++ b/idf/taskboard/main/task/Task.hpp @@ -63,6 +63,16 @@ struct Task virtual bool step_done( size_t step) const = 0; + /** + * @brief Gets the score of a specific step + * + * @param step Index of the step to check + * + * @return Score of the specified step + */ + virtual float step_score( + size_t step) const = 0; + /** * @brief Gets step done time * diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index e7768b4..0cf8609 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -168,6 +168,15 @@ struct TaskStep : */ virtual bool success() const = 0; + /** + * @brief Calculates the score for this step + * + * @details The score is a measurement of how well the task has been performed. + * + * @return Score value between 0 and 100, where 0 means no success and 100 means full success. + */ + virtual float score() const = 0; + /** * @brief Gets the target value for this step * diff --git a/idf/taskboard/main/task/TaskStepEqual.hpp b/idf/taskboard/main/task/TaskStepEqual.hpp index f9e587e..2730e47 100644 --- a/idf/taskboard/main/task/TaskStepEqual.hpp +++ b/idf/taskboard/main/task/TaskStepEqual.hpp @@ -44,6 +44,12 @@ struct TaskStepEqual : return SensorMeasurement::equal(sensor_.read(), expected_value_, tolerance_); } + /// Virtual method implementation + float score() const override + { + return 100.0f; + } + /// Virtual method implementation SensorMeasurement expected_value() const override { diff --git a/idf/taskboard/main/task/TaskStepEqualToRandom.hpp b/idf/taskboard/main/task/TaskStepEqualToRandom.hpp index c5560d1..02f9fb0 100644 --- a/idf/taskboard/main/task/TaskStepEqualToRandom.hpp +++ b/idf/taskboard/main/task/TaskStepEqualToRandom.hpp @@ -49,6 +49,12 @@ struct TaskStepEqualToRandom : return ret; } + /// Virtual method implementation + float score() const override + { + return 100.0f; + } + private: /// Virtual method implementation diff --git a/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp b/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp index c0e911e..500609d 100644 --- a/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp +++ b/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp @@ -40,6 +40,12 @@ struct TaskStepGreaterEqualThan : return SensorMeasurement::greater_or_equal(sensor_.read(), expected_value_); } + /// Virtual method implementation + float score() const override + { + return 100.0f; + } + /// Virtual method implementation SensorMeasurement expected_value() const override { From 3b52c73e1fc21d2e46371779546c8ed404e133e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 9 Apr 2025 10:05:01 +0000 Subject: [PATCH 02/35] Add score to web interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/network/webpages/web_index.h | 3508 +++++++++-------- idf/taskboard/web_interfaces/index.html | 4 + 2 files changed, 1764 insertions(+), 1748 deletions(-) diff --git a/idf/taskboard/main/network/webpages/web_index.h b/idf/taskboard/main/network/webpages/web_index.h index cdbef1f..43bffe2 100644 --- a/idf/taskboard/main/network/webpages/web_index.h +++ b/idf/taskboard/main/network/webpages/web_index.h @@ -2,9 +2,9 @@ #define INDEX_H /* - * Original size: 49,842 bytes - * Minified size: 26,076 bytes - * Saved: 47.7% + * Original size: 50,077 bytes + * Minified size: 26,221 bytes + * Saved: 47.6% */ const unsigned char _index_html[] = { @@ -334,678 +334,488 @@ const unsigned char _index_html[] = { 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x38, 0x66, 0x38, 0x66, 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, - 0x78, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, - 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, - 0x23, 0x65, 0x38, 0x66, 0x35, 0x65, 0x39, 0x7d, 0x2e, 0x73, 0x74, 0x65, - 0x70, 0x2e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x7b, 0x62, 0x61, - 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x66, - 0x66, 0x33, 0x65, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, - 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x2e, 0x32, 0x65, 0x6d, 0x3b, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x36, 0x7d, 0x2e, 0x73, 0x74, - 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x73, 0x74, 0x65, + 0x78, 0x3b, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x3a, + 0x77, 0x72, 0x61, 0x70, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x32, 0x2e, 0x32, 0x72, 0x65, 0x6d, + 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, + 0x65, 0x38, 0x66, 0x35, 0x65, 0x39, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, + 0x2e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x66, 0x66, + 0x33, 0x65, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x31, 0x2e, 0x32, 0x65, 0x6d, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x36, 0x3b, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x2d, 0x31, 0x2e, 0x35, + 0x72, 0x65, 0x6d, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x20, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, + 0x63, 0x61, 0x66, 0x35, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2e, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x7b, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x7d, 0x2e, - 0x73, 0x74, 0x65, 0x70, 0x2e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x7b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x39, - 0x38, 0x30, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x6e, 0x61, - 0x6d, 0x65, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3a, 0x35, 0x30, 0x30, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, 0x30, - 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, - 0x64, 0x3a, 0x23, 0x66, 0x38, 0x66, 0x38, 0x66, 0x38, 0x3b, 0x62, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, - 0x38, 0x70, 0x78, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, - 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x7b, - 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, - 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, - 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x30, 0x70, - 0x78, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, - 0x65, 0x78, 0x3b, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x3b, 0x61, 0x6c, 0x69, - 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x62, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, - 0x65, 0x3a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3b, 0x66, - 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x2e, 0x39, 0x65, - 0x6d, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x2c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x39, 0x38, 0x30, 0x30, 0x7d, 0x2e, + 0x73, 0x74, 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x7b, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, + 0x30, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x38, + 0x66, 0x38, 0x66, 0x38, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x38, 0x70, 0x78, 0x3b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x64, 0x7b, 0x74, 0x65, - 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, 0x66, - 0x74, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x38, 0x70, - 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, - 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x20, 0x23, 0x65, 0x65, 0x65, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x74, 0x68, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x3a, 0x23, 0x36, 0x36, 0x36, 0x7d, 0x2e, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, - 0x7b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, - 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2e, 0x32, 0x73, 0x7d, 0x2e, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, - 0x77, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, - 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x7b, 0x66, - 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x6d, - 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2e, 0x69, 0x73, - 0x2d, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, - 0x32, 0x70, 0x78, 0x20, 0x36, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, - 0x78, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, - 0x2e, 0x38, 0x65, 0x6d, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x65, 0x33, 0x66, 0x32, 0x66, 0x64, 0x3b, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x31, 0x39, 0x37, 0x36, 0x64, - 0x32, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, - 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2c, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x7b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, - 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, - 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x67, 0x61, 0x70, 0x3a, - 0x38, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, - 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, - 0x61, 0x74, 0x6f, 0x72, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x32, 0x70, 0x78, - 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x31, 0x32, 0x70, 0x78, - 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, - 0x75, 0x73, 0x3a, 0x35, 0x30, 0x25, 0x7d, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, - 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x7d, - 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x3a, 0x67, 0x72, 0x69, 0x64, 0x3b, 0x67, 0x72, 0x69, 0x64, 0x2d, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x3a, 0x31, 0x66, 0x72, 0x20, 0x61, 0x75, 0x74, - 0x6f, 0x3b, 0x67, 0x61, 0x70, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x61, - 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, - 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x7b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, - 0x67, 0x61, 0x70, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x61, 0x6c, 0x69, - 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, - 0x6f, 0x73, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, - 0x36, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, - 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, - 0x64, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, - 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x3a, 0x31, 0x35, 0x30, 0x70, 0x78, 0x7d, 0x2e, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x2c, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2d, - 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, - 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, - 0x33, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x69, 0x74, - 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x38, 0x70, 0x78, 0x20, 0x31, - 0x36, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, - 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, - 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, - 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, - 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x31, 0x39, 0x37, 0x36, 0x64, 0x32, 0x7d, - 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, - 0x69, 0x6c, 0x79, 0x3a, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, - 0x3a, 0x23, 0x66, 0x38, 0x66, 0x38, 0x66, 0x38, 0x3b, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x62, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, - 0x34, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, - 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, + 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, + 0x33, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x6a, 0x75, + 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x62, 0x65, 0x74, 0x77, + 0x65, 0x65, 0x6e, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, - 0x63, 0x61, 0x72, 0x64, 0x20, 0x68, 0x32, 0x7b, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x6a, 0x75, 0x73, - 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, - 0x65, 0x6e, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, - 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, - 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, - 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, - 0x36, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x69, 0x74, - 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, 0x20, 0x31, - 0x32, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, - 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, - 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2e, 0x32, 0x73, 0x3b, 0x66, 0x6f, 0x6e, - 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0x66, - 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, - 0x6f, 0x6c, 0x64, 0x7d, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, 0x62, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x7b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3a, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x2e, 0x39, 0x65, 0x6d, 0x7d, 0x2e, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x2c, 0x2e, 0x6c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x64, 0x7b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x38, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, + 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x65, 0x65, + 0x65, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, + 0x66, 0x66, 0x66, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x36, + 0x36, 0x36, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, 0x7b, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, + 0x2e, 0x32, 0x73, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x2e, 0x74, 0x69, 0x6d, 0x65, + 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x7d, 0x2e, 0x69, 0x73, 0x2d, 0x68, 0x75, 0x6d, 0x61, + 0x6e, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x32, 0x70, 0x78, 0x20, 0x36, + 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x2e, 0x38, 0x65, 0x6d, 0x3b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, + 0x65, 0x33, 0x66, 0x32, 0x66, 0x64, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x31, 0x39, 0x37, 0x36, 0x64, 0x32, 0x7d, 0x2e, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3b, 0x67, 0x61, 0x70, 0x3a, 0x38, 0x70, 0x78, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x7b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x35, 0x30, + 0x25, 0x7d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2d, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x7b, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x34, 0x63, 0x61, 0x66, + 0x35, 0x30, 0x7d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2d, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, + 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x67, 0x72, 0x69, + 0x64, 0x3b, 0x67, 0x72, 0x69, 0x64, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x2d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x3a, + 0x31, 0x66, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x67, 0x61, 0x70, + 0x3a, 0x31, 0x35, 0x70, 0x78, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x7d, + 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x73, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x67, 0x61, 0x70, 0x3a, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x7b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, + 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x35, 0x30, + 0x70, 0x78, 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, + 0x73, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, 0x2e, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x38, 0x70, 0x78, 0x20, 0x31, 0x36, 0x70, 0x78, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, + 0x7d, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, + 0x2c, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, - 0x64, 0x33, 0x32, 0x66, 0x32, 0x66, 0x7d, 0x2e, 0x74, 0x6f, 0x70, 0x2d, - 0x63, 0x61, 0x72, 0x64, 0x20, 0x68, 0x32, 0x7b, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x6a, 0x75, 0x73, - 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, - 0x65, 0x6e, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, - 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, - 0x67, 0x2d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x62, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x3b, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, - 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, - 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, - 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, 0x61, - 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x20, 0x2e, 0x32, 0x73, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, - 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0x66, 0x6f, 0x6e, - 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, - 0x64, 0x7d, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, 0x6c, - 0x7b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x75, - 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x7b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, - 0x3b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x31, - 0x30, 0x30, 0x25, 0x3b, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x62, - 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x77, 0x68, - 0x69, 0x74, 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, - 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, - 0x64, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x34, 0x70, - 0x78, 0x20, 0x38, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, - 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x30, - 0x20, 0x32, 0x70, 0x78, 0x20, 0x34, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, - 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x29, - 0x3b, 0x7a, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x31, 0x30, 0x7d, - 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x3a, 0x68, - 0x6f, 0x76, 0x65, 0x72, 0x20, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, + 0x31, 0x39, 0x37, 0x36, 0x64, 0x32, 0x7d, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x6d, + 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x38, 0x66, + 0x38, 0x66, 0x38, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x31, 0x32, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, + 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, 0x2e, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x20, + 0x68, 0x32, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, + 0x6c, 0x65, 0x78, 0x3b, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x3b, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, + 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, + 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, + 0x2e, 0x32, 0x73, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x2e, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, 0x64, 0x33, 0x32, 0x66, 0x32, + 0x66, 0x7d, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x20, + 0x68, 0x32, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, + 0x6c, 0x65, 0x78, 0x3b, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x3b, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x31, 0x35, 0x70, 0x78, 0x7d, + 0x2e, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x23, + 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x34, + 0x70, 0x78, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2e, 0x32, + 0x73, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x36, 0x30, 0x25, 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x7d, 0x2e, 0x75, 0x75, + 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x7b, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x3b, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x7d, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x7d, 0x3c, 0x2f, 0x73, - 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, - 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x68, 0x31, 0x3e, 0x52, 0x6f, - 0x62, 0x6f, 0x74, 0x68, 0x6f, 0x6e, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, - 0x42, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x2d, 0x20, 0x3c, 0x73, 0x70, 0x61, - 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, - 0x69, 0x64, 0x3e, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, - 0x2e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x68, 0x31, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x63, - 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x68, - 0x32, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, - 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2d, 0x63, 0x61, 0x72, - 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x53, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2d, 0x67, 0x72, 0x69, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, - 0x72, 0x64, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, - 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x52, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, - 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x3b, 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x30, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x20, 0x23, 0x64, 0x64, 0x64, 0x3b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x34, 0x70, 0x78, 0x20, 0x38, 0x70, 0x78, + 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, + 0x75, 0x73, 0x3a, 0x34, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x78, 0x2d, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x30, 0x20, 0x32, 0x70, 0x78, 0x20, + 0x34, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x31, 0x29, 0x3b, 0x7a, 0x2d, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x3a, 0x31, 0x30, 0x7d, 0x2e, 0x75, 0x75, 0x69, 0x64, + 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, + 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, + 0x70, 0x7b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x7d, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, + 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x3c, 0x68, 0x31, 0x3e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x68, 0x6f, + 0x6e, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x42, 0x6f, 0x61, 0x72, 0x64, + 0x20, 0x2d, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x64, 0x3e, 0x4c, 0x6f, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, + 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3e, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, + 0x64, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, + 0x3c, 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, + 0x32, 0x3e, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x68, + 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x67, 0x72, 0x69, 0x64, + 0x20, 0x69, 0x64, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2d, + 0x67, 0x72, 0x69, 0x64, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, - 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3e, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, - 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x20, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, - 0x22, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x3c, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x20, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, - 0x50, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x65, - 0x78, 0x74, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x62, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, - 0x4f, 0x53, 0x28, 0x29, 0x3e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3c, - 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, - 0x6c, 0x3e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x69, 0x64, 0x3d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, + 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, + 0x52, 0x4f, 0x53, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x3e, 0x4e, 0x6f, + 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x3e, 0x31, 0x39, 0x32, 0x2e, 0x31, 0x36, 0x38, 0x2e, - 0x31, 0x2e, 0x31, 0x30, 0x30, 0x3a, 0x38, 0x38, 0x38, 0x38, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, - 0x3c, 0x68, 0x32, 0x3e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, - 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, - 0x63, 0x6b, 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3e, 0x43, 0x6c, - 0x65, 0x61, 0x72, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, - 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x74, - 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, - 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, - 0x68, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, - 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, - 0x55, 0x55, 0x49, 0x44, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, - 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, - 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x64, 0x3d, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, - 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, - 0x32, 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x69, 0x64, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x69, 0x64, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, - 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, - 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4d, 0x69, 0x6e, 0x20, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, - 0x68, 0x3e, 0x43, 0x50, 0x55, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, - 0x68, 0x3e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, - 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x43, 0x6f, 0x72, 0x65, 0x3c, + 0x66, 0x69, 0x67, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, + 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x3e, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, + 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x49, 0x50, 0x20, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x69, 0x64, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, + 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x50, 0x6f, 0x72, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, + 0x72, 0x6f, 0x73, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, 0x3e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, + 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, + 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3e, 0x31, + 0x39, 0x32, 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x31, 0x2e, 0x31, 0x30, 0x30, + 0x3a, 0x38, 0x38, 0x38, 0x38, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, + 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x3c, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x28, 0x29, 0x3e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x3c, 0x2f, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x61, 0x73, 0x6b, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 0x6d, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x55, 0x55, 0x49, 0x44, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x69, 0x64, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, - 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2d, 0x63, 0x61, 0x72, - 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x66, 0x69, 0x6c, 0x65, - 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, - 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, - 0x3d, 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, - 0x28, 0x29, 0x3e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, - 0x54, 0x61, 0x73, 0x6b, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x73, 0x20, - 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3c, 0x2f, - 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x3d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, + 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3c, 0x2f, + 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x68, + 0x65, 0x61, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, + 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, + 0x74, 0x68, 0x3e, 0x4d, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x43, 0x50, 0x55, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x43, 0x6f, 0x72, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, + 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x64, 0x3d, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x3e, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x2d, 0x69, 0x70, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, - 0x69, 0x70, 0x3e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x50, - 0x3a, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x2d, 0x69, 0x70, 0x20, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x3d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x29, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, - 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x61, - 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x3e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x41, 0x6e, 0x61, - 0x6c, 0x6f, 0x67, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, - 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x27, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, - 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, 0x33, 0x2c, 0x20, 0x31, 0x35, - 0x30, 0x2c, 0x20, 0x32, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, - 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, - 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, - 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, - 0x30, 0x2c, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, - 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, - 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, + 0x32, 0x3e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x3c, + 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x67, 0x65, 0x74, 0x55, + 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x3e, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x42, + 0x6f, 0x61, 0x72, 0x64, 0x27, 0x73, 0x20, 0x55, 0x52, 0x44, 0x46, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x73, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, + 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x3e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x50, 0x3a, 0x3c, 0x2f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, + 0x64, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x20, + 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, + 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6c, 0x61, + 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x69, 0x64, + 0x3d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, + 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, + 0x66, 0x33, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, + 0x28, 0x33, 0x33, 0x2c, 0x20, 0x31, 0x35, 0x30, 0x2c, 0x20, 0x32, 0x34, + 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, + 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, + 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, + 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, + 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, + 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, + 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x4d, 0x61, 0x74, + 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, + 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, - 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, - 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, - 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, - 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, - 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, - 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, - 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, - 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x2d, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, - 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, - 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, - 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, - 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, - 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, - 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, - 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2d, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, - 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, - 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, - 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, - 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, - 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, - 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, - 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x20, 0x49, 0x4d, 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, - 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x3d, 0x6e, - 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, - 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x3d, 0x6e, - 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, - 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x3d, 0x6e, - 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, - 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, - 0x7b, 0x78, 0x3a, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, - 0x2c, 0x79, 0x3a, 0x27, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, - 0x2c, 0x7a, 0x3a, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x27, - 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, - 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, - 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, - 0x28, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x58, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, - 0x73, 0x68, 0x28, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, - 0x70, 0x75, 0x73, 0x68, 0x28, 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, - 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x3d, 0x34, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, - 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, - 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, - 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, - 0x31, 0x29, 0x2f, 0x32, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, - 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x64, 0x61, 0x74, + 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, + 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, + 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, + 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x6e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, - 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, - 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, - 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, - 0x6c, 0x65, 0x3d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, - 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, - 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x47, - 0x72, 0x69, 0x64, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2c, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, - 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x5a, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x72, 0x61, 0x77, 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, - 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, - 0x68, 0x3d, 0x31, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x73, 0x3d, 0x5b, 0x2d, 0x31, 0x2c, 0x30, 0x2c, 0x31, - 0x5d, 0x3b, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x2e, 0x66, 0x6f, 0x72, - 0x45, 0x61, 0x63, 0x68, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3d, 0x3e, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2b, - 0x31, 0x29, 0x2f, 0x32, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, - 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, - 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x64, - 0x72, 0x61, 0x77, 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x38, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, - 0x74, 0x68, 0x3d, 0x34, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x32, - 0x30, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, - 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, - 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, - 0x20, 0x30, 0x2e, 0x38, 0x29, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, - 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x74, 0x28, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, - 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x33, 0x2b, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x2c, 0x69, 0x74, - 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x61, 0x78, 0x65, 0x73, 0x3d, 0x5b, 0x7b, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x58, 0x27, 0x2c, 0x63, 0x6f, 0x6c, - 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x73, 0x2e, 0x78, 0x7d, 0x2c, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x3a, 0x27, 0x59, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, - 0x7d, 0x2c, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x5a, 0x27, - 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x7a, 0x7d, 0x5d, 0x3b, 0x61, - 0x78, 0x65, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, - 0x28, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x2a, 0x69, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x69, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, - 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2b, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2f, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2b, 0x32, 0x35, 0x2c, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x61, 0x78, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, - 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x30, 0x30, 0x30, 0x27, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, - 0x32, 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, - 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x54, 0x65, 0x78, 0x74, 0x28, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x2c, 0x78, 0x2b, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x2f, 0x32, 0x2b, 0x34, 0x29, 0x3b, 0x7d, 0x29, 0x3b, - 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x48, 0x65, 0x61, - 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x49, 0x4d, + 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, @@ -1017,21 +827,19 @@ const unsigned char _index_html[] = { 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, - 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, - 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x30, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, 0x37, 0x36, - 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x38, 0x30, 0x2c, 0x20, 0x30, - 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, - 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, - 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x3b, 0x74, 0x68, 0x69, + 0x64, 0x61, 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, 0x7b, 0x78, 0x3a, 0x27, 0x23, + 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x2c, 0x79, 0x3a, 0x27, 0x23, + 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, 0x2c, 0x7a, 0x3a, 0x27, 0x23, + 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x27, 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, @@ -1050,49 +858,30 @@ const unsigned char _index_html[] = { 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x78, 0x2c, 0x79, + 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x79, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, - 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, - 0x70, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, - 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x73, - 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, - 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, - 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, - 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, - 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, - 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, + 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, @@ -1101,35 +890,277 @@ const unsigned char _index_html[] = { 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, - 0x31, 0x3b, 0x5b, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x31, 0x5d, 0x2e, - 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, - 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, - 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, - 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, - 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, - 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, - 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x36, 0x36, 0x36, 0x27, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x30, - 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, - 0x66, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x41, - 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x3d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x2a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2f, - 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x28, 0x31, 0x29, 0x2b, 0x22, 0x6b, 0x42, 0x22, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x28, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x34, - 0x2c, 0x79, 0x2d, 0x32, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, + 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x31, 0x29, 0x2f, 0x32, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2f, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, + 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, + 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, + 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, + 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, + 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, + 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, + 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x58, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x59, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x7a, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, + 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, + 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x3d, + 0x5b, 0x2d, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x5d, 0x3b, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, + 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2b, 0x31, 0x29, 0x2f, 0x32, 0x2a, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, + 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, + 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3d, 0x38, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x34, 0x30, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x32, 0x30, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, + 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x38, 0x29, + 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65, + 0x63, 0x74, 0x28, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x2a, 0x33, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2a, 0x32, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, + 0x78, 0x65, 0x73, 0x3d, 0x5b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, + 0x27, 0x58, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x78, 0x7d, + 0x2c, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x59, 0x27, 0x2c, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x7d, 0x2c, 0x7b, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x5a, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x73, 0x2e, 0x7a, 0x7d, 0x5d, 0x3b, 0x61, 0x78, 0x65, 0x73, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x61, 0x78, 0x69, 0x73, + 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x78, 0x3d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, + 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x69, 0x2b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x69, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, + 0x2b, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, + 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x78, 0x2b, 0x32, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, + 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x61, 0x78, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x27, 0x23, 0x30, 0x30, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x32, 0x70, 0x78, 0x20, 0x73, + 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x28, + 0x61, 0x78, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x78, + 0x2b, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, + 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, + 0x2b, 0x34, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, + 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, + 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, + 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, + 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, + 0x72, 0x67, 0x62, 0x61, 0x28, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x37, 0x35, + 0x2c, 0x20, 0x38, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, + 0x33, 0x36, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, + 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, + 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, + 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, + 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, + 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, + 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, + 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, + 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, + 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, + 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x5b, 0x30, 0x2c, + 0x30, 0x2e, 0x35, 0x2c, 0x31, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x2d, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x27, 0x23, 0x36, 0x36, 0x36, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, + 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, + 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, + 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x2b, + 0x22, 0x6b, 0x42, 0x22, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x54, 0x65, 0x78, 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x34, 0x2c, 0x79, 0x2d, 0x32, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, + 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, + 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, + 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, @@ -1148,1041 +1179,1022 @@ const unsigned char _index_html[] = { 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, - 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, - 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, - 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, - 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, - 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, - 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, - 0x31, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, - 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, - 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, - 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, - 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, - 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, - 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, - 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, - 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, - 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, 0x65, 0x74, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x61, 0x74, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x70, - 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x27, 0x27, 0x3b, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x77, - 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x74, - 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x3b, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x27, 0x2b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2b, 0x22, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x2e, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, - 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x28, 0x69, 0x70, 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x3d, 0x69, 0x70, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, - 0x29, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x2c, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x29, 0x3b, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, - 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, - 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, - 0x61, 0x70, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, - 0x61, 0x29, 0x0a, 0x7b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x29, 0x0a, 0x7b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x63, 0x74, + 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, + 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, + 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, + 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3e, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x50, 0x3d, 0x27, 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x77, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x27, 0x29, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, + 0x27, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x2b, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2b, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x22, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, + 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x28, 0x69, 0x70, + 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x69, + 0x70, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, + 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x50, 0x27, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x50, 0x29, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x69, + 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x72, 0x6f, 0x73, 0x29, 0x0a, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x2d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, + 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, 0x29, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x2b, 0x22, 0x3a, 0x22, + 0x2b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, + 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, + 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x70, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, - 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, - 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x2e, - 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x27, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, - 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3f, 0x27, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3a, 0x27, 0x4e, 0x6f, 0x74, - 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3b, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, - 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x74, 0x72, - 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, - 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, - 0x65, 0x28, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x27, 0x2c, 0x21, 0x64, + 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x3f, 0x27, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x27, 0x3a, 0x27, 0x4e, 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x28, 0x27, 0x74, 0x72, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, - 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, - 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x4a, 0x53, 0x4f, - 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x4a, 0x53, 0x4f, 0x4e, - 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x29, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x29, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x74, 0x61, - 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x6d, - 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, - 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, - 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x27, 0x2c, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, + 0x27, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, + 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x29, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x7b, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x61, 0x73, + 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3d, 0x74, 0x61, 0x73, - 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, - 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3b, 0x74, 0x61, 0x73, 0x6b, - 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x3d, 0x28, 0x74, 0x61, 0x73, - 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x2a, 0x31, - 0x30, 0x30, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, - 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x62, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, - 0x63, 0x2d, 0x61, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x29, 0x3b, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, - 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, - 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x3d, 0x3d, 0x3d, 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, - 0x36, 0x34, 0x37, 0x29, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x22, 0x3b, 0x7d, 0x7d, 0x29, + 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, + 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x63, 0x70, 0x75, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, + 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, + 0x70, 0x75, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, + 0x70, 0x63, 0x3d, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, + 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, - 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, - 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x74, + 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, + 0x62, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2d, 0x61, 0x2e, 0x63, + 0x70, 0x75, 0x5f, 0x70, 0x63, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x3d, + 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x29, 0x7b, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x22, 0x41, + 0x6e, 0x79, 0x22, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, + 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x42, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, + 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x29, 0x7d, 0x42, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, - 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, - 0x5f, 0x70, 0x63, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x25, 0x3c, 0x2f, - 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, - 0x6b, 0x2e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x7d, 0x3c, - 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, - 0x3e, 0x60, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, - 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x3d, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x70, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, - 0x70, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, - 0x70, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, - 0x3e, 0x46, 0x72, 0x65, 0x65, 0x20, 0x48, 0x65, 0x61, 0x70, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, - 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x3c, - 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x28, 0x6d, 0x69, 0x6e, 0x3a, 0x24, - 0x7b, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, - 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x29, 0x3c, 0x2f, - 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x67, 0x28, 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, + 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, + 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, + 0x61, 0x70, 0x42, 0x61, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, + 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, + 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, + 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x3b, 0x68, 0x65, 0x61, + 0x70, 0x42, 0x61, 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, + 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x20, 0x48, 0x65, 0x61, 0x70, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x70, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, + 0x7b, 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, + 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3e, 0x28, 0x6d, 0x69, 0x6e, 0x3a, 0x24, 0x7b, 0x28, 0x6d, 0x69, 0x6e, + 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, + 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, + 0x29, 0x7d, 0x6b, 0x42, 0x29, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x60, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, + 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, + 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x6c, - 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x68, 0x65, 0x61, - 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x27, - 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, - 0x6e, 0x65, 0x77, 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x28, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, - 0x27, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, - 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x68, 0x65, - 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, - 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, - 0x3b, 0x7d, 0x0a, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, - 0x61, 0x70, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, - 0x70, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, - 0x70, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, - 0x61, 0x74, 0x61, 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x2d, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x3b, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x61, - 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, 0x29, 0x2e, - 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, - 0x22, 0x4c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, - 0x47, 0x72, 0x69, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x73, 0x2d, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, - 0x61, 0x70, 0x28, 0x29, 0x3b, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, - 0x72, 0x6f, 0x6d, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, - 0x72, 0x69, 0x64, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x3d, 0x63, 0x68, 0x69, - 0x6c, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, - 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, - 0x64, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x29, 0x3b, 0x7d, 0x29, 0x3b, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, - 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, - 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, - 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, - 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, - 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, - 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, - 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, - 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, - 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, - 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, - 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, - 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, - 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, - 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, - 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, - 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, - 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, - 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x30, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, - 0x61, 0x63, 0x68, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, 0x3e, - 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, - 0x69, 0x76, 0x3d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x21, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, - 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, - 0x69, 0x76, 0x27, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, - 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x3d, 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x69, 0x74, 0x65, - 0x6d, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, - 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, - 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, + 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x48, + 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x68, 0x65, 0x61, + 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, + 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x73, 0x65, + 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x2c, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x6d, 0x69, 0x6e, + 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x7d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x29, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x4c, 0x61, 0x73, 0x74, + 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x22, 0x2b, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x3d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, + 0x64, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x49, 0x64, 0x3d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, + 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x2c, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, + 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, + 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x7d, 0x7d, + 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x27, 0x3b, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, - 0x47, 0x72, 0x69, 0x64, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, - 0x69, 0x76, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, 0x3d, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, - 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, - 0x74, 0x6d, 0x6c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x69, 0x73, 0x49, 0x4d, 0x55, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, - 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, - 0x26, 0x26, 0x27, 0x78, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x79, - 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x7a, 0x27, 0x69, 0x6e, 0x20, + 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x7d, + 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x44, 0x69, 0x76, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x27, + 0x27, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, 0x4d, 0x55, + 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x27, 0x78, 0x27, + 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x79, 0x27, 0x69, 0x6e, 0x20, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, + 0x26, 0x27, 0x7a, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x69, + 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, + 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, - 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, - 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, - 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, - 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, - 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, - 0x75, 0x65, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, + 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, + 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, + 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, + 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, + 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x60, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, + 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, + 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, + 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, + 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x60, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, - 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, - 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, - 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, - 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, - 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, - 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3d, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x73, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, + 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3d, 0x3d, 0x3d, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0x69, - 0x66, 0x28, 0x21, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x3b, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, - 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, - 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x7d, 0x65, 0x6c, - 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, - 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3b, 0x7d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, - 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3b, 0x6c, 0x65, 0x74, - 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, - 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x26, 0x26, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x27, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, - 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x63, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x21, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, - 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x6c, 0x65, 0x74, - 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, - 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x69, 0x66, - 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x4d, 0x55, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x60, 0x3b, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, + 0x74, 0x6d, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, + 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, + 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, + 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x3d, 0x27, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x3b, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x3e, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x2c, 0x7b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x3a, - 0x33, 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x31, 0x2e, - 0x30, 0x29, 0x2c, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x30, - 0x2e, 0x30, 0x29, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, 0x73, 0x65, 0x74, - 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x2c, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, - 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, 0x73, - 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, - 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x79, 0x2c, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x7a, 0x29, + 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x21, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x26, 0x26, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, + 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, + 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x49, 0x4d, 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x29, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6e, 0x61, 0x6c, + 0x6f, 0x67, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x7b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x3a, 0x33, 0x30, 0x2c, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x63, 0x65, 0x69, 0x6c, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x6d, 0x69, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x7d, 0x29, + 0x3b, 0x7d, 0x0a, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, + 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, - 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, - 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x44, 0x69, 0x76, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, - 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x6d, - 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, 0x3e, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x3d, 0x3d, 0x3d, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x29, 0x7b, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, - 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x73, 0x68, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x64, 0x61, 0x73, - 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x29, 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x74, 0x72, - 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, - 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, + 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x79, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x7a, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2c, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3d, 0x3e, 0x7b, 0x69, + 0x66, 0x28, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x3d, 0x3e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x69, 0x64, 0x3d, 0x3d, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, + 0x64, 0x29, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, + 0x72, 0x69, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x29, + 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, + 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, - 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x6f, 0x70, 0x43, 0x61, - 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, - 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, - 0x64, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, - 0x27, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, - 0x72, 0x64, 0x27, 0x3b, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x44, 0x69, 0x76, 0x2e, 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x28, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x3b, 0x7d, 0x0a, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x73, 0x74, 0x65, 0x70, - 0x3d, 0x3e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x29, - 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2f, 0x0a, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x29, 0x3b, 0x74, 0x6f, - 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, - 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x68, 0x32, 0x3e, 0x24, 0x7b, 0x64, + 0x72, 0x28, 0x27, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x29, 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, + 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, + 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, + 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x63, 0x61, 0x72, 0x64, + 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x64, + 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, + 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, 0x6f, 0x70, 0x43, + 0x61, 0x72, 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x73, 0x74, 0x65, + 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x2f, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, + 0x65, 0x70, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2a, + 0x31, 0x30, 0x30, 0x29, 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, + 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, + 0x3c, 0x68, 0x32, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x27, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, + 0x3e, 0x20, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, + 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2d, 0x62, 0x61, 0x72, 0x22, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x24, + 0x7b, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x7d, 0x25, 0x22, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x24, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x73, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x75, 0x75, 0x69, + 0x64, 0x22, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x3c, 0x62, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, - 0x67, 0x2d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x62, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x20, 0x57, 0x61, 0x69, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x50, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x68, 0x32, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e, + 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x2d, 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x3e, 0x24, + 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2d, - 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3a, 0x20, 0x24, 0x7b, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x7d, 0x25, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, - 0x73, 0x6b, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x69, 0x6d, - 0x65, 0x3a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, - 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, - 0x6b, 0x2d, 0x75, 0x75, 0x69, 0x64, 0x22, 0x3e, 0x3c, 0x73, 0x6d, 0x61, - 0x6c, 0x6c, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x49, 0x44, - 0x3a, 0x3c, 0x62, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x3c, 0x2f, - 0x62, 0x3e, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x74, - 0x65, 0x70, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x20, 0x24, 0x7b, - 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x3f, 0x20, - 0x27, 0x64, 0x6f, 0x6e, 0x65, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x7d, 0x22, 0x3e, 0x3c, 0x73, 0x70, - 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, - 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x24, - 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x3f, 0x27, - 0xe2, 0x9c, 0x93, 0x27, 0x3a, 0x27, 0xe2, 0x97, 0x8b, 0x27, 0x7d, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, - 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x7d, 0x3c, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7c, 0x7c, 0x73, - 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, - 0x74, 0x65, 0x70, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x27, 0x2b, + 0x73, 0x74, 0x65, 0x70, 0x20, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, + 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x3f, 0x20, 0x27, 0x64, 0x6f, 0x6e, 0x65, + 0x27, 0x20, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x27, 0x7d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, + 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x3f, 0x27, 0xe2, 0x9c, 0x93, 0x27, 0x3a, + 0x27, 0xe2, 0x97, 0x8b, 0x27, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x28, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, - 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, - 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, - 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, - 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, - 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, - 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, - 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, - 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, - 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, - 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, - 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, - 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, - 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, - 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, - 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x3d, + 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, + 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, + 0x20, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, + 0x27, 0x7d, 0x0a, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, + 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x28, 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, + 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, + 0x66, 0x28, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, + 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, + 0x43, 0x61, 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, - 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, - 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, - 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, - 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, - 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, - 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, - 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, - 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, - 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, - 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, - 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, - 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, - 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, - 0x28, 0x5c, 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6c, 0x69, - 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x65, 0x67, - 0x65, 0x78, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, - 0x61, 0x72, 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, - 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, 0x6e, 0x65, - 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, - 0x6c, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, 0x2c, 0x74, - 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, - 0x6e, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, - 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5d, 0x3d, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x49, 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, - 0x61, 0x6e, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, - 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, 0x29, 0x3d, - 0x3d, 0x3d, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, + 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x3f, 0x35, 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, + 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, + 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, + 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, + 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, + 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x29, 0x7b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x67, 0x28, 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, + 0x22, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x22, 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, + 0x78, 0x74, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, + 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, + 0x69, 0x6e, 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, + 0x69, 0x6d, 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, + 0x6e, 0x65, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, + 0x65, 0x67, 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, + 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, + 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, + 0x29, 0x2c, 0x28, 0x5c, 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, + 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, + 0x65, 0x67, 0x65, 0x78, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, + 0x2c, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x69, 0x73, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x29, - 0x7d, 0x3b, 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, 0x6f, 0x72, - 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, 0x2e, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, 0x2e, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, - 0x79, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, - 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, - 0x6f, 0x77, 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, - 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, - 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x2e, 0x74, - 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x73, 0x3c, - 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x3f, - 0x27, 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, 0xa4, 0x96, - 0x27, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, - 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, 0x75, - 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, 0x29, - 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, - 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x7d, - 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, - 0x60, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, - 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, 0x2c, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, - 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x70, - 0x7c, 0x7c, 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, - 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, - 0x6f, 0x6e, 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, 0x53, - 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, - 0x28, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, 0x69, - 0x70, 0x2c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, 0x6f, + 0x5d, 0x3d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x48, + 0x75, 0x6d, 0x61, 0x6e, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, + 0x74, 0x28, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, + 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x28, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x29, 0x7d, 0x3b, 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, + 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, + 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, 0x64, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, + 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, + 0x77, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, + 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, + 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, + 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, + 0x6d, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, + 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, + 0x73, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, + 0x6e, 0x3f, 0x27, 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, + 0xa4, 0x96, 0x27, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, + 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, + 0x38, 0x29, 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, + 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x64, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x60, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, + 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, - 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, - 0x27, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, - 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x28, 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, - 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x3f, 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x3b, 0x7d, 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, + 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, + 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, + 0x69, 0x70, 0x7c, 0x7c, 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, + 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x28, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, + 0x3a, 0x69, 0x70, 0x2c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, + 0x72, 0x74, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, + 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, + 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, + 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x28, 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, + 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, + 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x3f, 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, + 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, + 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, + 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, + 0x65, 0x78, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x27, 0x61, 0x27, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, + 0x72, 0x65, 0x66, 0x27, 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, + 0x27, 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, + 0x74, 0x29, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, + 0x27, 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, + 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, + 0x29, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, + 0x6f, 0x64, 0x79, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, + 0x65, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x50, 0x2b, 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, - 0x67, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, - 0x6c, 0x6f, 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x50, 0x2b, 0x22, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, + 0x75, 0x72, 0x64, 0x66, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, - 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, - 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, - 0x3b, 0x7d, 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, 0x2b, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, 0x78, - 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x61, - 0x27, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, 0x65, - 0x66, 0x27, 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, 0x2b, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, - 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, 0x6c, - 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, 0x6e, - 0x6f, 0x6e, 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, - 0x64, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, - 0x79, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, - 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, - 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, - 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, - 0x22, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, 0x72, - 0x64, 0x66, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, 0x55, - 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, - 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, - 0x28, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, 0x78, - 0x74, 0x29, 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x28, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x2e, 0x75, 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, - 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, - 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, 0x2b, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, - 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x74, - 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, - 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, - 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, - 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, 0x2f, - 0x77, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, - 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, 0x6e, - 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, - 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, 0x72, - 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, - 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, + 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, + 0x66, 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, + 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, + 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x7b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, + 0x65, 0x78, 0x74, 0x29, 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x28, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x2e, 0x75, 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, + 0x74, 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, + 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, + 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, + 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x3f, 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, + 0x27, 0x2f, 0x77, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, + 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, + 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, + 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, + 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, - 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, - 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, - 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, - 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x27, - 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x74, - 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, - 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, - 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, - 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, - 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x77, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x7d, - 0x3b, 0x7d, 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x22, - 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, - 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, 0x4f, - 0x4d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, - 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, - 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, - 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, - 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x49, 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, - 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x3d, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x28, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, 0x29, - 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x3c, - 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, - 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, + 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, + 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, + 0x73, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, + 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, + 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, + 0x30, 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x3d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x3b, 0x7d, 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, + 0x44, 0x4f, 0x4d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, + 0x3d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, + 0x49, 0x50, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, + 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, + 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x3d, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x28, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, + 0x30, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, + 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, + 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e }; -unsigned int _index_html_len = 26086; +unsigned int _index_html_len = 26232; #endif /* INDEX_H */ diff --git a/idf/taskboard/web_interfaces/index.html b/idf/taskboard/web_interfaces/index.html index f25dc39..f00fc37 100644 --- a/idf/taskboard/web_interfaces/index.html +++ b/idf/taskboard/web_interfaces/index.html @@ -271,6 +271,8 @@ padding: 10px; background: #f8f8f8; border-radius: 4px; + flex-wrap: wrap; + padding-left: 2.2rem; } .step.done { background: #e8f5e9; @@ -281,6 +283,7 @@ .step-status { font-size: 1.2em; color: #666; + margin-left: -1.5rem; } .step.done .step-status { color: #4caf50; @@ -1229,6 +1232,7 @@

${data.current_task.name} ${step.done ? '✓' : '○'} ${step.sensor} ${step.finish_time || step.finish_time == 0.0 ? '' + step.finish_time.toFixed(2) + ' s' : ''} + ${step.score || step.score == 0.0 ? '·' + step.score.toFixed(0) + '%' : ''} `).join('')} From 2af1da55d62840e452044ab7eace3d3da335cf00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 9 Apr 2025 14:22:59 +0000 Subject: [PATCH 03/35] Add touch screen sensor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/board/TaskBoardDriver_v1.hpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index 0c5aea4..9db2399 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -227,6 +227,27 @@ struct TaskBoardDriver_v1 : return red_button->read(); }); + Sensor* touch_screen_position = new Sensor("TOUCH_SCREEN_POSITION", [&]() + { + SensorMeasurement::Vector3 values; + m5::Touch_Class::touch_detail_t touch_detail = hardware_low_level_controller_.m5_unified.Touch.getDetail(0); + if (touch_detail.isPressed()) + { + m5gfx::touch_point_t touch_position = hardware_low_level_controller_.m5_unified.Touch.getTouchPointRaw(0); + values.x = touch_position.x; + values.y = touch_position.y; + values.z = 0; + } + else + { + values.x = -1; + values.y = -1; + values.z = -1; + } + + return SensorMeasurement(values); + }); + // Store sensors sensors_.push_back(blue_button); sensors_.push_back(red_button); @@ -249,6 +270,7 @@ struct TaskBoardDriver_v1 : sensors_.push_back(probe_goal); sensors_.push_back(fader_trigger_blue_button); sensors_.push_back(red_button_counter); + sensors_.push_back(touch_screen_position); // Initial update update(); From 8e70a55ae78c560acb6a4fa1453db831a79c4628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 10 Apr 2025 08:54:12 +0000 Subject: [PATCH 04/35] Add FollowPath task step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../robothon_taskboard_msgs/msg/TaskStep.msg | 1 + .../main/hal/ClueScreenController.hpp | 10 ++ idf/taskboard/main/hal/ScreenController.hpp | 23 ++++ .../main/hal/board/TaskBoardDriver_v1.hpp | 2 + idf/taskboard/main/microros/MicroROSTypes.hpp | 3 + idf/taskboard/main/task/TaskStep.hpp | 1 + .../main/task/TaskStepFollowPath.hpp | 120 ++++++++++++++++++ 7 files changed, 160 insertions(+) create mode 100644 idf/taskboard/main/task/TaskStepFollowPath.hpp diff --git a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg index 5890d36..bb179f6 100644 --- a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg +++ b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg @@ -2,6 +2,7 @@ uint8 TASK_STEP_TYPE_UNKNOWN = 0 uint8 TASK_STEP_TYPE_EQUAL = 1 uint8 TASK_STEP_TYPE_EQUAL_RANDOM = 2 uint8 TASK_STEP_TYPE_GREATER_EQUAL = 3 +uint8 TASK_STEP_TYPE_FOLLOW_PATH = 4 string sensor_name uint8 type diff --git a/idf/taskboard/main/hal/ClueScreenController.hpp b/idf/taskboard/main/hal/ClueScreenController.hpp index 770826b..6932133 100644 --- a/idf/taskboard/main/hal/ClueScreenController.hpp +++ b/idf/taskboard/main/hal/ClueScreenController.hpp @@ -32,6 +32,16 @@ struct ClueScreenController const float& current_value, const float& target_value) = 0; + /* + * @brief Displays a path clue without feedback + * + * @param expected_path Vector of SensorMeasurement objects representing the expected path + * @param measured_path Vector of SensorMeasurement objects representing the measured path + */ + virtual void print_task_clue_path( + const std::vector& expected_path, + const std::vector& measured_path) = 0; + /** * @brief Clears the screen of any displayed clues */ diff --git a/idf/taskboard/main/hal/ScreenController.hpp b/idf/taskboard/main/hal/ScreenController.hpp index ac460b0..5914e2f 100644 --- a/idf/taskboard/main/hal/ScreenController.hpp +++ b/idf/taskboard/main/hal/ScreenController.hpp @@ -160,6 +160,29 @@ struct ScreenController : item_height_offset, cursor_width, item_height, TFT_BLUE); } + /// Virtual method implementation + void print_task_clue_path( + const std::vector& expected_path, + const std::vector& measured_path) override + { + display_.drawCircle(expected_path[0].get_vector3().x, expected_path[0].get_vector3().y, 6, TFT_RED); + + for (size_t i = 1; i < expected_path.size(); i++) + { + display_.drawLine(expected_path[i - 1].get_vector3().x, expected_path[i - 1].get_vector3().y, expected_path[i].get_vector3().x, expected_path[i].get_vector3().y); + } + + if (measured_path.size() > 0) + { + display_.drawCircle(measured_path[0].get_vector3().x, measured_path[0].get_vector3().y, 6, TFT_BLUE); + + for (size_t i = 1; i < measured_path.size(); i++) + { + display_.drawLine(measured_path[i - 1].get_vector3().x, measured_path[i - 1].get_vector3().y, measured_path[i].get_vector3().x, measured_path[i].get_vector3().y, TFT_BLUE); + } + } + } + /// Virtual method implementation void clear_all_task_clue() override { diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index 9db2399..a95ffc0 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -298,6 +299,7 @@ struct TaskBoardDriver_v1 : { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, + new TaskStepFollowPath(*get_sensor_by_name("TOUCH_SCREEN_POSITION")), random_fader_step, new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(true)), diff --git a/idf/taskboard/main/microros/MicroROSTypes.hpp b/idf/taskboard/main/microros/MicroROSTypes.hpp index d75da07..aec98c2 100644 --- a/idf/taskboard/main/microros/MicroROSTypes.hpp +++ b/idf/taskboard/main/microros/MicroROSTypes.hpp @@ -52,6 +52,9 @@ struct MicroROSTypes case ::TaskStep::Type::GREATER_OR_EQUAL: ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_GREATER_EQUAL; break; + case ::TaskStep::Type::FOLLOW_PATH: + ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_FOLLOW_PATH; + break; default: ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_UNKNOWN; break; diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 0cf8609..ad80953 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -140,6 +140,7 @@ struct TaskStep : EQUAL, ///< Sensor value must exactly match target EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target + FOLLOW_PATH, ///< Sensor value must follow a specific path UNKNOWN ///< UndefOined comparison type }; diff --git a/idf/taskboard/main/task/TaskStepFollowPath.hpp b/idf/taskboard/main/task/TaskStepFollowPath.hpp new file mode 100644 index 0000000..9d2ee1b --- /dev/null +++ b/idf/taskboard/main/task/TaskStepFollowPath.hpp @@ -0,0 +1,120 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include + +#include + +/** + * @struct TaskStepFollowPath + * + * @brief Implementation of TaskStep that checks how closely a path is followed + * + * @details Performs trace score evaluation between measured path and desired path + */ +struct TaskStepFollowPath : + public TaskStep +{ + /** + * @brief Constructs a new TaskStepFollowPath object + * + * @param sensor Reference to the sensor to monitor + */ + TaskStepFollowPath( + SensorReader& sensor) + : TaskStep(sensor) + { + TaskStep::type_ = Type::FOLLOW_PATH; + + initializeStep(); + } + + void initializeStep() const + { + constexpr int32_t N_POINTS = 3; + const int32_t w = 320; + const int32_t h = 240; + + step_started_ = false; + + // Generate expected path with N_POINTS random points + expected_path_.clear(); + while (expected_path_.size() < N_POINTS) + { + // Generate random point + SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ + (float) esp_random() * w / UINT32_MAX, + (float) esp_random() * h / UINT32_MAX, + 0.0f + }; + // Check if the point is within acceptable boundaries and distance from the previous point + // if ... + expected_path_.push_back(SensorMeasurement(next_point)); + // end if + } + + // Clear measured path + measured_path_.clear(); + } + + /// Virtual method implementation + bool success() const override + { + const auto sensor_value = sensor_.read(); + bool pressing_screen = (sensor_value.get_vector3().z == 0); + if (!step_started_) + { + step_started_ = pressing_screen; + } + else + { + measured_path_.push_back(sensor_value.get_vector3()); + if (!pressing_screen) + { + initializeStep(); + return true; + } + } + return false; + } + + /// Virtual method implementation + float score() const override + { + float score = 0.0f; + // Implement score function + // ... + return score; + } + + /// Virtual method implementation + SensorMeasurement expected_value() const override + { + return expected_path_[0]; + } + +protected: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + screen_controller.print_task_clue(sensor_.name()); + screen_controller.print_task_clue_path(expected_path_, measured_path_); + } + else + { + reset_clue(); + } + } + + mutable bool step_started_ = 0; + mutable std::vectorexpected_path_ = {}; + mutable std::vectormeasured_path_ = {}; +}; From ed5972bc3f1fb76f3941712c8ef85b9f3fba3eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 10 Apr 2025 13:24:25 +0000 Subject: [PATCH 05/35] Scoring algorithm for FollowPath task steps. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/board/TaskBoardDriver_v1.hpp | 4 +- idf/taskboard/main/task/TaskStep.hpp | 2 +- .../main/task/TaskStepFollowPath.hpp | 56 ++++++++++++++++--- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index a95ffc0..ef6c590 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -237,13 +237,13 @@ struct TaskBoardDriver_v1 : m5gfx::touch_point_t touch_position = hardware_low_level_controller_.m5_unified.Touch.getTouchPointRaw(0); values.x = touch_position.x; values.y = touch_position.y; - values.z = 0; + values.z = 1; } else { values.x = -1; values.y = -1; - values.z = -1; + values.z = 0; } return SensorMeasurement(values); diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index ad80953..fa99976 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -141,7 +141,7 @@ struct TaskStep : EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target FOLLOW_PATH, ///< Sensor value must follow a specific path - UNKNOWN ///< UndefOined comparison type + UNKNOWN ///< Undefined comparison type }; /** diff --git a/idf/taskboard/main/task/TaskStepFollowPath.hpp b/idf/taskboard/main/task/TaskStepFollowPath.hpp index 9d2ee1b..9fa9573 100644 --- a/idf/taskboard/main/task/TaskStepFollowPath.hpp +++ b/idf/taskboard/main/task/TaskStepFollowPath.hpp @@ -51,7 +51,7 @@ struct TaskStepFollowPath : (float) esp_random() * h / UINT32_MAX, 0.0f }; - // Check if the point is within acceptable boundaries and distance from the previous point + // TODO: Check if the point is within acceptable boundaries, and at enough distance from the previous point // if ... expected_path_.push_back(SensorMeasurement(next_point)); // end if @@ -65,17 +65,19 @@ struct TaskStepFollowPath : bool success() const override { const auto sensor_value = sensor_.read(); - bool pressing_screen = (sensor_value.get_vector3().z == 0); + bool pressing_screen = (sensor_value.get_vector3().z != 0); if (!step_started_) { step_started_ = pressing_screen; } else { - measured_path_.push_back(sensor_value.get_vector3()); - if (!pressing_screen) + if (pressing_screen) + { + measured_path_.push_back(sensor_value.get_vector3()); + } + else { - initializeStep(); return true; } } @@ -85,9 +87,47 @@ struct TaskStepFollowPath : /// Virtual method implementation float score() const override { - float score = 0.0f; - // Implement score function - // ... + // Calculate distance between first point of expected path and first point of measured path + float first_distance = std::hypot( + (expected_path_[0].get_vector3().x - measured_path_[0].get_vector3().x), + (expected_path_[0].get_vector3().y - measured_path_[0].get_vector3().y)); + + // Calculate distance between last point of expected path and last point of measured path + float last_distance = std::hypot( + (expected_path_[expected_path_.size() - 1].get_vector3().x - measured_path_[measured_path_.size() - 1].get_vector3().x), + (expected_path_[expected_path_.size() - 1].get_vector3().y - measured_path_[measured_path_.size() - 1].get_vector3().y)); + + // Calculate length of expected path + float expected_length = 0.0f; + for (size_t i = 1; i < expected_path_.size(); i++) + { + expected_length += std::hypot( + (expected_path_[i].get_vector3().x - expected_path_[i - 1].get_vector3().x), + (expected_path_[i].get_vector3().y - expected_path_[i - 1].get_vector3().y)); + } + + // Calculate length of measured path + float measured_length = 0.0f; + for (size_t i = 1; i < measured_path_.size(); i++) + { + measured_length += std::hypot( + (measured_path_[i].get_vector3().x - measured_path_[i - 1].get_vector3().x), + (measured_path_[i].get_vector3().y - measured_path_[i - 1].get_vector3().y)); + } + + // Calculate score based on distances and difference of lenghts + float score = 100.0f + - 50.0*first_distance/hypot(320, 240) + - 50.0*last_distance/hypot(320, 240) + - 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length); + + if (score < 0.0f) + { + score = 0.0f; + } + + initializeStep(); + return score; } From c872b3601a18214c0381b18ad038170557a78e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 10 Apr 2025 14:16:00 +0000 Subject: [PATCH 06/35] Generalize for any screen size. Filter points on path creation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/hal/ScreenController.hpp | 11 ++++--- .../main/hal/board/TaskBoardDriver_v1.hpp | 10 ++++-- .../main/task/TaskStepFollowPath.hpp | 32 +++++++++++++------ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/idf/taskboard/main/hal/ScreenController.hpp b/idf/taskboard/main/hal/ScreenController.hpp index 5914e2f..f8e3008 100644 --- a/idf/taskboard/main/hal/ScreenController.hpp +++ b/idf/taskboard/main/hal/ScreenController.hpp @@ -165,20 +165,23 @@ struct ScreenController : const std::vector& expected_path, const std::vector& measured_path) override { - display_.drawCircle(expected_path[0].get_vector3().x, expected_path[0].get_vector3().y, 6, TFT_RED); + const int32_t w = display_.width(); + const int32_t h = display_.height(); + + display_.fillCircle(expected_path[0].get_vector3().x * w / 100.0f, expected_path[0].get_vector3().y * h / 100.0f, 6, TFT_RED); for (size_t i = 1; i < expected_path.size(); i++) { - display_.drawLine(expected_path[i - 1].get_vector3().x, expected_path[i - 1].get_vector3().y, expected_path[i].get_vector3().x, expected_path[i].get_vector3().y); + display_.drawLine(expected_path[i - 1].get_vector3().x * w / 100.0f, expected_path[i - 1].get_vector3().y * h / 100.0f, expected_path[i].get_vector3().x * w / 100.0f, expected_path[i].get_vector3().y * h / 100.0f); } if (measured_path.size() > 0) { - display_.drawCircle(measured_path[0].get_vector3().x, measured_path[0].get_vector3().y, 6, TFT_BLUE); + display_.fillCircle(measured_path[0].get_vector3().x * w / 100.0f, measured_path[0].get_vector3().y * h / 100.0f, 6, TFT_BLUE); for (size_t i = 1; i < measured_path.size(); i++) { - display_.drawLine(measured_path[i - 1].get_vector3().x, measured_path[i - 1].get_vector3().y, measured_path[i].get_vector3().x, measured_path[i].get_vector3().y, TFT_BLUE); + display_.drawLine(measured_path[i - 1].get_vector3().x * w / 100.0f, measured_path[i - 1].get_vector3().y * h / 100.0f, measured_path[i].get_vector3().x * w / 100.0f, measured_path[i].get_vector3().y * h / 100.0f, TFT_BLUE); } } } diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index ef6c590..c7a32b4 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -230,13 +230,17 @@ struct TaskBoardDriver_v1 : Sensor* touch_screen_position = new Sensor("TOUCH_SCREEN_POSITION", [&]() { + m5gfx::M5GFX& display = hardware_low_level_controller_.m5_unified.Display; + const int32_t w = display.width(); + const int32_t h = display.height(); + SensorMeasurement::Vector3 values; m5::Touch_Class::touch_detail_t touch_detail = hardware_low_level_controller_.m5_unified.Touch.getDetail(0); if (touch_detail.isPressed()) { m5gfx::touch_point_t touch_position = hardware_low_level_controller_.m5_unified.Touch.getTouchPointRaw(0); - values.x = touch_position.x; - values.y = touch_position.y; + values.x = touch_position.x * 100.0f / w; + values.y = touch_position.y * 100.0f / h; values.z = 1; } else @@ -403,7 +407,7 @@ struct TaskBoardDriver_v1 : HardwareLowLevelController& hardware_low_level_controller_; ///< Reference to hardware interface std::vector sensors_; ///< List of all board sensors std::string unique_id_ = "TaskBoard_v1"; ///< Board identifier - std::string unique_ssid_ = "Robothon Task Board"; ///< Board identifier + std::string unique_ssid_ = "Robothon Task Board"; ///< Board identifier Task* default_task_; ///< Default main task sequence Task* default_precondition_task_; ///< Default precondition task sequence diff --git a/idf/taskboard/main/task/TaskStepFollowPath.hpp b/idf/taskboard/main/task/TaskStepFollowPath.hpp index 9fa9573..7845b44 100644 --- a/idf/taskboard/main/task/TaskStepFollowPath.hpp +++ b/idf/taskboard/main/task/TaskStepFollowPath.hpp @@ -36,8 +36,6 @@ struct TaskStepFollowPath : void initializeStep() const { constexpr int32_t N_POINTS = 3; - const int32_t w = 320; - const int32_t h = 240; step_started_ = false; @@ -47,14 +45,30 @@ struct TaskStepFollowPath : { // Generate random point SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ - (float) esp_random() * w / UINT32_MAX, - (float) esp_random() * h / UINT32_MAX, + (float) esp_random() * 100.0f / UINT32_MAX, + (float) esp_random() * 100.0f / UINT32_MAX, 0.0f }; - // TODO: Check if the point is within acceptable boundaries, and at enough distance from the previous point - // if ... + // Check if the point is too close to the edges of the screen + if (next_point.x < 5.0f || next_point.x > 95.0f || + next_point.y < 30.0f || next_point.y > 90.0f) + { + // Do not add + continue; + } + // Check if the point is too close to the last point + if (!expected_path_.empty()) + { + const auto last_point = expected_path_.back().get_vector3(); + if (std::hypot( + (last_point.x - next_point.x), + (last_point.y - next_point.y)) < 30.0f) + { + // Do not add + continue; + } + } expected_path_.push_back(SensorMeasurement(next_point)); - // end if } // Clear measured path @@ -117,8 +131,8 @@ struct TaskStepFollowPath : // Calculate score based on distances and difference of lenghts float score = 100.0f - - 50.0*first_distance/hypot(320, 240) - - 50.0*last_distance/hypot(320, 240) + - 50.0*first_distance/141.42f + - 50.0*last_distance/141.42f - 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length); if (score < 0.0f) From 7a58e541344b34856ee9842256030a131e43ff9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Mon, 14 Apr 2025 14:13:43 +0000 Subject: [PATCH 07/35] Add x vs y graph for the touch screen position MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/network/webpages/web_index.h | 2435 +++++++++-------- idf/taskboard/web_interfaces/index.html | 105 +- 2 files changed, 1404 insertions(+), 1136 deletions(-) diff --git a/idf/taskboard/main/network/webpages/web_index.h b/idf/taskboard/main/network/webpages/web_index.h index 43bffe2..ae868c9 100644 --- a/idf/taskboard/main/network/webpages/web_index.h +++ b/idf/taskboard/main/network/webpages/web_index.h @@ -2,9 +2,9 @@ #define INDEX_H /* - * Original size: 50,077 bytes - * Minified size: 26,221 bytes - * Saved: 47.6% + * Original size: 53,718 bytes + * Minified size: 28,197 bytes + * Saved: 47.5% */ const unsigned char _index_html[] = { @@ -1009,132 +1009,316 @@ const unsigned char _index_html[] = { 0x2b, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, 0x2b, 0x34, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, - 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, - 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, - 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, - 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, - 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, - 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, - 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, - 0x72, 0x67, 0x62, 0x61, 0x28, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x37, 0x35, - 0x2c, 0x20, 0x38, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, - 0x33, 0x36, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, - 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, - 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, - 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, - 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, - 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, - 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, - 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, - 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, - 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, - 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x73, 0x73, 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, + 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, + 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, + 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, + 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, + 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, - 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x58, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, + 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, + 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x69, 0x66, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x5b, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3d, + 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x5b, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2a, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x59, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, + 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, + 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x60, 0x72, 0x67, 0x62, + 0x61, 0x28, 0x33, 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, + 0x2c, 0x24, 0x7b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x7d, 0x29, 0x60, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, + 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x61, 0x72, 0x63, 0x28, + 0x78, 0x2c, 0x79, 0x2c, 0x34, 0x2c, 0x30, 0x2c, 0x4d, 0x61, 0x74, 0x68, + 0x2e, 0x50, 0x49, 0x2a, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x30, 0x3b, 0x69, 0x3c, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x69, 0x2b, 0x2b, 0x29, 0x7b, 0x69, + 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, + 0x5b, 0x69, 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x26, 0x26, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x5b, 0x69, 0x2b, 0x31, 0x5d, + 0x3d, 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x78, 0x31, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x58, 0x5b, 0x69, 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, + 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x31, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x69, + 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, 0x30, 0x30, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x32, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x5b, 0x69, 0x2b, 0x31, + 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, 0x30, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x32, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x69, 0x2b, 0x31, 0x5d, + 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, 0x30, 0x30, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x3d, 0x69, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x3d, 0x28, 0x69, 0x2b, 0x31, + 0x29, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, + 0x6e, 0x74, 0x3d, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, + 0x65, 0x6e, 0x74, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x2c, 0x78, 0x32, + 0x2c, 0x79, 0x32, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, + 0x6f, 0x70, 0x28, 0x30, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, + 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, 0x24, 0x7b, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x74, 0x61, 0x72, 0x74, 0x7d, 0x29, + 0x60, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, + 0x28, 0x31, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, 0x33, 0x2c, + 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, 0x24, 0x7b, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x7d, 0x29, 0x60, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, + 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, + 0x6f, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x32, 0x2c, 0x79, + 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x67, 0x72, 0x61, 0x64, 0x69, + 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, + 0x0a, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, + 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, + 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x30, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, + 0x30, 0x2c, 0x30, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x30, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, + 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x48, + 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, + 0x30, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, + 0x37, 0x36, 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x38, 0x30, 0x2c, + 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x3d, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, + 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, + 0x65, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, + 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, - 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, - 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, - 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, - 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, - 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, - 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, - 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, - 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x5b, 0x30, 0x2c, - 0x30, 0x2e, 0x35, 0x2c, 0x31, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, - 0x63, 0x68, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, 0x3e, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x2d, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x27, 0x23, 0x36, 0x36, 0x36, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, - 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, - 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x3d, - 0x27, 0x72, 0x69, 0x67, 0x68, 0x74, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, - 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x2b, - 0x22, 0x6b, 0x42, 0x22, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x54, 0x65, 0x78, 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x34, 0x2c, 0x79, 0x2d, 0x32, 0x29, - 0x3b, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, + 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, + 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, + 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, + 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, + 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x31, 0x3b, 0x5b, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x31, + 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2a, 0x28, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, + 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, + 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, + 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x36, 0x36, 0x36, + 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, + 0x31, 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, + 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x27, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x3d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x2b, 0x22, 0x6b, 0x42, 0x22, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, + 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x2d, 0x34, 0x2c, 0x79, 0x2d, 0x32, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, + 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, + 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, + 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, + 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, + 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, + 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, @@ -1152,1049 +1336,1030 @@ const unsigned char _index_html[] = { 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, - 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, - 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, - 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, - 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, - 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, - 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, - 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, - 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, - 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, - 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, - 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x63, 0x74, - 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, - 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, - 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, - 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, - 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, - 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, - 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, - 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, - 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, - 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x3e, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, + 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, + 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, + 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, + 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, + 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, + 0x3b, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, 0x65, 0x74, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, - 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, - 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x3d, 0x27, 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x77, 0x3d, 0x6e, 0x65, 0x77, 0x20, - 0x44, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, - 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x27, 0x29, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, - 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, - 0x27, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x2b, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2b, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x22, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, - 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, - 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x28, 0x69, 0x70, - 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x69, - 0x70, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, - 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x27, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x50, 0x29, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x3d, - 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x69, - 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, - 0x72, 0x6f, 0x73, 0x29, 0x0a, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x2d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, - 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, 0x29, 0x2e, 0x74, 0x65, + 0x20, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x27, + 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, + 0x6f, 0x77, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x77, + 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x7d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, + 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x3b, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x27, 0x2b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2b, + 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, 0x7d, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x7b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, + 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, + 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x50, 0x28, 0x69, 0x70, 0x29, 0x7b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x69, 0x70, 0x2e, 0x74, 0x72, 0x69, + 0x6d, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, + 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x2c, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x29, 0x3b, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x7d, 0x0a, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, + 0x61, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, + 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x29, 0x0a, + 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x70, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x2b, 0x22, 0x3a, 0x22, - 0x2b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, - 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, - 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, - 0x6f, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x3f, 0x27, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x27, 0x3a, 0x27, 0x4e, 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3f, 0x27, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3a, 0x27, 0x4e, + 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x27, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, + 0x74, 0x72, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, - 0x67, 0x6c, 0x65, 0x28, 0x27, 0x74, 0x72, 0x75, 0x65, 0x27, 0x2c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, - 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x27, 0x2c, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, - 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, - 0x28, 0x27, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, - 0x27, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, - 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, - 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x29, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x3b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x7b, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, - 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, - 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, - 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, - 0x69, 0x6e, 0x64, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, + 0x67, 0x6c, 0x65, 0x28, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x27, 0x2c, + 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, + 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x4a, 0x53, + 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x29, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x26, 0x26, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, + 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, + 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x63, 0x70, 0x75, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, - 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, - 0x70, 0x75, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, - 0x70, 0x63, 0x3d, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, - 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x3b, 0x7d, 0x29, - 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, - 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, - 0x62, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2d, 0x61, 0x2e, 0x63, - 0x70, 0x75, 0x5f, 0x70, 0x63, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, - 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x3d, - 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x29, 0x7b, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x22, 0x41, - 0x6e, 0x79, 0x22, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, - 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, - 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, - 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, - 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x42, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, + 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3d, 0x74, + 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2d, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3b, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x3d, 0x28, 0x74, + 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, + 0x2a, 0x31, 0x30, 0x30, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x62, 0x2e, 0x63, 0x70, 0x75, + 0x5f, 0x70, 0x63, 0x2d, 0x61, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, + 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, + 0x6b, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x3d, 0x32, 0x31, 0x34, 0x37, 0x34, + 0x38, 0x33, 0x36, 0x34, 0x37, 0x29, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x22, 0x3b, 0x7d, + 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, + 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, + 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x42, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, + 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, - 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2e, 0x74, - 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, - 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, - 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, - 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, - 0x61, 0x70, 0x42, 0x61, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, - 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x72, - 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, - 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, - 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x3b, 0x68, 0x65, 0x61, - 0x70, 0x42, 0x61, 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, - 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x69, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, - 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, - 0x20, 0x48, 0x65, 0x61, 0x70, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x7d, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, + 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, + 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x69, 0x6e, + 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x2e, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, - 0x65, 0x61, 0x70, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, - 0x7b, 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, - 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, - 0x3e, 0x28, 0x6d, 0x69, 0x6e, 0x3a, 0x24, 0x7b, 0x28, 0x6d, 0x69, 0x6e, - 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, - 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, - 0x29, 0x7d, 0x6b, 0x42, 0x29, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, - 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x60, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, - 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, - 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, - 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x48, - 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x68, 0x65, 0x61, - 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, - 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x73, 0x65, - 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x2c, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x28, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x6d, 0x69, 0x6e, - 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x7d, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, - 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x29, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, - 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x4c, 0x61, 0x73, 0x74, - 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x22, 0x2b, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x3d, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, - 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, - 0x64, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, - 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, - 0x45, 0x61, 0x63, 0x68, 0x28, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x3e, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x49, 0x64, 0x3d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, - 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, - 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x2c, 0x63, 0x68, 0x69, - 0x6c, 0x64, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, - 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, - 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, - 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, - 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, - 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, - 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, - 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, - 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x7d, 0x7d, - 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x27, 0x3b, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x64, 0x69, + 0x65, 0x61, 0x70, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x20, 0x48, 0x65, 0x61, 0x70, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x66, 0x72, 0x65, + 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, + 0x42, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x28, 0x6d, 0x69, 0x6e, + 0x3a, 0x24, 0x7b, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, + 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x29, + 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, - 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x7d, - 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x44, 0x69, 0x76, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, - 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x27, - 0x27, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, 0x4d, 0x55, - 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x27, 0x78, 0x27, - 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x79, 0x27, 0x69, 0x6e, 0x20, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, - 0x26, 0x27, 0x7a, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x69, - 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, - 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, - 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, - 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, - 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, - 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x60, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x65, + 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, + 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x42, + 0x61, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x68, + 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x28, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, + 0x61, 0x70, 0x27, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, + 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, + 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, + 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, + 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, + 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x72, 0x65, 0x65, + 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, + 0x65, 0x61, 0x70, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, + 0x65, 0x61, 0x70, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x49, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x3b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, + 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, + 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x4c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x3d, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x74, + 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x49, 0x64, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x29, 0x3b, 0x7d, + 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, + 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, + 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, - 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, + 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, + 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, + 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, + 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, + 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, + 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x44, 0x69, 0x76, 0x3d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x21, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x3d, 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x69, + 0x74, 0x65, 0x6d, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, + 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, - 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, - 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, - 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, - 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, - 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, - 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, - 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, - 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, - 0x60, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3d, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x73, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, - 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x65, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x60, 0x3b, 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, - 0x74, 0x6d, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x73, + 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, - 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, - 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, - 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x3d, 0x27, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x3b, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x3e, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, - 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, - 0x66, 0x28, 0x21, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x26, 0x26, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, + 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x74, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x3d, 0x74, 0x79, 0x70, 0x65, + 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x27, 0x26, 0x26, 0x27, 0x78, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, + 0x27, 0x79, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x7a, 0x27, 0x69, + 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, + 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, + 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, + 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, + 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, + 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5b, + 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, 0x60, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, + 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, + 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, + 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x0a, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, + 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x27, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, + 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, + 0x29, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, + 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, + 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2d, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, + 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, + 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, + 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, 0x21, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, - 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, - 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x49, 0x4d, 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x29, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6e, 0x61, 0x6c, - 0x6f, 0x67, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x7b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x3a, 0x33, 0x30, 0x2c, 0x6d, 0x61, - 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, - 0x63, 0x65, 0x69, 0x6c, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x6d, 0x69, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, - 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x7d, 0x29, - 0x3b, 0x7d, 0x0a, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, - 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x67, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x27, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, + 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x27, 0x3b, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x21, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x6c, + 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x69, 0x66, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x2e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x54, 0x4f, 0x55, + 0x43, 0x48, 0x5f, 0x53, 0x43, 0x52, 0x45, 0x45, 0x4e, 0x27, 0x29, 0x29, + 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, + 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x4d, 0x55, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x7b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x3a, 0x33, 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, + 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, + 0x64, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, - 0x63, 0x74, 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, - 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, - 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2e, 0x79, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x7a, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, - 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, - 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2c, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3d, 0x3e, 0x7b, 0x69, - 0x66, 0x28, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x3d, 0x3e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x69, 0x64, 0x3d, 0x3d, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, - 0x64, 0x29, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, - 0x72, 0x69, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, - 0x76, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x29, - 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, - 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x28, 0x27, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x29, 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6c, 0x65, - 0x74, 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, - 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x21, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, - 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, - 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x63, 0x61, 0x72, 0x64, - 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x64, - 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, - 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, 0x6f, 0x70, 0x43, - 0x61, 0x72, 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, - 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x28, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x73, 0x74, 0x65, - 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x2f, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, + 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, + 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, + 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x2c, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x79, 0x2c, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2e, 0x7a, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x49, 0x64, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, + 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, + 0x3e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x3d, 0x3d, + 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x29, 0x7b, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x49, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x0a, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, + 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x3d, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, + 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x29, 0x7b, 0x70, 0x72, + 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, + 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, + 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x6f, + 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, + 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x74, 0x6f, 0x70, + 0x43, 0x61, 0x72, 0x64, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x3d, 0x27, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x70, + 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x64, 0x61, 0x73, 0x68, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, 0x70, 0x72, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, + 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x28, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, - 0x65, 0x70, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2a, - 0x31, 0x30, 0x30, 0x29, 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, - 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, - 0x3c, 0x68, 0x32, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x2e, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x27, - 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, - 0x3e, 0x20, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, - 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, - 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x3c, 0x64, - 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2d, 0x62, 0x61, 0x72, 0x22, 0x3e, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x73, 0x74, 0x79, - 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x24, - 0x7b, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x7d, 0x25, 0x22, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x74, 0x69, - 0x6d, 0x65, 0x22, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x24, 0x7b, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x73, 0x3c, 0x2f, - 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x75, 0x75, 0x69, - 0x64, 0x22, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x3c, 0x62, 0x3e, 0x24, - 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, - 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x73, - 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, - 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, - 0x61, 0x73, 0x6b, 0x2d, 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x3e, 0x24, - 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, - 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x60, + 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x73, + 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2f, 0x0a, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x29, + 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x68, 0x32, 0x3e, + 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x0a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x20, 0x57, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x50, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, + 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x2d, 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x24, 0x7b, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x7d, 0x25, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, + 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x28, 0x32, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x73, 0x74, 0x65, 0x70, 0x20, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, - 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x3f, 0x20, 0x27, 0x64, 0x6f, 0x6e, 0x65, - 0x27, 0x20, 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x27, 0x7d, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, - 0x2e, 0x64, 0x6f, 0x6e, 0x65, 0x3f, 0x27, 0xe2, 0x9c, 0x93, 0x27, 0x3a, - 0x27, 0xe2, 0x97, 0x8b, 0x27, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, - 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x3d, - 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x74, - 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, - 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, - 0x20, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, - 0x27, 0x7d, 0x0a, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x3e, 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, - 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, - 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, - 0x66, 0x28, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, - 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, - 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, - 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, - 0x43, 0x61, 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, - 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x3f, 0x35, 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, - 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, - 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, - 0x61, 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, - 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, - 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, - 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x29, 0x7b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, - 0x67, 0x28, 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, - 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, - 0x22, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x22, 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, - 0x78, 0x74, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, - 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, - 0x69, 0x6e, 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, - 0x69, 0x6d, 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, - 0x6e, 0x65, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, - 0x65, 0x67, 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, - 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, + 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x75, 0x75, 0x69, 0x64, 0x22, 0x3e, 0x3c, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x49, 0x44, 0x3a, 0x3c, 0x62, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x64, + 0x7d, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, + 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, + 0x20, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, + 0x20, 0x3f, 0x20, 0x27, 0x64, 0x6f, 0x6e, 0x65, 0x27, 0x20, 0x3a, 0x20, + 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x7d, 0x22, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, + 0x65, 0x3f, 0x27, 0xe2, 0x9c, 0x93, 0x27, 0x3a, 0x27, 0xe2, 0x97, 0x8b, + 0x27, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, + 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, + 0x74, 0x65, 0x70, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x7d, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, + 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, + 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, + 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x73, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x0a, 0x24, + 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x7c, + 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x3d, + 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, + 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, + 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x70, 0x72, + 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, 0x72, 0x65, + 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, + 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x70, + 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, + 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, 0x70, 0x43, + 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, + 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, + 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, + 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, 0x2a, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x28, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, 0x6f, 0x72, + 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x29, + 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, + 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, + 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x27, + 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, + 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, + 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x27, + 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, + 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x73, 0x76, + 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, + 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, + 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, + 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, + 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, - 0x29, 0x2c, 0x28, 0x5c, 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, - 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, - 0x65, 0x67, 0x65, 0x78, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, - 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, - 0x6e, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, - 0x2c, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x69, 0x73, 0x48, 0x75, - 0x6d, 0x61, 0x6e, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, - 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x5d, 0x3d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x48, - 0x75, 0x6d, 0x61, 0x6e, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, - 0x74, 0x28, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, - 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x28, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x29, 0x7d, 0x3b, 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, - 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, - 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, - 0x77, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, - 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, - 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, - 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, - 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, - 0x6d, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, - 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, - 0x73, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, - 0x6e, 0x3f, 0x27, 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, - 0xa4, 0x96, 0x27, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, - 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, - 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, - 0x38, 0x29, 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, - 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, - 0x64, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, - 0x64, 0x3e, 0x60, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, - 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, - 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, - 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5c, + 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6c, 0x69, 0x6e, 0x65, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x65, 0x67, 0x65, 0x78, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x29, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, + 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, + 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, 0x2c, 0x74, 0x61, 0x73, + 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, + 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5d, 0x3d, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x74, + 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, + 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, + 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x69, 0x73, + 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, 0x29, 0x3d, 0x3d, 0x3d, + 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, + 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x3a, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x73, 0x74, + 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x29, 0x7d, 0x3b, + 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x21, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, 0x2e, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, 0x2e, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, + 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, + 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, + 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x63, + 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, + 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x2e, 0x74, 0x6f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x3f, 0x27, 0xf0, + 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, 0xa4, 0x96, 0x27, 0x7d, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, + 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, 0x75, 0x62, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, 0x29, 0x7d, 0x2e, + 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, + 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x7d, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, + 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, + 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, 0x2c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, + 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, + 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x70, 0x7c, 0x7c, + 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, + 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, + 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, + 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x7b, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, 0x69, 0x70, 0x2c, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x70, + 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, - 0x69, 0x70, 0x7c, 0x7c, 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, + 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, + 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x4c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x28, + 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, 0x75, 0x72, + 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3f, + 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, + 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, + 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, + 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, + 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, 0x65, 0x61, 0x72, + 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, + 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, + 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, + 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, + 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, + 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x61, 0x27, 0x29, + 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, 0x65, 0x66, 0x27, + 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, 0x2b, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, + 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, 0x6e, 0x6f, 0x6e, + 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, + 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x64, 0x6c, + 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, + 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x7b, + 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, + 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, - 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, - 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, - 0x66, 0x79, 0x28, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, - 0x3a, 0x69, 0x70, 0x2c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, - 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, - 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, - 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, - 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, - 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, - 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x28, 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, - 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x3f, 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, - 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, - 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, + 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, 0x72, 0x64, 0x66, + 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, - 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, - 0x65, 0x78, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x27, 0x61, 0x27, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, - 0x72, 0x65, 0x66, 0x27, 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, - 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, - 0x27, 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, - 0x74, 0x29, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, - 0x79, 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, - 0x27, 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, - 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, - 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, - 0x29, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, - 0x6f, 0x64, 0x79, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, - 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, - 0x65, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, + 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x22, + 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x75, + 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, + 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, 0x52, 0x44, + 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, + 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x74, 0x72, 0x79, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x3d, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x50, 0x2b, 0x22, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, - 0x75, 0x72, 0x64, 0x66, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, - 0x66, 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, - 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, - 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, - 0x7b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, - 0x78, 0x74, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, - 0x65, 0x78, 0x74, 0x29, 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x28, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x2e, 0x75, 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, - 0x74, 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x20, 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, - 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, - 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, + 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x77, 0x73, + 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, - 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, - 0x3f, 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, - 0x27, 0x2f, 0x77, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, - 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, - 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, - 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, - 0x74, 0x61, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, + 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, - 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, - 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, - 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, - 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, + 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, + 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x7d, + 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x27, 0x2c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x74, 0x61, 0x73, + 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x2e, 0x20, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, + 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, - 0x73, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, - 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, - 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, - 0x30, 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x3d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, - 0x3b, 0x7d, 0x3b, 0x7d, 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, - 0x44, 0x4f, 0x4d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, - 0x3d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, - 0x49, 0x50, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, - 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, - 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, - 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x3d, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x28, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, - 0x30, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, - 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, - 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, - 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e + 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x28, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, + 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, + 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, + 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x3b, 0x7d, + 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x22, 0x2c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, + 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, 0x4f, 0x4d, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, + 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x6c, + 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3d, + 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x28, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e }; -unsigned int _index_html_len = 26232; +unsigned int _index_html_len = 28208; #endif /* INDEX_H */ diff --git a/idf/taskboard/web_interfaces/index.html b/idf/taskboard/web_interfaces/index.html index f00fc37..8c8db00 100644 --- a/idf/taskboard/web_interfaces/index.html +++ b/idf/taskboard/web_interfaces/index.html @@ -785,6 +785,105 @@

Resources

} } + class ScatterGraph { + constructor(container) { + this.container = container; + this.canvas = container.querySelector('canvas'); + this.ctx = this.canvas.getContext('2d'); + this.dataX = new Array(30).fill(null); + this.dataY = new Array(30).fill(null); + this.dataZ = new Array(30).fill(null); + this.color = '#2196f3'; + + this.resizeCanvas(); + window.addEventListener('resize', () => this.resizeCanvas()); + } + + resizeCanvas() { + const rect = this.container.getBoundingClientRect(); + this.canvas.width = rect.width; + this.canvas.height = rect.height; + this.draw(); + } + + addValue(x, y, z) { + this.dataX.push(x); + this.dataX.shift(); + this.dataY.push(y); + this.dataY.shift(); + this.dataZ.push(z); + this.dataZ.shift(); + this.draw(); + } + + draw() { + const ctx = this.ctx; + const width = this.canvas.width; + const height = this.canvas.height; + ctx.clearRect(0, 0, width, height); + + this.drawGrid(); + + const last_index = this.dataX.length - 1; + + // Draw point if we are touching + if (this.dataZ[last_index] === 1) { + const x = this.dataX[last_index] * width / 100; + const y = this.dataY[last_index] * height / 100; + + const alpha = 1; + ctx.fillStyle = `rgba(33, 150, 243, ${alpha})`; + ctx.beginPath(); + ctx.arc(x, y, 4, 0, Math.PI * 2); + ctx.fill(); + } + + // Draw lines between consecutive points where both Z are 1 + for (let i = 0; i < this.dataX.length - 1; i++) { + if (this.dataZ[i] === 1 && this.dataZ[i + 1] === 1) { + const x1 = this.dataX[i] * width / 100; + const y1 = this.dataY[i] * height / 100; + const x2 = this.dataX[i + 1] * width / 100; + const y2 = this.dataY[i + 1] * height / 100; + + const alphaStart = i / (this.dataX.length - 1); + const alphaEnd = (i + 1) / (this.dataX.length - 1); + + const gradient = ctx.createLinearGradient(x1, y1, x2, y2); + gradient.addColorStop(0, `rgba(33, 150, 243, ${alphaStart})`); + gradient.addColorStop(1, `rgba(33, 150, 243, ${alphaEnd})`); + + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.strokeStyle = gradient; + ctx.lineWidth = 3; + ctx.stroke(); + } + } + } + + drawGrid() { + const ctx = this.ctx; + const width = this.canvas.width; + const height = this.canvas.height; + ctx.strokeStyle = '#e0e0e0'; + ctx.lineWidth = 1; + + // Draw vertical line at origin (left edge) + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(0, height); + ctx.stroke(); + + // Draw horizontal line at origin (top edge) + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(width, 0); + ctx.stroke(); + } + } + class HeapGraph { constructor(container) { this.container = container; @@ -1159,7 +1258,11 @@

Resources

let graph = sensorGraphs.get(sensor.id); if (!graph) { if (isIMU) { - graph = new IMUGraph(graphContainer); + if (sensor.id.includes('TOUCH_SCREEN')) { + graph = new ScatterGraph(graphContainer); + } else { + graph = new IMUGraph(graphContainer); + } } else { From a885c800721e20ca9e39793b745481ccd44298c8 Mon Sep 17 00:00:00 2001 From: Peter So Date: Tue, 15 Apr 2025 09:53:16 +0000 Subject: [PATCH 08/35] test pso --- idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index c7a32b4..e74c0dd 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -1,5 +1,6 @@ /** * Robothon Task Board Firmware + TEST PETER WAS HERE */ #pragma once From cf465e8a936cee6508b5a9c583c88ca305f928f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 15 Apr 2025 12:44:49 +0000 Subject: [PATCH 09/35] Separate TaskBoardDriver... hpp files for different taskboard versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_v1_RBv2023.hpp | 387 ++++++++++++++++++ idf/taskboard/main/main_core0.cpp | 6 + 2 files changed, 393 insertions(+) create mode 100644 idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp new file mode 100644 index 0000000..cf07668 --- /dev/null +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp @@ -0,0 +1,387 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/** + * @struct TaskBoardDriver_v1 + * + * @brief Implementation of TaskBoardDriver for version 1 hardware + */ +struct TaskBoardDriver_v1 : + public TaskBoardDriver +{ + const char* TAG = "TaskBoardDriver_v1"; ///< Logging tag + + /** + * @brief Constructs a new TaskBoardDriver_v1 object + * + * @param hardware_low_level_controller Reference to hardware interface + */ + TaskBoardDriver_v1( + HardwareLowLevelController& hardware_low_level_controller) + : hardware_low_level_controller_(hardware_low_level_controller) + { + // Fill unique id + uint8_t mac[6]; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + char mac_str[18]; + sprintf(mac_str, "%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + unique_id_ = mac_str; + char ssid_with_mac[32]; + snprintf(ssid_with_mac, sizeof(ssid_with_mac), "Robothon Task Board %01X%02X", (mac[4] & 0x0F), mac[5]); + unique_ssid_ = ssid_with_mac; + + // Initialize sensors + Sensor* blue_button = new Sensor("BLUE_BUTTON", [&]() + { + bool value = + hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: + CHANNEL_0); + + return SensorMeasurement(!value); // Button is inverted + }); + + Sensor* red_button = new Sensor("RED_BUTTON", [&]() + { + bool value = + hardware_low_level_controller_.pb_hub_controller.read_digital_IO1(PbHubController::Channel:: + CHANNEL_0); + + return SensorMeasurement(!value); // Button is inverted + }); + + Sensor* fader = new AnalogFilteredSensor("FADER", 10, [&]() + { + uint16_t value = + hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( + PbHubController::Channel::CHANNEL_5); + float float_value = static_cast(value) / 4095.0f; + + return SensorMeasurement(float_value); + }); + + Sensor* door_angle = new AnalogFilteredSensor("DOOR_ANGLE", 10, [&]() + { + uint16_t value = + hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( + PbHubController::Channel::CHANNEL_4); + float float_value = static_cast(value) / 4095.0f; + + return SensorMeasurement(float_value); + }); + + Sensor* light_right = new Sensor("LIGHT_RIGHT", [&]() + { + bool value = + hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: + CHANNEL_2); + + return SensorMeasurement(value); + }); + + Sensor* light_left = new Sensor("LIGHT_LEFT", [&]() + { + bool value = + hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: + CHANNEL_1); + + return SensorMeasurement(value); + }); + + Sensor* probe_goal_analog = new Sensor("PROBE_GOAL_ANALOG", [&]() + { + uint16_t value = + hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( + PbHubController::Channel::CHANNEL_3); + float float_value = static_cast(value) / 4095.0f; + + return SensorMeasurement(float_value); + }); + + Sensor* on_board_button_a = new Sensor("ON_BOARD_BUTTON_A", [&]() + { + bool value = hardware_low_level_controller_.m5_unified.BtnA.isPressed(); + + return SensorMeasurement(value); + }); + + Sensor* on_board_button_b = new Sensor("ON_BOARD_BUTTON_B", [&]() + { + bool value = hardware_low_level_controller_.m5_unified.BtnB.isPressed(); + + return SensorMeasurement(value); + }); + + Sensor* on_board_button_c = new Sensor("ON_BOARD_BUTTON_C", [&]() + { + bool value = hardware_low_level_controller_.m5_unified.BtnC.isPressed(); + + return SensorMeasurement(value); + }); + + Sensor* on_board_button_pwr = new Sensor("ON_BOARD_BUTTON_PWR", [&]() + { + bool value = hardware_low_level_controller_.m5_unified.BtnPWR.isPressed(); + + return SensorMeasurement(value); + }); + + Sensor* accelerometer = new Sensor("ACCELEROMETER", [&]() + { + SensorMeasurement::Vector3 values; + hardware_low_level_controller_.m5_unified.Imu.getAccel(&values.x, &values.y, &values.z); + + return SensorMeasurement(values); + }); + + Sensor* magnetometer = new Sensor("MAGNETOMETER", [&]() + { + SensorMeasurement::Vector3 values; + hardware_low_level_controller_.m5_unified.Imu.getMag(&values.x, &values.y, &values.z); + + return SensorMeasurement(values); + }); + + Sensor* gyroscope = new Sensor("GYROSCOPE", [&]() + { + SensorMeasurement::Vector3 values; + hardware_low_level_controller_.m5_unified.Imu.getGyro(&values.x, &values.y, &values.z); + + return SensorMeasurement(values); + }); + + Sensor* temperature = new Sensor("TEMPERATURE", [&]() + { + float value = 0.0; + hardware_low_level_controller_.m5_unified.Imu.getTemp(&value); + + return SensorMeasurement(value); + }); + + // Initialize aggregated sensors + Sensor* door_status = new Sensor("DOOR_OPEN", [=]() + { + bool is_open = true; + + if (door_angle->read().get_type() == SensorMeasurement::Type::ANALOG) + { + if (door_angle->read().get_analog() > 0.7) + { + is_open = false; + } + } + + return SensorMeasurement(is_open); + }); + + Sensor* free_cable = new Sensor("FREE_CABLE", [=]() + { + const bool is_cable_free = + !light_right->read().get_boolean() && + !light_left->read().get_boolean(); + + return SensorMeasurement(is_cable_free); + }); + + Sensor* attached_cable = new Sensor("ATTACHED_CABLE", [=]() + { + const bool is_cable_attached = + light_right->read().get_boolean() && + light_left->read().get_boolean(); + + return SensorMeasurement(is_cable_attached); + }); + + Sensor* probe_goal = new Sensor("PROBE_GOAL", [=]() + { + auto analog_measure = probe_goal_analog->read(); + + const bool is_touching_goal = analog_measure.get_analog() < 0.1; + + return SensorMeasurement(is_touching_goal); + }); + + Sensor* fader_trigger_blue_button = new TriggeredSensor("FADER_BLUE_BUTTON", *blue_button, [=]() + { + return fader->read(); + }); + + Sensor* red_button_counter = new CounterSensor("RED_BUTTON_COUNTER", [=]() + { + return red_button->read(); + }); + + // Store sensors + sensors_.push_back(blue_button); + sensors_.push_back(red_button); + sensors_.push_back(fader); + sensors_.push_back(door_angle); + sensors_.push_back(light_right); + sensors_.push_back(light_left); + sensors_.push_back(probe_goal_analog); + sensors_.push_back(on_board_button_a); + sensors_.push_back(on_board_button_b); + sensors_.push_back(on_board_button_c); + sensors_.push_back(on_board_button_pwr); + sensors_.push_back(accelerometer); + sensors_.push_back(magnetometer); + sensors_.push_back(gyroscope); + sensors_.push_back(temperature); + sensors_.push_back(door_status); + sensors_.push_back(free_cable); + sensors_.push_back(attached_cable); + sensors_.push_back(probe_goal); + sensors_.push_back(fader_trigger_blue_button); + sensors_.push_back(red_button_counter); + + // Initial update + update(); + + // Create default tasks + std::vector* precondition_steps = new std::vector + { + new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.0f), 0.1f), + new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(false)), + new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(false)), + new TaskStepEqual(*get_sensor_by_name("FREE_CABLE"), SensorMeasurement(true)), + }; + + default_precondition_task_ = new SimultaneousConditionTask(*precondition_steps, "Precondition Task"); + + TaskStep* timed_fader_operation = + new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.5f), 0.05f); + // timed_fader_operation->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); + + TaskStep* random_fader_step = + new TaskStepEqualToRandom(*get_sensor_by_name("FADER"), 0.05f); + // random_fader_step->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); + + std::vector* main_steps = new std::vector + { + new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), + timed_fader_operation, + random_fader_step, + new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), + new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(true)), + new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(true)), + new TaskStepEqual(*get_sensor_by_name("ATTACHED_CABLE"), SensorMeasurement(true)), + new TaskStepEqual(*get_sensor_by_name("RED_BUTTON_COUNTER"), SensorMeasurement(3ll)), + }; + + default_task_ = new SequentialTask(*main_steps, "Default Task"); + } + + /** + * @brief Virtual destructor for cleanup + */ + ~TaskBoardDriver_v1() + { + // TODO(pgarrido): If this is going to be deleted, free all used memory + } + + /// Virtual method implementation + Task& get_default_task() override + { + return *default_task_; + } + + /// Virtual method implementation + Task& get_default_task_precondition() override + { + return *default_precondition_task_; + } + + /// Virtual method implementation + const std::string& get_unique_id() const override + { + return unique_id_; + } + + /// Virtual method implementation + void update() override + { + hardware_low_level_controller_.m5_unified.update(); + hardware_low_level_controller_.m5_unified.Imu.update(); + + // Handle floating values at PbHubController + // TODO(pgarrido): Handle this with Peter + hardware_low_level_controller_.pb_hub_controller.write_digital_IO0(PbHubController::Channel::CHANNEL_3, true); + hardware_low_level_controller_.pb_hub_controller.write_digital_IO1(PbHubController::Channel::CHANNEL_3, true); + + for (auto& item : sensors_) + { + item->update(); + } + } + + /// Virtual method implementation + uint32_t get_sensor_count() const override + { + return sensors_.size(); + } + + /// Virtual method implementation + SensorReader* get_sensor( + const size_t& index) const override + { + Sensor* sensor = nullptr; + + if (index < sensors_.size()) + { + sensor = sensors_[index]; + } + + return sensor; + } + + /// Virtual method implementation + SensorReader* get_sensor_by_name( + const std::string& sensor_name) const override + { + Sensor* sensor = nullptr; + + for (auto const& s : sensors_) + { + if (s->name() == sensor_name) + { + sensor = s; + break; + } + } + + return sensor; + } + + /// Virtual method implementation + const std::string& get_unique_ssid() const override + { + return unique_ssid_; + } + +private: + + HardwareLowLevelController& hardware_low_level_controller_; ///< Reference to hardware interface + std::vector sensors_; ///< List of all board sensors + std::string unique_id_ = "TaskBoard_v1"; ///< Board identifier + std::string unique_ssid_ = "Robothon Task Board"; ///< Board identifier + + Task* default_task_; ///< Default main task sequence + Task* default_precondition_task_; ///< Default precondition task sequence + +}; diff --git a/idf/taskboard/main/main_core0.cpp b/idf/taskboard/main/main_core0.cpp index c6e8c73..9a97585 100644 --- a/idf/taskboard/main/main_core0.cpp +++ b/idf/taskboard/main/main_core0.cpp @@ -2,7 +2,13 @@ * Robothon Task Board Firmware */ +#include + +#if CONFIG_M5STACK_CORE2 #include +#else +#include +#endif #include #include From 37da050d4972c3b77fa4655d35e6c47c059f1bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 15 Apr 2025 13:54:40 +0000 Subject: [PATCH 10/35] Rename FollowPath to TraceShape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../robothon_taskboard_msgs/msg/TaskStep.msg | 2 +- idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp | 4 ++-- idf/taskboard/main/microros/MicroROSTypes.hpp | 4 ++-- idf/taskboard/main/task/TaskStep.hpp | 2 +- .../{TaskStepFollowPath.hpp => TaskStepTraceShape.hpp} | 10 +++++----- 5 files changed, 11 insertions(+), 11 deletions(-) rename idf/taskboard/main/task/{TaskStepFollowPath.hpp => TaskStepTraceShape.hpp} (96%) diff --git a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg index bb179f6..999beec 100644 --- a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg +++ b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/TaskStep.msg @@ -2,7 +2,7 @@ uint8 TASK_STEP_TYPE_UNKNOWN = 0 uint8 TASK_STEP_TYPE_EQUAL = 1 uint8 TASK_STEP_TYPE_EQUAL_RANDOM = 2 uint8 TASK_STEP_TYPE_GREATER_EQUAL = 3 -uint8 TASK_STEP_TYPE_FOLLOW_PATH = 4 +uint8 TASK_STEP_TYPE_TRACE_SHAPE = 4 string sensor_name uint8 type diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp index e74c0dd..7e398d1 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -304,7 +304,7 @@ struct TaskBoardDriver_v1 : { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, - new TaskStepFollowPath(*get_sensor_by_name("TOUCH_SCREEN_POSITION")), + new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN_POSITION")), random_fader_step, new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(true)), diff --git a/idf/taskboard/main/microros/MicroROSTypes.hpp b/idf/taskboard/main/microros/MicroROSTypes.hpp index aec98c2..a14d959 100644 --- a/idf/taskboard/main/microros/MicroROSTypes.hpp +++ b/idf/taskboard/main/microros/MicroROSTypes.hpp @@ -52,8 +52,8 @@ struct MicroROSTypes case ::TaskStep::Type::GREATER_OR_EQUAL: ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_GREATER_EQUAL; break; - case ::TaskStep::Type::FOLLOW_PATH: - ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_FOLLOW_PATH; + case ::TaskStep::Type::TRACE_SHAPE: + ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_TRACE_SHAPE; break; default: ret = robothon_taskboard_msgs__msg__TaskStep__TASK_STEP_TYPE_UNKNOWN; diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index fa99976..b1f3e6a 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -140,7 +140,7 @@ struct TaskStep : EQUAL, ///< Sensor value must exactly match target EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target - FOLLOW_PATH, ///< Sensor value must follow a specific path + TRACE_SHAPE, ///< Sensor value must follow a specific path UNKNOWN ///< Undefined comparison type }; diff --git a/idf/taskboard/main/task/TaskStepFollowPath.hpp b/idf/taskboard/main/task/TaskStepTraceShape.hpp similarity index 96% rename from idf/taskboard/main/task/TaskStepFollowPath.hpp rename to idf/taskboard/main/task/TaskStepTraceShape.hpp index 7845b44..f16ccd1 100644 --- a/idf/taskboard/main/task/TaskStepFollowPath.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShape.hpp @@ -10,25 +10,25 @@ #include /** - * @struct TaskStepFollowPath + * @struct TaskStepTraceShape * * @brief Implementation of TaskStep that checks how closely a path is followed * * @details Performs trace score evaluation between measured path and desired path */ -struct TaskStepFollowPath : +struct TaskStepTraceShape : public TaskStep { /** - * @brief Constructs a new TaskStepFollowPath object + * @brief Constructs a new TaskStepTraceShape object * * @param sensor Reference to the sensor to monitor */ - TaskStepFollowPath( + TaskStepTraceShape( SensorReader& sensor) : TaskStep(sensor) { - TaskStep::type_ = Type::FOLLOW_PATH; + TaskStep::type_ = Type::TRACE_SHAPE; initializeStep(); } From a2382f6cb67c8d7b6db3b58314dab2b4d3c24a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 15 Apr 2025 14:24:07 +0000 Subject: [PATCH 11/35] Rename TaskBoardDriver files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- ...BoardDriver_v1_RBv2023.hpp => TaskBoardDriver_TBv2023.hpp} | 0 .../{TaskBoardDriver_v1.hpp => TaskBoardDriver_TBv2025.hpp} | 0 idf/taskboard/main/main_core0.cpp | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename idf/taskboard/main/hal/board/{TaskBoardDriver_v1_RBv2023.hpp => TaskBoardDriver_TBv2023.hpp} (100%) rename idf/taskboard/main/hal/board/{TaskBoardDriver_v1.hpp => TaskBoardDriver_TBv2025.hpp} (100%) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp similarity index 100% rename from idf/taskboard/main/hal/board/TaskBoardDriver_v1_RBv2023.hpp rename to idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp similarity index 100% rename from idf/taskboard/main/hal/board/TaskBoardDriver_v1.hpp rename to idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp diff --git a/idf/taskboard/main/main_core0.cpp b/idf/taskboard/main/main_core0.cpp index 9a97585..3931e19 100644 --- a/idf/taskboard/main/main_core0.cpp +++ b/idf/taskboard/main/main_core0.cpp @@ -5,9 +5,9 @@ #include #if CONFIG_M5STACK_CORE2 -#include +#include #else -#include +#include #endif #include From 07e3cc24e2868d97c57e927098e6a331519aa9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 15 Apr 2025 14:08:00 +0000 Subject: [PATCH 12/35] Implement TaskStepAuto and TaskStepWaitRandom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../msg/SensorMeasurement.msg | 1 + .../hal/board/TaskBoardDriver_TBv2025.hpp | 6 +- idf/taskboard/main/microros/MicroROSTask.hpp | 2 +- idf/taskboard/main/microros/MicroROSTypes.hpp | 14 +- idf/taskboard/main/network/JSONHandler.hpp | 6 +- .../main/sensor/SensorMeasurement.hpp | 26 +++- idf/taskboard/main/task/ParallelTask.hpp | 2 +- idf/taskboard/main/task/SequentialTask.hpp | 4 +- .../main/task/SimultaneousConditionTask.hpp | 2 +- idf/taskboard/main/task/Task.hpp | 10 +- idf/taskboard/main/task/TaskStep.hpp | 136 ++++++++++++++---- .../main/task/TaskStepWaitRandom.hpp | 80 +++++++++++ 12 files changed, 241 insertions(+), 48 deletions(-) create mode 100644 idf/taskboard/main/task/TaskStepWaitRandom.hpp diff --git a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/SensorMeasurement.msg b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/SensorMeasurement.msg index 087cce7..c2ae8e5 100644 --- a/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/SensorMeasurement.msg +++ b/idf/taskboard/extra_ros_packages/robothon_taskboard_msgs/msg/SensorMeasurement.msg @@ -3,6 +3,7 @@ uint8 SENSOR_MEASUREMENT_TYPE_BOOL = 1 uint8 SENSOR_MEASUREMENT_TYPE_ANALOG = 2 uint8 SENSOR_MEASUREMENT_TYPE_VECTOR3 = 3 uint8 SENSOR_MEASUREMENT_TYPE_INTEGER = 4 +uint8 SENSOR_MEASUREMENT_TYPE_EMPTY = 5 uint8 type diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 7e398d1..48059f3 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -282,7 +283,7 @@ struct TaskBoardDriver_v1 : update(); // Create default tasks - std::vector* precondition_steps = new std::vector + std::vector* precondition_steps = new std::vector { new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.0f), 0.1f), new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(false)), @@ -300,13 +301,14 @@ struct TaskBoardDriver_v1 : new TaskStepEqualToRandom(*get_sensor_by_name("FADER"), 0.05f); // random_fader_step->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); - std::vector* main_steps = new std::vector + std::vector* main_steps = new std::vector { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN_POSITION")), random_fader_step, new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), + new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(true)), new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(true)), new TaskStepEqual(*get_sensor_by_name("ATTACHED_CABLE"), SensorMeasurement(true)), diff --git a/idf/taskboard/main/microros/MicroROSTask.hpp b/idf/taskboard/main/microros/MicroROSTask.hpp index b167473..5ad6df6 100644 --- a/idf/taskboard/main/microros/MicroROSTask.hpp +++ b/idf/taskboard/main/microros/MicroROSTask.hpp @@ -149,6 +149,6 @@ struct MicroROSTask : private: rclc_action_goal_handle_t const* const goal_handle_; ///< Pointer to the micro-ROS action goal handle - std::vector steps_; ///< List of task steps + std::vector steps_; ///< List of task steps bool steps_from_default_task_ = false; ///< Flag to indicate if steps are from default task }; diff --git a/idf/taskboard/main/microros/MicroROSTypes.hpp b/idf/taskboard/main/microros/MicroROSTypes.hpp index a14d959..a3adfe7 100644 --- a/idf/taskboard/main/microros/MicroROSTypes.hpp +++ b/idf/taskboard/main/microros/MicroROSTypes.hpp @@ -116,14 +116,14 @@ struct MicroROSTypes for (size_t i = 0; i < task.total_steps(); i++) { - const ::TaskStep& step = task.step(i); + const ::TaskStepBase& step = task.step(i); robothon_taskboard_msgs__msg__TaskStep& msg_step = microros_msg_.steps.data[i]; msg_step = {}; - msg_step.sensor_name.data = (char*)step.sensor().name().c_str(); - msg_step.sensor_name.size = step.sensor().name().size(); - msg_step.sensor_name.capacity = step.sensor().name().size() + 1; + msg_step.sensor_name.data = (char*)step.name().c_str(); + msg_step.sensor_name.size = step.name().size(); + msg_step.sensor_name.capacity = step.name().size() + 1; if (step.clue_trigger() != nullptr) { @@ -168,6 +168,8 @@ struct MicroROSTypes msg_step.target.integer_value.size = 1; msg_step.target.integer_value.capacity = 1; break; + case ::SensorMeasurement::Type::EMPTY: + break; } microros_msg_.status.data[i] = task.step_done(i); @@ -588,6 +590,8 @@ struct MicroROSTypes sensor_data.value.integer_value.capacity = 1; sensor_data.value.integer_value.data[0] = sensor_value.get_integer(); break; + case ::SensorMeasurement::Type::EMPTY: + break; } } @@ -617,6 +621,8 @@ struct MicroROSTypes case ::SensorMeasurement::Type::INTEGER: delete sensor_data.value.integer_value.data; break; + case ::SensorMeasurement::Type::EMPTY: + break; } } diff --git a/idf/taskboard/main/network/JSONHandler.hpp b/idf/taskboard/main/network/JSONHandler.hpp index 6421424..22ed15d 100644 --- a/idf/taskboard/main/network/JSONHandler.hpp +++ b/idf/taskboard/main/network/JSONHandler.hpp @@ -150,6 +150,8 @@ struct JSONHandler cJSON_AddItemToObject(sensor, "is_integer", is_integer); break; } + case SensorMeasurement::Type::EMPTY: + break; } cJSON_AddItemToArray(sensors_, sensor); @@ -199,6 +201,8 @@ struct JSONHandler cJSON_AddNumberToObject(root_, sensor_dev->name().c_str(), value); break; } + case SensorMeasurement::Type::EMPTY: + break; } } } @@ -246,7 +250,7 @@ struct JSONHandler for (size_t i = 0; i < task.total_steps(); i++) { cJSON* step = cJSON_CreateObject(); - cJSON_AddStringToObject(step, "sensor", task.step(i).sensor().name().c_str()); + cJSON_AddStringToObject(step, "sensor", task.step(i).name().c_str()); cJSON* done = task.step_done(i) ? cJSON_CreateTrue() : cJSON_CreateFalse(); cJSON_AddItemToObject(step, "done", done); diff --git a/idf/taskboard/main/sensor/SensorMeasurement.hpp b/idf/taskboard/main/sensor/SensorMeasurement.hpp index 5c8b2ac..6434b0a 100644 --- a/idf/taskboard/main/sensor/SensorMeasurement.hpp +++ b/idf/taskboard/main/sensor/SensorMeasurement.hpp @@ -37,10 +37,11 @@ struct SensorMeasurement */ enum class Type { - BOOLEAN, ///< Boolean measurement type - ANALOG, ///< Analog (float) measurement type - VECTOR3, ///< 3D vector measurement type - INTEGER ///< Integer measurement type + BOOLEAN = 1, ///< Boolean measurement type + ANALOG = 2, ///< Analog (float) measurement type + VECTOR3 = 3, ///< 3D vector measurement type + INTEGER = 4, ///< Integer measurement type + EMPTY = 5 ///< Empty measurement type }; /** @@ -91,6 +92,14 @@ struct SensorMeasurement { } + /** + * @brief Constructs an empty SensorMeasurement + */ + SensorMeasurement() + : type_(Type::EMPTY) + { + } + /** * @brief Gets the type of measurement stored * @return Type enum indicating measurement type @@ -121,6 +130,9 @@ struct SensorMeasurement case Type::INTEGER: return std::to_string(integer_value); break; + case Type::EMPTY: + return ""; + break; } return "unknown"; @@ -160,6 +172,9 @@ struct SensorMeasurement case Type::INTEGER: ret = a.integer_value == b.integer_value; break; + case Type::EMPTY: + ret = true; + break; } } @@ -198,6 +213,9 @@ struct SensorMeasurement case Type::INTEGER: ret = a.integer_value >= b.integer_value; break; + case Type::EMPTY: + ret = true; + break; } } diff --git a/idf/taskboard/main/task/ParallelTask.hpp b/idf/taskboard/main/task/ParallelTask.hpp index be7e24b..c3dbe17 100644 --- a/idf/taskboard/main/task/ParallelTask.hpp +++ b/idf/taskboard/main/task/ParallelTask.hpp @@ -24,7 +24,7 @@ struct ParallelTask : * @param task_name Name identifier for the task */ ParallelTask( - const std::vector& steps, + const std::vector& steps, const std::string& task_name = "") : Task(steps, task_name, false) { diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index fdaccc5..a30bc59 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -24,7 +24,7 @@ struct SequentialTask : * @param first_task_init_timer If true, timer starts only after first step completion */ SequentialTask( - const std::vector& steps, + const std::vector& steps, const std::string& task_name = "", bool first_task_init_timer = false) : Task(steps, task_name, first_task_init_timer) @@ -73,7 +73,7 @@ struct SequentialTask : // Restart status of the next step if (current_step_ < steps_.size()) { - steps_[current_step_]->sensor().start_read(); + steps_[current_step_]->restart_step(); } ret = true; diff --git a/idf/taskboard/main/task/SimultaneousConditionTask.hpp b/idf/taskboard/main/task/SimultaneousConditionTask.hpp index ca1f3c9..2792621 100644 --- a/idf/taskboard/main/task/SimultaneousConditionTask.hpp +++ b/idf/taskboard/main/task/SimultaneousConditionTask.hpp @@ -27,7 +27,7 @@ struct SimultaneousConditionTask : * @param task_name Name identifier for the task */ SimultaneousConditionTask( - const std::vector& steps, + const std::vector& steps, const std::string& task_name = "") : ParallelTask(steps, task_name) { diff --git a/idf/taskboard/main/task/Task.hpp b/idf/taskboard/main/task/Task.hpp index 7ac80bc..33a29ef 100644 --- a/idf/taskboard/main/task/Task.hpp +++ b/idf/taskboard/main/task/Task.hpp @@ -34,7 +34,7 @@ struct Task * @param first_task_init_timer If true, timer starts only after first step completion */ Task( - const std::vector& steps, + const std::vector& steps, const std::string& task_name = "", bool first_task_init_timer = false) : steps_(steps) @@ -110,9 +110,9 @@ struct Task previous_done_state_ = false; // Restart all sensor reads - for (const TaskStep* step : steps_) + for (const TaskStepBase* step : steps_) { - step->sensor().start_read(); + step->restart_step(); } // Regenerate unique ID @@ -191,7 +191,7 @@ struct Task * * @return Const reference to the TaskStep object */ - const TaskStep& step( + const TaskStepBase& step( size_t step) const { return *steps_[step]; @@ -235,7 +235,7 @@ struct Task task_name_ = task_name; } - const std::vector& steps_; ///< Sequence of steps in the task + const std::vector& steps_; ///< Sequence of steps in the task private: diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index b1f3e6a..5deae09 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -119,17 +119,20 @@ struct TaskStepClueHandler }; /** - * @struct TaskStep + * @struct TaskStepBase * - * @brief Base class representing a single condition or action within a task + * @brief Base class for task step handlers * - * @details A TaskStep defines a goal condition that must be met by a specific sensor - * reading. It provides the interface for checking condition completion and - * accessing expected values. + * @details This class provides the interface for checking task step success and calculating scores. */ -struct TaskStep : +struct TaskStepBase : public TaskStepClueHandler { + /** + * @brief Virtual destructor + */ + virtual ~TaskStepBase() = default; + /** * @enum Type * @@ -141,26 +144,28 @@ struct TaskStep : EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target TRACE_SHAPE, ///< Sensor value must follow a specific path + WAIT_RANDOM, ///< Wait for a random time UNKNOWN ///< Undefined comparison type }; /** - * @brief Constructs a new TaskStep object + * @brief restarts the step to the condition needed at the beginning of the task + */ + virtual void restart_step() const = 0; + + /** + * @brief Gets the name of the task step * - * @param sensor Reference to the sensor that will be monitored + * @return Reference to task step name string */ - TaskStep( - SensorReader& sensor) - : sensor_(sensor) - { - // By default a task step begins a read operation on the sensor - sensor.start_read(); - } + virtual const std::string& name() const = 0; /** - * @brief Virtual destructor + * @brief Gets the target value for this step + * + * @return Expected sensor measurement value */ - virtual ~TaskStep() = default; + virtual SensorMeasurement expected_value() const = 0; /** * @brief Checks if the step condition has been met @@ -179,11 +184,61 @@ struct TaskStep : virtual float score() const = 0; /** - * @brief Gets the target value for this step + * @brief Gets the comparison type for this step * - * @return Expected sensor measurement value + * @return Reference to the step's comparison type */ - virtual SensorMeasurement expected_value() const = 0; + const Type& type() const + { + return type_; + } + +protected: + + Type type_ = Type::UNKNOWN; ///< Type of comparison for success evaluation +}; + +/** + * @struct TaskStep + * + * @brief Base class representing a single condition or action within a task + * + * @details A TaskStep defines a goal condition that must be met by a specific sensor + * reading. It provides the interface for checking condition completion and + * accessing expected values. + */ +struct TaskStep : + public TaskStepBase +{ + /** + * @brief Constructs a new TaskStep object + * + * @param sensor Reference to the sensor that will be monitored + */ + TaskStep( + SensorReader& sensor) + : sensor_(sensor) + { + // By default a task step begins a read operation on the sensor + sensor.start_read(); + } + + /** + * @brief Virtual destructor + */ + virtual ~TaskStep() = default; + + /// Virtual method implementation + void restart_step() const override + { + sensor_.start_read(); + } + + /// Virtual method implementation + const std::string& name() const override + { + return sensor_.name(); + } /** * @brief Gets the associated sensor @@ -195,18 +250,45 @@ struct TaskStep : return sensor_; } +protected: + + SensorReader& sensor_; ///< Reference to the monitored sensor +}; + +struct TaskStepAuto : + public TaskStepBase +{ /** - * @brief Gets the comparison type for this step - * - * @return Reference to the step's comparison type + * @brief Constructs a new TaskStepAuto object */ - const Type& type() const + TaskStepAuto(std::string name = "") + : name_(name) { - return type_; + } + + /** + * @brief Virtual destructor + */ + virtual ~TaskStepAuto() = default; + + /// Virtual method implementation + void restart_step() const override + { + } + + /// Virtual method implementation + const std::string& name() const override + { + return name_; + } + + /// Virtual method implementation + SensorMeasurement expected_value() const override + { + return SensorMeasurement(); } protected: - SensorReader& sensor_; ///< Reference to the monitored sensor - Type type_ = Type::UNKNOWN; ///< Type of comparison for success evaluation + std::string name_ = "TaskStepAuto"; ///< Name of the task step }; diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp new file mode 100644 index 0000000..e61f41a --- /dev/null +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -0,0 +1,80 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include + +#include +#include + +/** + * @struct TaskStepWaitRandom + * + * @brief Implementation of TaskStep that waits for a random amount of time and succeeds automatically + */ +struct TaskStepWaitRandom : + public TaskStepAuto +{ + /** + * @brief Constructs a new TaskStepWaitRandom object + * + * @param name Name identifier for the task step + */ + TaskStepWaitRandom(std::string name = "") + : TaskStepAuto(name) + { + TaskStepAuto::type_ = Type::WAIT_RANDOM; + + initializeStep(); + } + + void initializeStep() const + { + initial_time_ = -1LL; + // Generate random value between 2 and 10 seconds + random_waiting_time_us_ = 2000000LL + 8000000LL * esp_random() / UINT32_MAX; + } + + /// Virtual method implementation + bool success() const override + { + if (initial_time_ == -1) + { + initial_time_ = esp_timer_get_time(); + } + + const bool ret = esp_timer_get_time() - initial_time_ >= random_waiting_time_us_; + + return ret; + } + + /// Virtual method implementation + float score() const override + { + initializeStep(); + // Score is irrelevant + return -1.0f; + } + + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + screen_controller.print_task_clue("Waiting time [ms]: " + std::to_string(random_waiting_time_us_ / 1000)); + } + else + { + reset_clue(); + } + } + + mutable int64_t initial_time_ = -1LL; ///< Initial time when the step started + mutable int64_t random_waiting_time_us_ = 0LL; ///< Current random target value +}; From b0eea61179c05ed6cef521644bcd896ad0699ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 15 Apr 2025 15:08:36 +0000 Subject: [PATCH 13/35] Do not take into account waiting time for total protocol time. Show differential time for steps instead of total. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/task/SequentialTask.hpp | 36 ++++++++++++++++++---- idf/taskboard/main/task/TaskStep.hpp | 19 ++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index a30bc59..c62ac4a 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -60,6 +60,8 @@ struct SequentialTask : { steps_score_.resize(steps_.size(), -1.0f); steps_finish_time_.resize(steps_.size(), -1); + steps_completion_time_.resize(steps_.size(), -1); + steps_time_sum_ = 0; } if (current_step_ < steps_.size()) @@ -67,7 +69,21 @@ struct SequentialTask : if (steps_[current_step_]->success()) { steps_score_[current_step_] = steps_[current_step_]->score(); - steps_finish_time_[current_step_] = elapsed_time(); + steps_finish_time_[current_step_] = Task::elapsed_time(); + if (current_step_ == 0) + { + steps_completion_time_[current_step_] = steps_finish_time_[current_step_]; + } + else + { + steps_completion_time_[current_step_] = steps_finish_time_[current_step_] - steps_finish_time_[current_step_ - 1]; + } + + if (!steps_[current_step_]->is_auto()) + { + steps_time_sum_ += steps_completion_time_[current_step_]; + } + current_step_++; // Restart status of the next step @@ -112,12 +128,18 @@ struct SequentialTask : int64_t step_done_time( size_t step) const override { - if (step >= steps_finish_time_.size()) + if (step >= steps_completion_time_.size()) { return -1; } - return steps_finish_time_[step]; + return steps_completion_time_[step]; + } + + /// Virtual method implementation + int64_t elapsed_time() const + { + return steps_time_sum_; } /// Virtual method implementation @@ -129,7 +151,9 @@ struct SequentialTask : private: - size_t current_step_ = 0; ///< Index of current step being executed - std::vector steps_score_; ///< Score for each step - std::vector steps_finish_time_; ///< Completion status for each step + size_t current_step_ = 0; ///< Index of current step being executed + std::vector steps_score_; ///< Score for each step + std::vector steps_finish_time_; ///< Completion status for each step + std::vector steps_completion_time_; ///< Completion time for each step + int64_t steps_time_sum_ = 0; ///< Calculated task total time }; diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 5deae09..91903f4 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -183,6 +183,13 @@ struct TaskStepBase : */ virtual float score() const = 0; + /** + * @brief Checks if the step is automatic or operated + * + * @return true if the step is automatic, false if it requires operation + */ + virtual bool is_auto() const = 0; + /** * @brief Gets the comparison type for this step * @@ -240,6 +247,12 @@ struct TaskStep : return sensor_.name(); } + /// Virtual method implementation + bool is_auto() const override + { + return false; + } + /** * @brief Gets the associated sensor * @@ -282,6 +295,12 @@ struct TaskStepAuto : return name_; } + /// Virtual method implementation + bool is_auto() const override + { + return true; + } + /// Virtual method implementation SensorMeasurement expected_value() const override { From 895a7032e24874673b539dbd2c683a665615e287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 07:38:30 +0000 Subject: [PATCH 14/35] Fix saving the right value of total protocol time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/hal/NonVolatileStorage.hpp | 4 ++-- idf/taskboard/main/task/SequentialTask.hpp | 5 +++-- idf/taskboard/main/task/SimultaneousConditionTask.hpp | 6 ++++++ idf/taskboard/main/task/Task.hpp | 7 +++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/idf/taskboard/main/hal/NonVolatileStorage.hpp b/idf/taskboard/main/hal/NonVolatileStorage.hpp index e5ad377..9746412 100644 --- a/idf/taskboard/main/hal/NonVolatileStorage.hpp +++ b/idf/taskboard/main/hal/NonVolatileStorage.hpp @@ -106,7 +106,7 @@ struct NonVolatileStorage // Write CSV line: timestamp, task name, is_human fprintf(file, "%s,%lld,%d,%s,", task.name().c_str(), - task.elapsed_time(), + task.total_task_time(), is_human ? 1 : 0, task.unique_id().c_str()); @@ -131,7 +131,7 @@ struct NonVolatileStorage fflush(file); ESP_LOGI(TAG, "Added new register: %s, %lld, %d", - task.name().c_str(), task.elapsed_time(), is_human ? 1 : 0); + task.name().c_str(), task.total_task_time(), is_human ? 1 : 0); fclose(file); } diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index c62ac4a..df32151 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -16,6 +16,7 @@ struct SequentialTask : public Task { + const char* TAG = "SequentialTask"; ///< Logging tag /** * @brief Constructs a new SequentialTask object * @@ -69,7 +70,7 @@ struct SequentialTask : if (steps_[current_step_]->success()) { steps_score_[current_step_] = steps_[current_step_]->score(); - steps_finish_time_[current_step_] = Task::elapsed_time(); + steps_finish_time_[current_step_] = elapsed_time(); if (current_step_ == 0) { steps_completion_time_[current_step_] = steps_finish_time_[current_step_]; @@ -137,7 +138,7 @@ struct SequentialTask : } /// Virtual method implementation - int64_t elapsed_time() const + int64_t total_task_time() const { return steps_time_sum_; } diff --git a/idf/taskboard/main/task/SimultaneousConditionTask.hpp b/idf/taskboard/main/task/SimultaneousConditionTask.hpp index 2792621..818e395 100644 --- a/idf/taskboard/main/task/SimultaneousConditionTask.hpp +++ b/idf/taskboard/main/task/SimultaneousConditionTask.hpp @@ -64,4 +64,10 @@ struct SimultaneousConditionTask : return ret; } + /// Virtual method implementation + int64_t total_task_time() const override + { + return elapsed_time(); + } + }; diff --git a/idf/taskboard/main/task/Task.hpp b/idf/taskboard/main/task/Task.hpp index 33a29ef..4e9a74b 100644 --- a/idf/taskboard/main/task/Task.hpp +++ b/idf/taskboard/main/task/Task.hpp @@ -120,6 +120,13 @@ struct Task unique_id_str_ = uuid_to_string(unique_id_); } + /** + * @brief Gets the total time taken for the task without taking into account automatic steps + * + * @return Total time in microseconds + */ + virtual int64_t total_task_time() const = 0; + /** * @brief Gets the elapsed time since task start * From 6e77e04629e5e0cc5d6f7ded41359a4f4107f08c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 08:05:49 +0000 Subject: [PATCH 15/35] Update TaskBoardDriver_TBv2023 to new class names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp index cf07668..5e7223d 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp @@ -254,7 +254,7 @@ struct TaskBoardDriver_v1 : update(); // Create default tasks - std::vector* precondition_steps = new std::vector + std::vector* precondition_steps = new std::vector { new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.0f), 0.1f), new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(false)), @@ -272,7 +272,7 @@ struct TaskBoardDriver_v1 : new TaskStepEqualToRandom(*get_sensor_by_name("FADER"), 0.05f); // random_fader_step->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); - std::vector* main_steps = new std::vector + std::vector* main_steps = new std::vector { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, From b7fbe387b0b8693d0d6c24651c344f68b2713909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 08:22:52 +0000 Subject: [PATCH 16/35] Update default to Core2 device in menuconfig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/Kconfig.projbuild | 2 +- idf/taskboard/sdkconfig | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/idf/taskboard/main/Kconfig.projbuild b/idf/taskboard/main/Kconfig.projbuild index 92a5530..1a9f903 100644 --- a/idf/taskboard/main/Kconfig.projbuild +++ b/idf/taskboard/main/Kconfig.projbuild @@ -6,7 +6,7 @@ menu "M5STACK controller" choice CONTROLLER_HARDWARE prompt "M5STACK hardware" - default M5STACK_STICKC_PLUS2 + default M5STACK_CORE2 config M5STACK_STICKC_PLUS2 bool "M5STACK_STICKC_PLUS2" config M5STACK_CORE2 diff --git a/idf/taskboard/sdkconfig b/idf/taskboard/sdkconfig index cc12960..8730dc8 100644 --- a/idf/taskboard/sdkconfig +++ b/idf/taskboard/sdkconfig @@ -391,8 +391,8 @@ CONFIG_PARTITION_TABLE_MD5=y # # M5STACK controller # -CONFIG_M5STACK_STICKC_PLUS2=y -# CONFIG_M5STACK_CORE2 is not set +# CONFIG_M5STACK_STICKC_PLUS2 is not set +CONFIG_M5STACK_CORE2=y # CONFIG_M5STACK_STICKC_PLUS is not set # end of M5STACK controller From 9da0c7cbf187b7343d10852ad886674bc8f87320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 09:47:46 +0000 Subject: [PATCH 17/35] Add total protocol score calculation. Show in leaderboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/hal/NonVolatileStorage.hpp | 9 +- .../main/network/webpages/web_index.h | 3317 +++++++++-------- idf/taskboard/main/task/ParallelTask.hpp | 20 + idf/taskboard/main/task/SequentialTask.hpp | 20 + idf/taskboard/main/task/Task.hpp | 7 + idf/taskboard/web_interfaces/index.html | 11 +- 6 files changed, 1721 insertions(+), 1663 deletions(-) diff --git a/idf/taskboard/main/hal/NonVolatileStorage.hpp b/idf/taskboard/main/hal/NonVolatileStorage.hpp index 9746412..201c6dd 100644 --- a/idf/taskboard/main/hal/NonVolatileStorage.hpp +++ b/idf/taskboard/main/hal/NonVolatileStorage.hpp @@ -103,10 +103,11 @@ struct NonVolatileStorage return; } - // Write CSV line: timestamp, task name, is_human - fprintf(file, "%s,%lld,%d,%s,", + // Write CSV line: timestamp, protocol name, protocol time, protocol score, is_human, protocol id + fprintf(file, "%s,%lld,%f,%d,%s,", task.name().c_str(), task.total_task_time(), + task.final_score(), is_human ? 1 : 0, task.unique_id().c_str()); @@ -130,8 +131,8 @@ struct NonVolatileStorage // Ensure data is written to file fflush(file); - ESP_LOGI(TAG, "Added new register: %s, %lld, %d", - task.name().c_str(), task.total_task_time(), is_human ? 1 : 0); + ESP_LOGI(TAG, "Added new register: %s, %lld, %f, %d", + task.name().c_str(), task.total_task_time(), task.final_score(), is_human ? 1 : 0); fclose(file); } diff --git a/idf/taskboard/main/network/webpages/web_index.h b/idf/taskboard/main/network/webpages/web_index.h index ae868c9..04d3161 100644 --- a/idf/taskboard/main/network/webpages/web_index.h +++ b/idf/taskboard/main/network/webpages/web_index.h @@ -2,8 +2,8 @@ #define INDEX_H /* - * Original size: 53,718 bytes - * Minified size: 28,197 bytes + * Original size: 53,891 bytes + * Minified size: 28,284 bytes * Saved: 47.5% */ @@ -629,545 +629,194 @@ const unsigned char _index_html[] = { 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, - 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x61, 0x73, 0x6b, - 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 0x6d, - 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x3c, 0x2f, - 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x55, 0x55, 0x49, 0x44, 0x3c, - 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, - 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x69, 0x64, 0x3d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x62, - 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, - 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x20, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3c, 0x2f, - 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x68, - 0x65, 0x61, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, - 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, - 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, - 0x74, 0x68, 0x3e, 0x4d, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x43, 0x50, 0x55, - 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, - 0x68, 0x3e, 0x43, 0x6f, 0x72, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, - 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, - 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x64, 0x3d, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, - 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, - 0x32, 0x3e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x3c, - 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, - 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x67, 0x65, 0x74, 0x55, - 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x3e, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x42, - 0x6f, 0x61, 0x72, 0x64, 0x27, 0x73, 0x20, 0x55, 0x52, 0x44, 0x46, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x73, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, - 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x3e, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x50, 0x3a, 0x3c, 0x2f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, - 0x64, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x20, - 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x28, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, - 0x22, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, - 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x73, - 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x6c, 0x61, - 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x69, 0x64, - 0x3d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, - 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, - 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, - 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, - 0x66, 0x33, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, - 0x28, 0x33, 0x33, 0x2c, 0x20, 0x31, 0x35, 0x30, 0x2c, 0x20, 0x32, 0x34, - 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, - 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, - 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, - 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, - 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, - 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, 0x61, - 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x4d, 0x61, 0x74, - 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2c, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, - 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x55, 0x55, 0x49, + 0x44, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, + 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x69, 0x64, 0x3d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x32, 0x3e, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x68, 0x65, 0x61, 0x70, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x72, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4d, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x43, + 0x50, 0x55, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x43, 0x6f, 0x72, 0x65, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x64, 0x3d, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, + 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x61, 0x72, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x22, 0x3e, + 0x3c, 0x68, 0x32, 0x3e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3e, 0x3c, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x67, 0x65, + 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x3e, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x73, 0x20, 0x55, 0x52, 0x44, + 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, + 0x69, 0x70, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x3e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x50, 0x3a, 0x3c, 0x2f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x69, 0x64, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, + 0x70, 0x20, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x50, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, + 0x69, 0x64, 0x3d, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, + 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, + 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, + 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, + 0x39, 0x36, 0x66, 0x33, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, + 0x62, 0x61, 0x28, 0x33, 0x33, 0x2c, 0x20, 0x31, 0x35, 0x30, 0x2c, 0x20, + 0x32, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, - 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, - 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, - 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, - 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, - 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, - 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, - 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, - 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, - 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, - 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, - 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, - 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, - 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, - 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, - 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, - 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, - 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x49, 0x4d, - 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, - 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, 0x7b, 0x78, 0x3a, 0x27, 0x23, - 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x2c, 0x79, 0x3a, 0x27, 0x23, - 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, 0x2c, 0x7a, 0x3a, 0x27, 0x23, - 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x27, 0x7d, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, - 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, - 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, - 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, - 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, - 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, - 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x78, 0x2c, 0x79, - 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x73, 0x68, - 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x79, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, - 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, - 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x30, 0x2c, 0x4d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x31, 0x2c, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x64, 0x61, 0x74, - 0x61, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, - 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, - 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, - 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, - 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, + 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, + 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, + 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, + 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, + 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, + 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, + 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, + 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x28, 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, - 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, - 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x31, 0x29, 0x2f, 0x32, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2f, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, - 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, - 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, - 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, - 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, - 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, - 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, - 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, - 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x58, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x59, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2c, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x7a, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x65, - 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, - 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, - 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, - 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x3d, - 0x5b, 0x2d, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x5d, 0x3b, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, - 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2b, 0x31, 0x29, 0x2f, 0x32, 0x2a, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, - 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, - 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x65, - 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, - 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x3d, 0x38, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x34, 0x30, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x32, 0x30, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, - 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, - 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x38, 0x29, - 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x65, - 0x63, 0x74, 0x28, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x2a, 0x33, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x2a, 0x32, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, - 0x78, 0x65, 0x73, 0x3d, 0x5b, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, - 0x27, 0x58, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x78, 0x7d, - 0x2c, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x59, 0x27, 0x2c, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x7d, 0x2c, 0x7b, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x5a, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x73, 0x2e, 0x7a, 0x7d, 0x5d, 0x3b, 0x61, 0x78, 0x65, 0x73, 0x2e, 0x66, - 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x61, 0x78, 0x69, 0x73, - 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x78, 0x3d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, 0x74, - 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x69, 0x2b, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x69, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, - 0x2b, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, 0x69, - 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, - 0x78, 0x2b, 0x32, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, - 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, - 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x61, 0x78, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, - 0x3d, 0x27, 0x23, 0x30, 0x30, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x32, 0x70, 0x78, 0x20, 0x73, - 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x28, - 0x61, 0x78, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x78, - 0x2b, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, - 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x32, - 0x2b, 0x34, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, - 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, - 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, - 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, - 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, - 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, - 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, - 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, - 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, - 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, - 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, - 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, - 0x28, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x58, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, - 0x73, 0x68, 0x28, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, - 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, - 0x70, 0x75, 0x73, 0x68, 0x28, 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, - 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, - 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, - 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x69, 0x66, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x5b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3d, - 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, - 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x5b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2a, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x59, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, - 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, - 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x60, 0x72, 0x67, 0x62, - 0x61, 0x28, 0x33, 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, - 0x2c, 0x24, 0x7b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x7d, 0x29, 0x60, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, - 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x61, 0x72, 0x63, 0x28, - 0x78, 0x2c, 0x79, 0x2c, 0x34, 0x2c, 0x30, 0x2c, 0x4d, 0x61, 0x74, 0x68, - 0x2e, 0x50, 0x49, 0x2a, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, - 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x30, 0x3b, 0x69, 0x3c, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x69, 0x2b, 0x2b, 0x29, 0x7b, 0x69, - 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, - 0x5b, 0x69, 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x26, 0x26, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x5b, 0x69, 0x2b, 0x31, 0x5d, - 0x3d, 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x78, 0x31, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x58, 0x5b, 0x69, 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, - 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x31, 0x3d, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x69, - 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, 0x30, 0x30, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x32, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x5b, 0x69, 0x2b, 0x31, - 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, 0x30, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x32, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x69, 0x2b, 0x31, 0x5d, - 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, 0x30, 0x30, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x3d, 0x69, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x2d, 0x31, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x3d, 0x28, 0x69, 0x2b, 0x31, - 0x29, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, - 0x6e, 0x74, 0x3d, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, - 0x65, 0x6e, 0x74, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x2c, 0x78, 0x32, - 0x2c, 0x79, 0x32, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, - 0x6f, 0x70, 0x28, 0x30, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, - 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, 0x24, 0x7b, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x74, 0x61, 0x72, 0x74, 0x7d, 0x29, - 0x60, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, - 0x28, 0x31, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, 0x33, 0x2c, - 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, 0x24, 0x7b, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x7d, 0x29, 0x60, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, - 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, - 0x6f, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x32, 0x2c, 0x79, - 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, - 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x67, 0x72, 0x61, 0x64, 0x69, - 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, - 0x0a, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, - 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, - 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, - 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x30, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, - 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, - 0x30, 0x2c, 0x30, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x30, 0x29, - 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, - 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x48, - 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, + 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, + 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, + 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, + 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x49, 0x4d, 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, @@ -1179,21 +828,19 @@ const unsigned char _index_html[] = { 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, - 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, - 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, - 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, - 0x30, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, - 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, - 0x37, 0x36, 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x38, 0x30, 0x2c, - 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, - 0x3d, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x3b, 0x74, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, + 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, + 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, + 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x3d, 0x7b, 0x78, 0x3a, + 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, 0x2c, 0x79, 0x3a, + 0x27, 0x23, 0x34, 0x63, 0x61, 0x66, 0x35, 0x30, 0x27, 0x2c, 0x7a, 0x3a, + 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, 0x66, 0x33, 0x27, 0x7d, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, @@ -1212,49 +859,30 @@ const unsigned char _index_html[] = { 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, - 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, - 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, - 0x65, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, - 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x4d, - 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, - 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x78, + 0x2c, 0x79, 0x2c, 0x7a, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x58, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x78, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x5a, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, - 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, - 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, - 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, + 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, @@ -1263,1103 +891,1482 @@ const unsigned char _index_html[] = { 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, - 0x68, 0x3d, 0x31, 0x3b, 0x5b, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x31, - 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2a, 0x28, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, - 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, - 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, - 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, - 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x36, 0x36, 0x36, - 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, - 0x31, 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, - 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x74, 0x65, 0x78, - 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x27, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x3d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x2b, 0x22, 0x6b, 0x42, 0x22, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, - 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, - 0x2d, 0x34, 0x2c, 0x79, 0x2d, 0x32, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x63, + 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, + 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2b, 0x31, 0x29, 0x2f, + 0x32, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, + 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, + 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, + 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, + 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, + 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x74, 0x78, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, + 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, + 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x58, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2c, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x41, 0x78, 0x69, 0x73, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, + 0x7a, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, + 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, + 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, + 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x31, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x73, 0x3d, 0x5b, 0x2d, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x5d, 0x3b, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2d, 0x28, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2b, 0x31, 0x29, 0x2f, + 0x32, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, + 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x79, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, + 0x4c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x38, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x34, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x32, 0x30, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x27, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, + 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x30, 0x2e, + 0x38, 0x29, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x52, 0x65, 0x63, 0x74, 0x28, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x69, 0x74, 0x65, + 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x33, 0x2b, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x2c, 0x69, 0x74, 0x65, 0x6d, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x61, 0x78, 0x65, 0x73, 0x3d, 0x5b, 0x7b, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x3a, 0x27, 0x58, 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, + 0x78, 0x7d, 0x2c, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x59, + 0x27, 0x2c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2e, 0x79, 0x7d, 0x2c, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3a, 0x27, 0x5a, 0x27, 0x2c, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x73, 0x2e, 0x7a, 0x7d, 0x5d, 0x3b, 0x61, 0x78, 0x65, 0x73, + 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x61, 0x78, + 0x69, 0x73, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x78, 0x3d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2b, + 0x69, 0x74, 0x65, 0x6d, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2a, 0x69, 0x2b, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x69, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, + 0x28, 0x78, 0x2b, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, + 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x28, 0x78, 0x2b, 0x32, 0x35, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x2f, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x61, 0x78, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x30, 0x30, 0x30, 0x27, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, 0x3d, 0x27, 0x31, 0x32, 0x70, 0x78, + 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, 0x78, + 0x74, 0x28, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x2c, 0x78, 0x2b, 0x33, 0x30, 0x2c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2b, 0x69, 0x74, 0x65, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2f, 0x32, 0x2b, 0x34, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, + 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x58, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x59, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x5a, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x32, 0x31, 0x39, 0x36, + 0x66, 0x33, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, + 0x27, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, + 0x3e, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, + 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, + 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x63, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, + 0x65, 0x63, 0x74, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x7a, 0x29, 0x7b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x58, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, + 0x70, 0x75, 0x73, 0x68, 0x28, 0x79, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x5a, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x7a, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2e, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, + 0x28, 0x30, 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, 0x29, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, + 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x5a, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x58, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, 0x30, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x2f, 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, + 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x60, 0x72, + 0x67, 0x62, 0x61, 0x28, 0x33, 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, + 0x34, 0x33, 0x2c, 0x24, 0x7b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x7d, 0x29, + 0x60, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, + 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x61, 0x72, + 0x63, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x34, 0x2c, 0x30, 0x2c, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x50, 0x49, 0x2a, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x6f, + 0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x3d, 0x30, 0x3b, 0x69, 0x3c, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x3b, 0x69, 0x2b, 0x2b, 0x29, + 0x7b, 0x69, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x5a, 0x5b, 0x69, 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x26, 0x26, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x5b, 0x69, 0x2b, + 0x31, 0x5d, 0x3d, 0x3d, 0x3d, 0x31, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x78, 0x31, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x58, 0x5b, 0x69, 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x2f, 0x31, 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, + 0x31, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, + 0x5b, 0x69, 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, + 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x32, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x5b, 0x69, + 0x2b, 0x31, 0x5d, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2f, 0x31, 0x30, + 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x32, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x59, 0x5b, 0x69, 0x2b, + 0x31, 0x5d, 0x2a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x31, 0x30, + 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x69, 0x2f, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x3d, 0x28, 0x69, + 0x2b, 0x31, 0x29, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x58, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x3d, 0x63, 0x74, 0x78, 0x2e, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, + 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x2c, + 0x78, 0x32, 0x2c, 0x79, 0x32, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x53, 0x74, 0x6f, 0x70, 0x28, 0x30, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, + 0x28, 0x33, 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, + 0x24, 0x7b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x7d, 0x29, 0x60, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x64, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x74, + 0x6f, 0x70, 0x28, 0x31, 0x2c, 0x60, 0x72, 0x67, 0x62, 0x61, 0x28, 0x33, + 0x33, 0x2c, 0x31, 0x35, 0x30, 0x2c, 0x32, 0x34, 0x33, 0x2c, 0x24, 0x7b, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x64, 0x7d, 0x29, 0x60, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, + 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x6f, 0x28, 0x78, 0x31, 0x2c, 0x79, 0x31, 0x29, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x32, + 0x2c, 0x79, 0x32, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x67, 0x72, 0x61, + 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x7d, + 0x7d, 0x7d, 0x0a, 0x64, 0x72, 0x61, 0x77, 0x47, 0x72, 0x69, 0x64, 0x28, + 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, + 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x27, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x30, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, - 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, - 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, - 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, + 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, + 0x6f, 0x28, 0x30, 0x2c, 0x30, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, + 0x30, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, 0x29, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x33, 0x30, 0x29, + 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x30, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x34, 0x63, 0x61, + 0x66, 0x35, 0x30, 0x27, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x27, 0x72, 0x67, 0x62, + 0x61, 0x28, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x37, 0x35, 0x2c, 0x20, 0x38, + 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x31, 0x29, 0x27, 0x3b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x27, 0x23, 0x66, 0x34, 0x34, 0x33, 0x33, 0x36, 0x27, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x3b, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x72, 0x65, + 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x28, 0x29, 0x29, 0x3b, 0x7d, 0x0a, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x28, 0x29, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x74, 0x3d, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x67, 0x65, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x74, 0x28, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x72, 0x65, 0x63, 0x74, + 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3d, 0x72, 0x65, 0x63, 0x74, 0x2e, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, + 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, + 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x7b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, - 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, - 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, - 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, + 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x31, 0x2e, 0x32, 0x29, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x3b, 0x7d, + 0x0a, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x63, 0x74, 0x78, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x74, 0x78, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x2e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x3b, 0x63, 0x74, 0x78, + 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x65, 0x63, 0x74, 0x28, 0x30, + 0x2c, 0x30, 0x2c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, + 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, 0x69, 0x74, 0x65, 0x6d, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x29, 0x3d, 0x3e, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x29, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x3d, 0x3e, + 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, + 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3c, 0x32, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, + 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x31, 0x3b, 0x5b, 0x30, 0x2c, 0x30, 0x2e, 0x35, + 0x2c, 0x31, 0x5d, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x2d, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2a, 0x28, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, + 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, - 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x30, 0x2c, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x43, - 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, - 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, - 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, - 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, - 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, - 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, - 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, - 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, - 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, - 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, - 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, + 0x74, 0x68, 0x2c, 0x79, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x27, 0x23, 0x36, + 0x36, 0x36, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x6f, 0x6e, 0x74, + 0x3d, 0x27, 0x31, 0x30, 0x70, 0x78, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, + 0x73, 0x65, 0x72, 0x69, 0x66, 0x27, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x74, + 0x65, 0x78, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x27, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x3d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x2b, 0x22, 0x6b, 0x42, + 0x22, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x54, 0x65, + 0x78, 0x74, 0x28, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2c, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x2d, 0x34, 0x2c, 0x79, 0x2d, 0x32, 0x29, 0x3b, 0x7d, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, + 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, + 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, + 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, + 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, + 0x30, 0x2c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x63, 0x74, + 0x78, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, + 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x53, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x66, + 0x69, 0x6c, 0x6c, 0x28, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, + 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, + 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, 0x3e, 0x7b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, + 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, + 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, + 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, + 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, + 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x62, + 0x65, 0x67, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, + 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2f, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, + 0x3d, 0x3d, 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, + 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, + 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, - 0x28, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, - 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x3e, 0x31, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x3b, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x4d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, - 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x7b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2c, 0x69, 0x29, 0x3d, - 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x78, 0x3d, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x2d, 0x31, 0x29, 0x29, 0x2a, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x79, 0x3d, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x2d, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x29, 0x2a, 0x28, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x29, 0x2b, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x3d, 0x3d, - 0x3d, 0x30, 0x29, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6d, 0x6f, 0x76, 0x65, - 0x54, 0x6f, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x7b, 0x63, 0x74, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, - 0x28, 0x78, 0x2c, 0x79, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x63, 0x74, - 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x53, 0x74, 0x79, 0x6c, - 0x65, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x4c, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x63, 0x74, 0x78, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x32, 0x3b, - 0x63, 0x74, 0x78, 0x2e, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x28, 0x29, - 0x3b, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, 0x65, 0x74, - 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, - 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, - 0x20, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x6c, 0x65, - 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x27, - 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, - 0x6f, 0x77, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x28, - 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x77, - 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, - 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x29, 0x3b, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, - 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x27, 0x2b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2b, - 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, 0x7d, 0x0a, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x7b, 0x64, 0x6f, 0x63, + 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, + 0x65, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3b, 0x6c, 0x65, + 0x74, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x6f, + 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, + 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x3d, 0x27, 0x27, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x6e, 0x6f, 0x77, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, + 0x65, 0x28, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x27, - 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, - 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x28, 0x69, 0x70, 0x29, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x69, 0x70, 0x2e, 0x74, 0x72, 0x69, - 0x6d, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, - 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x2c, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x29, 0x3b, 0x66, 0x65, - 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x7d, 0x0a, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x4d, - 0x61, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, - 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, - 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x29, 0x0a, - 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, - 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, - 0x28, 0x27, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x70, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, - 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x74, 0x65, - 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, + 0x29, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x27, 0x2b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2b, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x7b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x27, 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x28, 0x69, 0x70, 0x29, 0x7b, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x69, 0x70, 0x2e, 0x74, + 0x72, 0x69, 0x6d, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x74, + 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x27, 0x2c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x29, 0x3b, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, + 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x69, 0x66, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, + 0x29, 0x0a, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3f, 0x27, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3a, 0x27, 0x4e, - 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x27, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, - 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, - 0x74, 0x72, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, - 0x67, 0x6c, 0x65, 0x28, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x27, 0x2c, - 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, - 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x4a, - 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x4a, 0x53, - 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x29, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3d, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, + 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3f, + 0x27, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3a, + 0x27, 0x4e, 0x6f, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x27, 0x3b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x28, 0x27, 0x74, 0x72, 0x75, 0x65, 0x27, 0x2c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x3b, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x28, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x27, 0x2c, 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x72, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, + 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x79, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x29, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x69, 0x66, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x26, 0x26, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, + 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x7d, 0x29, 0x3b, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x26, 0x26, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, - 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, - 0x6f, 0x6d, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x3d, 0x3e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, + 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, + 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, + 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2d, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3b, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x3d, + 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, - 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x3d, 0x3d, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3d, 0x74, - 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2d, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x3b, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x3d, 0x28, 0x74, - 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x70, 0x75, 0x2f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, - 0x2a, 0x31, 0x30, 0x30, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, - 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x62, 0x2e, 0x63, 0x70, 0x75, - 0x5f, 0x70, 0x63, 0x2d, 0x61, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, - 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, 0x73, - 0x6b, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x3d, 0x32, 0x31, 0x34, 0x37, 0x34, - 0x38, 0x33, 0x36, 0x34, 0x37, 0x29, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x22, 0x3b, 0x7d, - 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, 0x61, - 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, - 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, - 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, - 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x42, 0x3c, 0x2f, 0x74, 0x64, 0x3e, - 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, - 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x25, - 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, - 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, - 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x7d, 0x3c, 0x2f, - 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x42, 0x6f, - 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, - 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, - 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, - 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x65, - 0x61, 0x70, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x69, 0x6e, - 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x68, - 0x65, 0x61, 0x70, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, 0x72, 0x2e, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, - 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, - 0x65, 0x61, 0x70, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x20, 0x48, 0x65, 0x61, 0x70, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x66, 0x72, 0x65, + 0x65, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x73, 0x6f, 0x72, + 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x62, 0x2e, 0x63, + 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2d, 0x61, 0x2e, 0x63, 0x70, 0x75, 0x5f, + 0x70, 0x63, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x74, + 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x61, 0x73, + 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x3d, 0x3d, 0x32, 0x31, 0x34, + 0x37, 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x29, 0x7b, 0x74, 0x61, 0x73, + 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x22, + 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, + 0x74, 0x61, 0x73, 0x6b, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, + 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, + 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, + 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x7d, 0x42, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, + 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x63, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, + 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, + 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x24, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x7d, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, + 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, + 0x3b, 0x7d, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x3d, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x42, + 0x61, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, + 0x70, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, + 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x3d, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x65, + 0x5f, 0x68, 0x65, 0x61, 0x70, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x42, 0x61, + 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, + 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x6f, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, 0x2d, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x20, 0x48, 0x65, + 0x61, 0x70, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x70, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x66, + 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, + 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, + 0x7d, 0x6b, 0x42, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x28, 0x6d, + 0x69, 0x6e, 0x3a, 0x24, 0x7b, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, - 0x42, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x28, 0x6d, 0x69, 0x6e, - 0x3a, 0x24, 0x7b, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, - 0x65, 0x61, 0x70, 0x2f, 0x31, 0x30, 0x32, 0x34, 0x29, 0x2e, 0x74, 0x6f, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x6b, 0x42, 0x29, - 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, - 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x63, 0x61, 0x6e, 0x76, - 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, - 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x42, - 0x61, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, 0x29, - 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x68, - 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x67, 0x65, 0x74, - 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x28, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x68, 0x65, 0x61, 0x70, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, - 0x61, 0x70, 0x27, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, - 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, + 0x42, 0x29, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x22, 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, 0x65, 0x61, - 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, - 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, - 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, - 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, - 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, - 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x72, 0x65, 0x65, - 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, - 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x48, - 0x65, 0x61, 0x70, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x48, - 0x65, 0x61, 0x70, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x49, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x3b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x27, - 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x3d, 0x22, 0x4c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x28, 0x29, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x73, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x41, 0x72, 0x72, 0x61, 0x79, - 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, - 0x65, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x3d, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, 0x2e, 0x74, - 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x65, - 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x49, 0x64, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x29, 0x3b, 0x7d, - 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, - 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, - 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, - 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, - 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, - 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, - 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, - 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x74, 0x79, - 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, - 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, - 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, - 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, - 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x70, 0x42, 0x61, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x3d, 0x68, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x27, 0x68, 0x65, 0x61, 0x70, 0x27, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x48, 0x65, 0x61, 0x70, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x68, 0x65, 0x61, + 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x27, + 0x68, 0x65, 0x61, 0x70, 0x27, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, + 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x68, + 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x3d, 0x68, 0x65, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, + 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x72, + 0x65, 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x69, + 0x6e, 0x48, 0x65, 0x61, 0x70, 0x28, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, + 0x65, 0x48, 0x65, 0x61, 0x70, 0x29, 0x3b, 0x7d, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x7b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x29, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x27, 0x29, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x4c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x3d, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2d, 0x67, 0x72, 0x69, 0x64, 0x27, 0x29, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x3d, 0x6e, + 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0x3b, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x28, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, + 0x3d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x29, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x49, 0x64, 0x2c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x29, + 0x3b, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, + 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21, + 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, + 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, 0x31, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2d, - 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x66, 0x6f, - 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x44, 0x69, 0x76, 0x3d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x67, 0x65, 0x74, - 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x21, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, - 0x76, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x3d, 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x69, - 0x74, 0x65, 0x6d, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, - 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, - 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, - 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, 0x3d, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, - 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x74, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x3d, 0x74, 0x79, 0x70, 0x65, - 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x27, 0x26, 0x26, 0x27, 0x78, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, - 0x27, 0x79, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x7a, 0x27, 0x69, - 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, - 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, - 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, - 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, - 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, - 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, - 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, - 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x3d, - 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, - 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, - 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x64, 0x69, - 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x24, - 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5b, - 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, 0x3e, 0x60, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, - 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, - 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, - 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x6c, 0x75, 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x61, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x21, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x27, 0x26, 0x26, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x62, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2d, 0x31, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, + 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x3d, 0x3e, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x3d, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x44, 0x69, 0x76, 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, + 0x69, 0x76, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x27, 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x2e, 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x69, 0x76, + 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x28, 0x27, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, + 0x65, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x3d, 0x74, 0x79, + 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x27, 0x26, 0x26, 0x27, 0x78, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, - 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, - 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, - 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x0a, 0x65, + 0x26, 0x26, 0x27, 0x79, 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x26, 0x26, 0x27, 0x7a, + 0x27, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, + 0x55, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, + 0x3d, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, + 0x5d, 0x29, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, + 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, + 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, + 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x3d, 0x3d, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x7b, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x60, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3e, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x28, 0x5b, 0x6b, 0x65, 0x79, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x3d, + 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x24, 0x7b, 0x6b, 0x65, + 0x79, 0x7d, 0x3a, 0x24, 0x7b, 0x76, 0x61, 0x6c, 0x2e, 0x74, 0x6f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, + 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x27, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x65, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, - 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, - 0x29, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, - 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, - 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, 0x7b, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, 0x7d, + 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x27, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, + 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, 0x24, + 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, 0x7d, + 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x3d, 0x3d, 0x27, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x27, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x73, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x29, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, + 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x28, 0x33, 0x29, 0x3b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, - 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, - 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, - 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x3b, 0x6c, - 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x27, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, 0x21, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x27, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x63, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, 0x3e, 0x3c, - 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x27, 0x3b, 0x73, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, - 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x21, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, 0x6c, - 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, 0x67, 0x65, - 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x7b, - 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x69, 0x66, - 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x2e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x54, 0x4f, 0x55, - 0x43, 0x48, 0x5f, 0x53, 0x43, 0x52, 0x45, 0x45, 0x4e, 0x27, 0x29, 0x29, - 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x53, - 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x4d, 0x55, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, - 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x7b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x3a, 0x33, 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, - 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, - 0x72, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x73, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, - 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, - 0x64, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, 0x65, 0x6c, - 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3d, 0x67, + 0x6d, 0x6c, 0x3d, 0x60, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x24, 0x7b, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x22, 0x3e, + 0x24, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x60, 0x3b, + 0x7d, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x48, 0x74, 0x6d, 0x6c, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x7d, 0x0a, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x44, 0x69, 0x76, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, + 0x4d, 0x4c, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x74, 0x6d, 0x6c, + 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x26, 0x26, 0x21, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x27, - 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, 0x78, 0x3d, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, - 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, - 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, - 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x2c, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x79, 0x2c, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2e, 0x7a, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, - 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x73, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x49, 0x64, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2e, - 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x3d, - 0x3e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, 0x3d, 0x3d, - 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x29, 0x7b, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, 0x64, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, - 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, 0x3b, 0x73, + 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x27, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x27, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x3c, 0x63, 0x61, 0x6e, + 0x76, 0x61, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2d, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x22, + 0x3e, 0x3c, 0x2f, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x3e, 0x27, 0x3b, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2e, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x21, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x26, 0x26, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x29, + 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2e, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x49, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x7d, 0x0a, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, - 0x61, 0x29, 0x0a, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, - 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x3d, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, - 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x29, 0x7b, 0x70, 0x72, - 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, - 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, - 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x74, 0x6f, - 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, - 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x74, 0x6f, 0x70, - 0x43, 0x61, 0x72, 0x64, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x3d, 0x27, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x70, - 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x64, 0x61, 0x73, 0x68, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, 0x70, 0x72, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x28, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, - 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, - 0x6e, 0x64, 0x28, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, - 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x73, - 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, - 0x6e, 0x65, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2f, 0x0a, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2a, 0x31, 0x30, 0x30, 0x29, - 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x69, 0x6e, 0x6e, - 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x68, 0x32, 0x3e, - 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x0a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x77, 0x61, - 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, - 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x61, 0x69, - 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x20, 0x57, 0x61, - 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x50, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, - 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x2d, 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, + 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, + 0x64, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x29, 0x7b, 0x69, 0x66, 0x28, 0x69, 0x73, 0x49, 0x4d, 0x55, 0x29, 0x7b, + 0x69, 0x66, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, + 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x54, + 0x4f, 0x55, 0x43, 0x48, 0x5f, 0x53, 0x43, 0x52, 0x45, 0x45, 0x4e, 0x27, + 0x29, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, + 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x4d, + 0x55, 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x3b, 0x7d, + 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x28, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x7b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x3a, 0x33, 0x30, 0x2c, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, + 0x69, 0x6c, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x6d, 0x69, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x28, 0x30, 0x2e, 0x30, 0x29, 0x7d, 0x29, 0x3b, 0x7d, + 0x0a, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x2e, 0x69, 0x64, 0x2c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3d, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x74, + 0x78, 0x3d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x63, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x28, 0x27, 0x32, 0x64, 0x27, 0x29, 0x3b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x43, 0x61, 0x6e, 0x76, + 0x61, 0x73, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x69, 0x73, + 0x49, 0x4d, 0x55, 0x29, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, + 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x2c, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x79, 0x2c, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x7a, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x29, 0x3b, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x2c, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3d, 0x3e, 0x7b, 0x69, 0x66, 0x28, + 0x21, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x73, 0x2e, 0x73, 0x6f, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x3d, 0x3e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2e, 0x69, 0x64, + 0x3d, 0x3d, 0x3d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, + 0x29, 0x7b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x47, 0x72, 0x69, + 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x28, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x44, 0x69, 0x76, 0x29, + 0x3b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x49, 0x64, 0x29, 0x3b, 0x7d, 0x7d, 0x29, 0x3b, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x0a, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x27, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, + 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x29, 0x7b, + 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x6c, 0x65, 0x74, 0x20, + 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, + 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, + 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, + 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x64, 0x69, 0x76, 0x27, 0x29, 0x3b, 0x74, + 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x63, 0x61, 0x72, 0x64, 0x20, 0x74, + 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x64, 0x61, 0x73, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x69, 0x76, 0x2e, 0x70, 0x72, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, + 0x64, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x73, 0x74, 0x65, 0x70, 0x2e, + 0x64, 0x6f, 0x6e, 0x65, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x2f, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, + 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x2a, 0x31, 0x30, + 0x30, 0x29, 0x3b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x68, + 0x32, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x0a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, + 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x27, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, + 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x20, + 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, + 0x7d, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x24, 0x7b, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x7d, 0x25, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, - 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x28, 0x32, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, - 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x75, 0x75, 0x69, 0x64, 0x22, 0x3e, 0x3c, - 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x20, 0x49, 0x44, 0x3a, 0x3c, 0x62, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, - 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x64, 0x61, 0x74, + 0x72, 0x65, 0x73, 0x73, 0x2d, 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x24, 0x7b, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x7d, 0x25, 0x22, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x74, 0x69, 0x6d, 0x65, + 0x22, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x24, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x6d, 0x61, 0x70, - 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x60, 0x3c, 0x64, 0x69, 0x76, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, - 0x20, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, 0x65, - 0x20, 0x3f, 0x20, 0x27, 0x64, 0x6f, 0x6e, 0x65, 0x27, 0x20, 0x3a, 0x20, - 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x7d, 0x22, 0x3e, - 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, 0x6e, - 0x65, 0x3f, 0x27, 0xe2, 0x9c, 0x93, 0x27, 0x3a, 0x27, 0xe2, 0x97, 0x8b, - 0x27, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, - 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, - 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, 0x7b, 0x73, - 0x74, 0x65, 0x70, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x7d, 0x3c, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, - 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, - 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, - 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x73, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x0a, 0x24, - 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x7c, - 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x3d, - 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, - 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, - 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, - 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, - 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, - 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, - 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, - 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x70, 0x72, - 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, 0x72, 0x65, - 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, - 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x70, - 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, - 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, 0x70, 0x43, - 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, - 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, - 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, - 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, 0x2a, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, 0x3b, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x28, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, 0x6f, 0x72, - 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x29, - 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, - 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, - 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6c, - 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x27, - 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, - 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, + 0x73, 0x6b, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x75, 0x75, 0x69, 0x64, 0x22, + 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x3c, 0x62, 0x3e, 0x24, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x2d, 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x73, 0x74, 0x65, 0x70, 0x3d, 0x3e, 0x60, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, + 0x65, 0x70, 0x20, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, 0x6f, + 0x6e, 0x65, 0x20, 0x3f, 0x20, 0x27, 0x64, 0x6f, 0x6e, 0x65, 0x27, 0x20, + 0x3a, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x7d, + 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x3e, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x64, + 0x6f, 0x6e, 0x65, 0x3f, 0x27, 0xe2, 0x9c, 0x93, 0x27, 0x3a, 0x27, 0xe2, + 0x97, 0x8b, 0x27, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x73, 0x74, 0x65, 0x70, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x24, + 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x24, 0x7b, 0x73, 0x74, + 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x3d, 0x30, 0x2e, + 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x73, 0x74, 0x65, 0x70, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x66, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x73, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, + 0x0a, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x28, 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, + 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, + 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, + 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, + 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, + 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, + 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, + 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, - 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, - 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x27, - 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, - 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, - 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x73, 0x76, - 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, - 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, - 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, - 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, - 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x3e, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, - 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, - 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, - 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5c, - 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6c, 0x69, 0x6e, 0x65, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x65, 0x67, 0x65, 0x78, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, - 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6c, - 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x3b, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, - 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, 0x2c, 0x74, 0x61, 0x73, - 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5d, 0x3d, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x74, - 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, - 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, - 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x69, 0x73, - 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, 0x29, 0x3d, 0x3d, 0x3d, - 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, - 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x3a, 0x4a, - 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x73, 0x74, - 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x29, 0x7d, 0x3b, - 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x21, 0x3d, - 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, - 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, 0x2e, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, 0x2e, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, - 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, - 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, - 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, - 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, - 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, - 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x63, - 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, - 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x2e, 0x74, 0x6f, 0x46, - 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x74, - 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x3f, 0x27, 0xf0, - 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, 0xa4, 0x96, 0x27, 0x7d, - 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, - 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, 0x75, 0x62, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, 0x29, 0x7d, 0x2e, - 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, - 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x7d, 0x3c, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, - 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, - 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, 0x2c, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, + 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, + 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, + 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, + 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, + 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, + 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, + 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, + 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, + 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, + 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, + 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, + 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, + 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, + 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, + 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, + 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, + 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, + 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5c, 0x5b, 0x2e, + 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x65, 0x67, 0x65, 0x78, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x29, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, + 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x3b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x0a, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, 0x2c, 0x74, 0x61, 0x73, 0x6b, 0x4e, + 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x2c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x69, 0x73, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, + 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x5d, 0x3d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x28, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x29, 0x2c, 0x69, 0x73, 0x48, + 0x75, 0x6d, 0x61, 0x6e, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, + 0x74, 0x28, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, + 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x28, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x29, 0x7d, 0x3b, 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, + 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, + 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, + 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, + 0x77, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, + 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, + 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, + 0x75, 0x6d, 0x61, 0x6e, 0x3f, 0x27, 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, + 0x27, 0xf0, 0x9f, 0xa4, 0x96, 0x27, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, + 0x24, 0x7b, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, + 0x33, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, + 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, + 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, + 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, + 0x29, 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, + 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x60, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, + 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, + 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, + 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, - 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, - 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, - 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x70, 0x7c, 0x7c, - 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, - 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, - 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, - 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, - 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, - 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x7b, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, 0x69, 0x70, 0x2c, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x70, - 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, + 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, + 0x70, 0x7c, 0x7c, 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, + 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, + 0x79, 0x28, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, + 0x69, 0x70, 0x2c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, - 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x4c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, - 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x28, - 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, 0x75, 0x72, - 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, - 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3f, - 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, - 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, - 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, - 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, - 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, - 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, 0x65, 0x61, 0x72, - 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, - 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, - 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, - 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, - 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, - 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, - 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, - 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x61, 0x27, 0x29, - 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, 0x65, 0x66, 0x27, - 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x2f, - 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, 0x2b, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, - 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, 0x6e, 0x6f, 0x6e, - 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, - 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x64, 0x6c, - 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, - 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x7b, - 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, - 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, - 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, - 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, 0x72, 0x64, 0x66, - 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, - 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, - 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, - 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, - 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, - 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x22, - 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x75, - 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, - 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, 0x52, 0x44, - 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, - 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x74, 0x72, 0x79, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x3d, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x77, 0x73, - 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x77, 0x73, - 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, 0x6e, 0x65, 0x77, - 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x74, - 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, - 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x4a, - 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x69, 0x66, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, - 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, - 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, - 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, - 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, + 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x28, 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x3f, 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x7d, 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, + 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, + 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, + 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, + 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, + 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, + 0x61, 0x27, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, + 0x65, 0x66, 0x27, 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, + 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, + 0x29, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, + 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, + 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, + 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, + 0x64, 0x79, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, + 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x2b, 0x22, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, + 0x72, 0x64, 0x66, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, + 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, + 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, + 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, + 0x74, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x2e, 0x75, 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, + 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, + 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, + 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, + 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, + 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, + 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, + 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, + 0x2f, 0x77, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, + 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, + 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, - 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, - 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x7d, - 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x27, 0x2c, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x74, 0x61, 0x73, - 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x2e, 0x20, - 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, - 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, - 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, - 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, - 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x28, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, - 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, + 0x22, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, + 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, - 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x3b, 0x7d, - 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x22, 0x2c, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, - 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, 0x4f, 0x4d, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x65, - 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, - 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x6c, - 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3d, - 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x28, - 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x3c, 0x2f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, - 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e + 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, + 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, + 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x5f, 0x77, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, + 0x7d, 0x3b, 0x7d, 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, + 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, + 0x4f, 0x4d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, + 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, + 0x50, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, + 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, + 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x49, 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, + 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x3d, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x28, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, + 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e }; -unsigned int _index_html_len = 28208; +unsigned int _index_html_len = 28295; #endif /* INDEX_H */ diff --git a/idf/taskboard/main/task/ParallelTask.hpp b/idf/taskboard/main/task/ParallelTask.hpp index c3dbe17..2b87b1b 100644 --- a/idf/taskboard/main/task/ParallelTask.hpp +++ b/idf/taskboard/main/task/ParallelTask.hpp @@ -101,6 +101,26 @@ struct ParallelTask : return steps_score_[step]; } + /// Virtual method implementation + float final_score() const override + { + float final_score = 0; + uint16_t steps_scored_count = 0; + for (const float step_score : steps_score_) + { + if (step_score >= 0.0) + { + final_score += step_score; + steps_scored_count++; + } + } + if (steps_scored_count > 0) + { + final_score /= steps_scored_count; + } + return final_score; + } + /// Virtual method implementation int64_t step_done_time( size_t step) const override diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index df32151..4d19505 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -125,6 +125,26 @@ struct SequentialTask : return steps_score_[step]; } + /// Virtual method implementation + float final_score() const override + { + float final_score = 0; + uint16_t steps_scored_count = 0; + for (const float step_score : steps_score_) + { + if (step_score >= 0.0) + { + final_score += step_score; + steps_scored_count++; + } + } + if (steps_scored_count > 0) + { + final_score /= steps_scored_count; + } + return final_score; + } + /// Virtual method implementation int64_t step_done_time( size_t step) const override diff --git a/idf/taskboard/main/task/Task.hpp b/idf/taskboard/main/task/Task.hpp index 4e9a74b..3723e13 100644 --- a/idf/taskboard/main/task/Task.hpp +++ b/idf/taskboard/main/task/Task.hpp @@ -73,6 +73,13 @@ struct Task virtual float step_score( size_t step) const = 0; + /** + * @brief Gets the final score of the protocol + * + * @return Score of the protocol + */ + virtual float final_score() const = 0; + /** * @brief Gets step done time * diff --git a/idf/taskboard/web_interfaces/index.html b/idf/taskboard/web_interfaces/index.html index 8c8db00..fa08f1d 100644 --- a/idf/taskboard/web_interfaces/index.html +++ b/idf/taskboard/web_interfaces/index.html @@ -516,9 +516,10 @@

Leaderboard + - + @@ -1389,7 +1390,7 @@

${data.current_task.name} .filter(line => line.trim()) // Remove empty lines .map(line => { // Match values using regex to handle the JSON array correctly - const regex = /([^,]+),([^,]+),([^,]+),([^,]+),(\[.*\])/; + const regex = /([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),(\[.*\])/; const match = line.match(regex); if (!match) { @@ -1397,11 +1398,12 @@

${data.current_task.name} return null; } - const [, taskName, timestamp, isHuman, uniqueId, steps_times] = match; + const [, taskName, timestamp, score, isHuman, uniqueId, steps_times] = match; return { taskName, timestamp: parseInt(timestamp, 10), + score: parseFloat(score), isHuman: parseInt(isHuman, 10) === 1, uniqueId, steps_times: JSON.parse(steps_times) @@ -1418,9 +1420,10 @@

${data.current_task.name} row.className = 'leaderboard-row'; row.innerHTML = ` +

- +
Task TimeScore UUID
${entry.isHuman ? '👤' : '🤖'} ${entry.taskName} ${(entry.timestamp / 1000000).toFixed(3)} s${entry.isHuman ? '👤' : '🤖'}${entry.score.toFixed(1)} % ${entry.uniqueId.substring(0, 8)}... ${entry.uniqueId} From b15064caf5a6452fd6b8be614084da5b8578161f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 09:54:57 +0000 Subject: [PATCH 18/35] Fix protocol total time initialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/task/SequentialTask.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index 4d19505..d029a84 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -62,7 +62,6 @@ struct SequentialTask : steps_score_.resize(steps_.size(), -1.0f); steps_finish_time_.resize(steps_.size(), -1); steps_completion_time_.resize(steps_.size(), -1); - steps_time_sum_ = 0; } if (current_step_ < steps_.size()) @@ -167,6 +166,7 @@ struct SequentialTask : void restart() override { current_step_ = 0; + steps_time_sum_ = 0; Task::restart(); } From 5415542c834591b3bab3bcc4cf36a4c1a5fab5c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 16 Apr 2025 10:02:12 +0000 Subject: [PATCH 19/35] Hide irrelevant step scores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/network/webpages/web_index.h | 769 +++++++++--------- idf/taskboard/web_interfaces/index.html | 2 +- 2 files changed, 386 insertions(+), 385 deletions(-) diff --git a/idf/taskboard/main/network/webpages/web_index.h b/idf/taskboard/main/network/webpages/web_index.h index 04d3161..1e4a474 100644 --- a/idf/taskboard/main/network/webpages/web_index.h +++ b/idf/taskboard/main/network/webpages/web_index.h @@ -2,8 +2,8 @@ #define INDEX_H /* - * Original size: 53,891 bytes - * Minified size: 28,284 bytes + * Original size: 53,899 bytes + * Minified size: 28,290 bytes * Saved: 47.5% */ @@ -1976,397 +1976,398 @@ const unsigned char _index_html[] = { 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x32, 0x29, 0x2b, 0x27, 0x20, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x0a, 0x24, 0x7b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x7c, 0x7c, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x3d, 0x3d, 0x30, 0x2e, 0x30, 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, - 0x6e, 0x3e, 0xc2, 0xb7, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, - 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, - 0x64, 0x28, 0x30, 0x29, 0x2b, 0x27, 0x25, 0x3c, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, - 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, - 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, - 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, - 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, - 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, - 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, - 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, - 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, - 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, - 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, - 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, - 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, - 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, - 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, + 0x65, 0x3e, 0x3d, 0x30, 0x2e, 0x30, 0x26, 0x26, 0x73, 0x74, 0x65, 0x70, + 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x3c, 0x31, 0x30, 0x30, 0x2e, 0x30, + 0x3f, 0x27, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0xc2, 0xb7, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, + 0x2b, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x30, 0x29, 0x2b, 0x27, + 0x25, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x27, 0x3a, 0x27, 0x27, + 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, + 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x60, 0x3b, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x7b, 0x69, 0x66, 0x28, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x3d, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x0a, 0x7b, 0x70, 0x72, 0x65, 0x76, 0x54, 0x61, 0x73, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x0a, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x61, 0x72, 0x64, 0x27, 0x29, + 0x3b, 0x69, 0x66, 0x28, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x29, + 0x7b, 0x74, 0x6f, 0x70, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x7d, 0x7d, 0x0a, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x3d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x3f, 0x35, 0x2a, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x65, 0x3a, 0x35, 0x30, 0x30, 0x30, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3d, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, + 0x64, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x28, 0x28, 0x29, 0x3d, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x2c, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x29, 0x3b, 0x74, 0x72, 0x79, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x3a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x7d, 0x29, 0x3b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, - 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, - 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, - 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, - 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, - 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, - 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, - 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, - 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, - 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, - 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, - 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, - 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, - 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, - 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, - 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5c, 0x5b, 0x2e, - 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x65, 0x67, 0x65, 0x78, 0x29, 0x3b, - 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x29, 0x7b, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, - 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x3b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x0a, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, 0x2c, 0x74, 0x61, 0x73, 0x6b, 0x4e, - 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x2c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x69, 0x73, 0x48, 0x75, - 0x6d, 0x61, 0x6e, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, - 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x5d, 0x3d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x31, 0x30, 0x29, 0x2c, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, - 0x74, 0x28, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x29, 0x2c, 0x69, 0x73, 0x48, - 0x75, 0x6d, 0x61, 0x6e, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, - 0x74, 0x28, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, - 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x28, 0x73, 0x74, 0x65, 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x29, 0x7d, 0x3b, 0x7d, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, - 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, - 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, - 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, - 0x77, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, - 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, - 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, - 0x75, 0x6d, 0x61, 0x6e, 0x3f, 0x27, 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, - 0x27, 0xf0, 0x9f, 0xa4, 0x96, 0x27, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, - 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, - 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, - 0x22, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, - 0x24, 0x7b, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x29, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, - 0x33, 0x29, 0x7d, 0x73, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, - 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, - 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, - 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, - 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, - 0x29, 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, - 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, - 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, - 0x3e, 0x60, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, - 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, - 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, - 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, - 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, - 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, - 0x70, 0x7c, 0x7c, 0x21, 0x70, 0x6f, 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, - 0x73, 0x6f, 0x6e, 0x27, 0x7d, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, - 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, - 0x79, 0x28, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, - 0x69, 0x70, 0x2c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x3a, 0x70, 0x6f, 0x72, 0x74, 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, - 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, - 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, - 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, - 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x28, 0x27, 0x41, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, - 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x3f, 0x27, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x3b, 0x7d, 0x0a, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, - 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, - 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, - 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, - 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, - 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x49, 0x64, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x6f, + 0x6b, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x3b, 0x7d, 0x7d, 0x0a, + 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, 0x74, 0x72, + 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x27, 0x2f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x3b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x57, 0x69, 0x74, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, - 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, - 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, - 0x78, 0x74, 0x29, 0x7b, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, - 0x61, 0x27, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, - 0x65, 0x66, 0x27, 0x2c, 0x27, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, - 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, - 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, - 0x29, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, - 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, - 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, - 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, - 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, - 0x64, 0x79, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, - 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x67, 0x65, 0x74, 0x55, 0x52, 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, - 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, - 0x2b, 0x22, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, - 0x72, 0x64, 0x66, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, - 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, - 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, - 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, - 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, - 0x74, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, - 0x78, 0x74, 0x29, 0x3d, 0x3e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x28, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x2e, 0x75, 0x72, 0x64, 0x66, 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, - 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, - 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, - 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, - 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, - 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, - 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, + 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, + 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3d, 0x63, + 0x73, 0x76, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x28, 0x32, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x3d, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x3e, 0x6c, 0x69, 0x6e, + 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x29, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x3d, 0x2f, 0x28, 0x5b, + 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, + 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, + 0x5e, 0x2c, 0x5d, 0x2b, 0x29, 0x2c, 0x28, 0x5b, 0x5e, 0x2c, 0x5d, 0x2b, + 0x29, 0x2c, 0x28, 0x5c, 0x5b, 0x2e, 0x2a, 0x5c, 0x5d, 0x29, 0x2f, 0x3b, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3d, + 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, + 0x65, 0x67, 0x65, 0x78, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x27, 0x4c, 0x69, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x3a, 0x27, 0x2c, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x75, 0x6c, 0x6c, 0x3b, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5b, + 0x2c, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x2c, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, 0x70, 0x73, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5d, 0x3d, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7b, 0x74, 0x61, 0x73, + 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x3a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, + 0x28, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x31, + 0x30, 0x29, 0x2c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x29, 0x2c, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x3a, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x69, 0x73, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x2c, 0x31, 0x30, 0x29, 0x3d, 0x3d, 0x3d, 0x31, 0x2c, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x2c, 0x73, 0x74, 0x65, + 0x70, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x3a, 0x4a, 0x53, 0x4f, + 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x73, 0x74, 0x65, 0x70, + 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x29, 0x7d, 0x3b, 0x7d, 0x29, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x3d, 0x3e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x21, 0x3d, 0x3d, 0x6e, + 0x75, 0x6c, 0x6c, 0x29, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x28, 0x61, + 0x2c, 0x62, 0x29, 0x3d, 0x3e, 0x61, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2d, 0x62, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, + 0x6f, 0x64, 0x79, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x79, 0x49, 0x64, 0x28, 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x27, 0x29, 0x3b, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, + 0x6f, 0x64, 0x79, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x3d, 0x27, 0x27, 0x3b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x66, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x28, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x3d, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x74, + 0x72, 0x27, 0x29, 0x3b, 0x72, 0x6f, 0x77, 0x2e, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2d, 0x72, 0x6f, 0x77, 0x27, 0x3b, + 0x72, 0x6f, 0x77, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, + 0x4c, 0x3d, 0x60, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x69, 0x73, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x3f, 0x27, + 0xf0, 0x9f, 0x91, 0xa4, 0x27, 0x3a, 0x27, 0xf0, 0x9f, 0xa4, 0x96, 0x27, + 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x74, 0x61, 0x73, 0x6b, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x2d, + 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, 0x24, 0x7b, 0x28, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2f, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x2e, 0x74, 0x6f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x28, 0x33, 0x29, 0x7d, 0x73, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x6f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x28, 0x31, 0x29, 0x7d, 0x25, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x75, 0x75, 0x69, 0x64, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x3e, + 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x49, 0x64, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x30, 0x2c, 0x38, 0x29, 0x7d, 0x2e, 0x2e, 0x2e, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x75, 0x75, 0x69, 0x64, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, + 0x22, 0x3e, 0x24, 0x7b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x7d, 0x3c, 0x2f, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x60, 0x3b, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x64, 0x79, + 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, + 0x28, 0x72, 0x6f, 0x77, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x7d, 0x63, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x63, 0x72, + 0x6f, 0x52, 0x4f, 0x53, 0x28, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x70, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, + 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x72, 0x74, + 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x72, 0x6f, 0x73, 0x2d, + 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x70, 0x7c, 0x7c, 0x21, 0x70, 0x6f, + 0x72, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, + 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x3d, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, + 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x72, 0x6f, + 0x73, 0x27, 0x3b, 0x66, 0x65, 0x74, 0x63, 0x68, 0x28, 0x75, 0x72, 0x6c, + 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, + 0x53, 0x54, 0x27, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, + 0x7b, 0x27, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, + 0x70, 0x65, 0x27, 0x3a, 0x27, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x7d, 0x2c, + 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x7b, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x3a, 0x69, 0x70, 0x2c, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x70, 0x6f, 0x72, 0x74, + 0x7d, 0x29, 0x7d, 0x29, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, + 0x72, 0x6f, 0x73, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x2d, 0x72, 0x6f, 0x73, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x27, 0x29, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x27, 0x27, 0x3b, 0x7d, 0x0a, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x7b, 0x69, 0x66, 0x28, + 0x21, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x28, 0x27, 0x41, 0x72, + 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3f, 0x27, 0x29, 0x29, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x7d, 0x0a, 0x74, 0x72, + 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x50, 0x3f, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x27, + 0x2f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x27, + 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x28, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x72, 0x6c, + 0x2c, 0x7b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x27, 0x50, 0x4f, + 0x53, 0x54, 0x27, 0x2c, 0x7d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x6f, 0x6b, 0x29, 0x7b, + 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, 0x50, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, + 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x77, + 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x7d, + 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, + 0x7b, 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, 0x7b, 0x6c, 0x65, + 0x74, 0x20, 0x64, 0x6c, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x61, 0x27, 0x29, 0x3b, 0x64, 0x6c, + 0x65, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x28, 0x27, 0x68, 0x72, 0x65, 0x66, 0x27, 0x2c, 0x27, 0x64, + 0x61, 0x74, 0x61, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, + 0x74, 0x66, 0x2d, 0x38, 0x2c, 0x27, 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x55, 0x52, 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, 0x64, 0x6c, 0x65, + 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x28, 0x27, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x27, + 0x2c, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x3b, 0x64, + 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x27, 0x6e, 0x6f, 0x6e, 0x65, 0x27, 0x3b, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, + 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x28, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0x64, 0x6c, 0x65, 0x2e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x29, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6c, 0x65, + 0x29, 0x3b, 0x7d, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x55, 0x52, + 0x44, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x29, 0x7b, 0x74, 0x72, 0x79, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, - 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, - 0x2f, 0x77, 0x73, 0x27, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, - 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, - 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, - 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, - 0x22, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, - 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, - 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, - 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, - 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, - 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, - 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, - 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, - 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x3d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x2b, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, 0x2f, 0x75, 0x72, 0x64, + 0x66, 0x22, 0x3a, 0x27, 0x2f, 0x75, 0x72, 0x64, 0x66, 0x27, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x3d, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x28, 0x75, 0x72, 0x64, 0x66, 0x55, 0x72, 0x6c, 0x29, 0x3b, 0x69, + 0x66, 0x28, 0x21, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x6f, 0x6b, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x48, 0x54, 0x54, + 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x3a, 0x20, 0x22, 0x2b, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, + 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x7b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x2e, 0x74, 0x68, + 0x65, 0x6e, 0x28, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, 0x3d, 0x3e, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x75, 0x72, 0x64, 0x66, + 0x22, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x3b, 0x7d, 0x7d, 0x63, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, + 0x73, 0x68, 0x6f, 0x77, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, 0x52, 0x44, 0x46, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, 0x2b, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x7d, 0x7d, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x3d, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x50, 0x3f, 0x22, 0x77, 0x73, 0x3a, 0x2f, 0x2f, + 0x22, 0x2b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x2b, 0x22, + 0x2f, 0x77, 0x73, 0x22, 0x3a, 0x27, 0x2f, 0x77, 0x73, 0x27, 0x3b, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x77, 0x73, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, + 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, + 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, + 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x49, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x29, 0x7b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x77, 0x73, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x3d, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x7b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x49, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x7d, 0x7d, 0x63, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x27, 0x2c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x3b, 0x7d, 0x7d, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x3d, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x3d, 0x3e, + 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x61, 0x72, + 0x6e, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, + 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x2e, + 0x2e, 0x22, 0x2c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x3b, 0x73, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x3b, 0x74, 0x61, + 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x6f, + 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x28, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x74, 0x61, 0x73, + 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x77, 0x73, 0x2e, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x7d, 0x3b, 0x7d, 0x0a, 0x63, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x29, 0x3b, 0x74, 0x61, 0x73, 0x6b, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x5f, 0x77, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b, - 0x7d, 0x3b, 0x7d, 0x0a, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x65, 0x62, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, - 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x22, 0x2c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x29, 0x3b, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, + 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, + 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, 0x4f, 0x4d, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x27, 0x2c, 0x28, + 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x61, + 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, + 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, + 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, + 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, + 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3b, 0x7d, + 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3d, 0x73, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x28, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x7d, 0x7d, 0x0a, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x44, - 0x4f, 0x4d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x27, 0x2c, 0x28, 0x29, 0x3d, 0x3e, 0x7b, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x3d, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x2e, 0x67, 0x65, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x28, 0x27, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x50, 0x27, 0x29, 0x3b, 0x69, 0x66, 0x28, - 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, 0x50, 0x29, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x50, 0x3d, 0x73, 0x61, 0x76, 0x65, 0x64, 0x49, - 0x50, 0x3b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, - 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, - 0x64, 0x28, 0x27, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x69, 0x70, - 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x49, 0x50, 0x3b, 0x7d, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x28, - 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x3d, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x28, 0x66, 0x65, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2c, 0x35, 0x30, 0x30, 0x30, - 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x57, 0x65, 0x62, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, - 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, - 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e + 0x28, 0x29, 0x3b, 0x7d, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e }; -unsigned int _index_html_len = 28295; +unsigned int _index_html_len = 28301; #endif /* INDEX_H */ diff --git a/idf/taskboard/web_interfaces/index.html b/idf/taskboard/web_interfaces/index.html index fa08f1d..625b2e4 100644 --- a/idf/taskboard/web_interfaces/index.html +++ b/idf/taskboard/web_interfaces/index.html @@ -1336,7 +1336,7 @@

${data.current_task.name} ${step.done ? '✓' : '○'} ${step.sensor} ${step.finish_time || step.finish_time == 0.0 ? '' + step.finish_time.toFixed(2) + ' s' : ''} - ${step.score || step.score == 0.0 ? '·' + step.score.toFixed(0) + '%' : ''} + ${step.score >= 0.0 && step.score < 100.0 ? '·' + step.score.toFixed(0) + '%' : ''} `).join('')} From a15a095e743904d6b594d8df1f77448596b53ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Mon, 21 Apr 2025 09:24:14 +0000 Subject: [PATCH 20/35] Add different types of shapes to TaskStepTraceShape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_TBv2025.hpp | 6 +- .../main/task/TaskStepTraceShape.hpp | 192 +++++++++++++++--- .../main/task/TaskStepWaitRandom.hpp | 6 +- 3 files changed, 169 insertions(+), 35 deletions(-) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 48059f3..4afc8df 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -230,7 +230,7 @@ struct TaskBoardDriver_v1 : return red_button->read(); }); - Sensor* touch_screen_position = new Sensor("TOUCH_SCREEN_POSITION", [&]() + Sensor* touch_screen_position = new Sensor("TOUCH_SCREEN", [&]() { m5gfx::M5GFX& display = hardware_low_level_controller_.m5_unified.Display; const int32_t w = display.width(); @@ -305,7 +305,9 @@ struct TaskBoardDriver_v1 : { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, - new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN_POSITION")), + new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::TRIANGLE), + new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::CIRCLE), + new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::SQUARE), random_fader_step, new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), diff --git a/idf/taskboard/main/task/TaskStepTraceShape.hpp b/idf/taskboard/main/task/TaskStepTraceShape.hpp index f16ccd1..b3388c9 100644 --- a/idf/taskboard/main/task/TaskStepTraceShape.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShape.hpp @@ -19,60 +19,189 @@ struct TaskStepTraceShape : public TaskStep { + const char* TAG = "TaskStepTraceShape"; ///< Logging tag + + enum ShapeType + { + FOUR_SIDED = 0, + POINT = 1, + LINE = 2, + TRIANGLE = 3, + SQUARE = 4, + CIRCLE = 100 + }; + /** * @brief Constructs a new TaskStepTraceShape object * * @param sensor Reference to the sensor to monitor */ TaskStepTraceShape( - SensorReader& sensor) - : TaskStep(sensor) + SensorReader& sensor, + ShapeType shape) + : TaskStep(sensor), + shape_(shape) { TaskStep::type_ = Type::TRACE_SHAPE; - initializeStep(); + initialize_step(); } - void initializeStep() const + void initialize_step() const { - constexpr int32_t N_POINTS = 3; - step_started_ = false; - // Generate expected path with N_POINTS random points + // Clear paths expected_path_.clear(); - while (expected_path_.size() < N_POINTS) + measured_path_.clear(); + + // Generate expected path of shape shape_ + switch (shape_) { + case FOUR_SIDED: + draw_four_sided_shape(); + close_shape(); + break; + case POINT: + case LINE: + draw_open_shape((uint8_t) shape_); + break; + case TRIANGLE: + draw_open_shape(3); + close_shape(); + break; + case SQUARE: + case CIRCLE: + draw_regular_shape((uint8_t) shape_); + close_shape(); + break; + } + } + + /** + * @brief Adds the first point to the end of the vector + */ + void close_shape() const + { + expected_path_.push_back(expected_path_[0]); + } + + /** + * @brief Draws an open shape with n_points + * + * @param n_points Number of points (vertices) + */ + void draw_open_shape(const uint8_t n_points) const + { + const float limits[4] = { 5.0f, 95.0f, 30.0f, 90.0f }; + const float min_distance = 30.0f; + + while (expected_path_.size() < n_points) { - // Generate random point + // Generate random point within the limits SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ - (float) esp_random() * 100.0f / UINT32_MAX, - (float) esp_random() * 100.0f / UINT32_MAX, + limits[0] + (float) esp_random() * (limits[1] - limits[0]) / UINT32_MAX, + limits[2] + (float) esp_random() * (limits[3] - limits[2]) / UINT32_MAX, 0.0f }; - // Check if the point is too close to the edges of the screen - if (next_point.x < 5.0f || next_point.x > 95.0f || - next_point.y < 30.0f || next_point.y > 90.0f) + + // Check if the point is too close to any other point + bool valid_point = true; + for (const auto& point : expected_path_) { - // Do not add - continue; + const auto last_point = point.get_vector3(); + if (std::hypot( + (last_point.x - next_point.x), + (last_point.y - next_point.y)) < min_distance) + { + valid_point = false; + break; + } } - // Check if the point is too close to the last point - if (!expected_path_.empty()) + + if (valid_point) { - const auto last_point = expected_path_.back().get_vector3(); + expected_path_.push_back(SensorMeasurement(next_point)); + } + } + } + + /** + * @brief Draws a four-sided shape + * + * @details The screen is divided into four sectors: Top left, bottom left, top right, and bottom right. + * The four-sided shape has one point in per sector. + * The points are not too close to each other. + */ + void draw_four_sided_shape() const + { + const float limits[4][4] = { + { 5.0f, 50.0f, 30.0f, 60.0f }, // Top left + { 5.0f, 50.0f, 60.0f, 90.0f }, // Bottom left + { 50.0f, 95.0f, 60.0f, 90.0f }, // Bottom right + { 50.0f, 95.0f, 30.0f, 60.0f } // Top right + }; + const float min_distance = 30.0f; + + while (expected_path_.size() < 4) + { + // Generate random point + SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ + limits[expected_path_.size()][0] + (float) esp_random() * (limits[expected_path_.size()][1] - limits[expected_path_.size()][0]) / UINT32_MAX, + limits[expected_path_.size()][2] + (float) esp_random() * (limits[expected_path_.size()][3] - limits[expected_path_.size()][2]) / UINT32_MAX, + 0.0f + }; + + // Check if the point is too close to any other point + bool valid_point = true; + for (const auto& point : expected_path_) + { + const auto last_point = point.get_vector3(); if (std::hypot( (last_point.x - next_point.x), - (last_point.y - next_point.y)) < 30.0f) + (last_point.y - next_point.y)) < min_distance) { - // Do not add - continue; + valid_point = false; + break; } } - expected_path_.push_back(SensorMeasurement(next_point)); + + if (valid_point) + { + expected_path_.push_back(SensorMeasurement(next_point)); + } } - // Clear measured path - measured_path_.clear(); + // Choose a random point to start the shape + const size_t start_point = esp_random() % expected_path_.size(); + std::rotate(expected_path_.begin(), expected_path_.begin() + start_point, expected_path_.end()); + } + + /** + * @brief Draws a regular polygon with n_points + * + * @param n_points Number of points (vertices) + */ + void draw_regular_shape(const uint8_t n_points) const + { + // Random center point + SensorMeasurement::Vector3 center_point = SensorMeasurement::Vector3{ + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 0.0f + }; + // Random radius between 20 and 35 + const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; + //Random starting angle + const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; + + const float increment = 2.0f * M_PI / n_points; + for (size_t i = 0; i < n_points; i++) + { + const float angle = start_angle + i * increment; + const float x = center_point.x + radius * std::cos(angle); + const float y = center_point.y + radius * std::sin(angle); + expected_path_.push_back(SensorMeasurement(SensorMeasurement::Vector3{x, y, 0.0f})); + } } /// Virtual method implementation @@ -133,14 +262,16 @@ struct TaskStepTraceShape : float score = 100.0f - 50.0*first_distance/141.42f - 50.0*last_distance/141.42f - - 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length); + - (std::max(expected_length, measured_length) > 0.0f ? + 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length) : + 0.0f); if (score < 0.0f) { score = 0.0f; } - initializeStep(); + initialize_step(); return score; } @@ -168,7 +299,8 @@ struct TaskStepTraceShape : } } - mutable bool step_started_ = 0; - mutable std::vectorexpected_path_ = {}; - mutable std::vectormeasured_path_ = {}; + const ShapeType shape_; ///< Shape type to be traced + mutable bool step_started_ = 0; ///< Flag to indicate if the step has started + mutable std::vectorexpected_path_ = {}; ///< Path to be traced + mutable std::vectormeasured_path_ = {}; ///< Path measured }; diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index e61f41a..93b4d23 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -27,10 +27,10 @@ struct TaskStepWaitRandom : { TaskStepAuto::type_ = Type::WAIT_RANDOM; - initializeStep(); + initialize_step(); } - void initializeStep() const + void initialize_step() const { initial_time_ = -1LL; // Generate random value between 2 and 10 seconds @@ -53,7 +53,7 @@ struct TaskStepWaitRandom : /// Virtual method implementation float score() const override { - initializeStep(); + initialize_step(); // Score is irrelevant return -1.0f; } From 065963fa46a2e39b3354f0e6f70f1940b263706d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Mon, 21 Apr 2025 10:19:52 +0000 Subject: [PATCH 21/35] TaskStepWaitRandom: Add optional input arguments for minimum and maximum waiting time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/task/TaskStepWaitRandom.hpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index 93b4d23..2901b9a 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -22,8 +22,13 @@ struct TaskStepWaitRandom : * * @param name Name identifier for the task step */ - TaskStepWaitRandom(std::string name = "") - : TaskStepAuto(name) + TaskStepWaitRandom( + std::string name = "", + int64_t minimum_waiting_time_ms = 2000L, + int64_t maximum_waiting_time_ms = 10000L) + : TaskStepAuto(name), + minimum_waiting_time_us_(minimum_waiting_time_ms * 1000L), + waiting_time_range_us_((maximum_waiting_time_ms - minimum_waiting_time_ms) * 1000L) { TaskStepAuto::type_ = Type::WAIT_RANDOM; @@ -32,9 +37,9 @@ struct TaskStepWaitRandom : void initialize_step() const { - initial_time_ = -1LL; + initial_time_ = -1L; // Generate random value between 2 and 10 seconds - random_waiting_time_us_ = 2000000LL + 8000000LL * esp_random() / UINT32_MAX; + random_waiting_time_us_ = minimum_waiting_time_us_ + waiting_time_range_us_ * esp_random() / UINT32_MAX; } /// Virtual method implementation @@ -75,6 +80,8 @@ struct TaskStepWaitRandom : } } - mutable int64_t initial_time_ = -1LL; ///< Initial time when the step started - mutable int64_t random_waiting_time_us_ = 0LL; ///< Current random target value + const int64_t minimum_waiting_time_us_ = 2000000L; ///< Minimum waiting time in microseconds + const int64_t waiting_time_range_us_ = 8000000L; ///< Waiting time range in microseconds + mutable int64_t initial_time_ = -1L; ///< Initial time when the step started + mutable int64_t random_waiting_time_us_ = 0L; ///< Current random target value }; From c727ecc2529bfa8038fd8c389f7c39eac5686256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 22 Apr 2025 09:41:53 +0000 Subject: [PATCH 22/35] TaskStepTraceShapeFromPool: Obtain a trace shape task step randomly from a pool of shapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_TBv2025.hpp | 19 +- idf/taskboard/main/task/TaskStep.hpp | 2 + .../main/task/TaskStepTraceShapeFromPool.hpp | 317 ++++++++++++++++++ .../task/TaskStepTraceShapeManagePool.hpp | 197 +++++++++++ 4 files changed, 532 insertions(+), 3 deletions(-) create mode 100644 idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp create mode 100644 idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 4afc8df..4dfa49a 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -282,6 +284,16 @@ struct TaskBoardDriver_v1 : // Initial update update(); + std::vector* default_shapes = new std::vector + { + TaskStepTraceShape::ShapeType::TRIANGLE, + TaskStepTraceShape::ShapeType::CIRCLE, + TaskStepTraceShape::ShapeType::SQUARE + }; + + // Create shape pool + std::vector* shape_pool = new std::vector {}; + // Create default tasks std::vector* precondition_steps = new std::vector { @@ -289,6 +301,7 @@ struct TaskBoardDriver_v1 : new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(false)), new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(false)), new TaskStepEqual(*get_sensor_by_name("FREE_CABLE"), SensorMeasurement(true)), + new TaskStepTraceShapeSetPool("SET_SHAPE_POOL", shape_pool, default_shapes), }; default_precondition_task_ = new SimultaneousConditionTask(*precondition_steps, "Precondition Task"); @@ -305,9 +318,9 @@ struct TaskBoardDriver_v1 : { new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), timed_fader_operation, - new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::TRIANGLE), - new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::CIRCLE), - new TaskStepTraceShape(*get_sensor_by_name("TOUCH_SCREEN"), TaskStepTraceShape::ShapeType::SQUARE), + new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), + new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), + new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), random_fader_step, new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 91903f4..88eeaf6 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -144,6 +144,8 @@ struct TaskStepBase : EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target TRACE_SHAPE, ///< Sensor value must follow a specific path + TRACE_SHAPE_FROM_POOL, ///< Sensor value must follow a path selected at random from a pool + TRACE_SHAPE_MANAGE_POOL, ///< Manage a shape pool WAIT_RANDOM, ///< Wait for a random time UNKNOWN ///< Undefined comparison type }; diff --git a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp new file mode 100644 index 0000000..57daa08 --- /dev/null +++ b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp @@ -0,0 +1,317 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include +#include + +#include + +/** + * @struct TaskStepTraceShapeFromPool + * + * @brief Implementation of TaskStep that checks how closely a path is followed + * + * @details Performs trace score evaluation between measured path and desired path + */ +struct TaskStepTraceShapeFromPool : + public TaskStep +{ + const char* TAG = "TaskStepTraceShapeFromPool"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTraceShapeFromPool object + * + * @param sensor Reference to the sensor to monitor + * @param shape_pool Vector of shapes to select from + */ + TaskStepTraceShapeFromPool( + SensorReader& sensor, + std::vector* shape_pool) + : TaskStep(sensor), + shape_pool_(shape_pool) + { + TaskStep::type_ = Type::TRACE_SHAPE_FROM_POOL; + + initialize_step(); + } + + void initialize_step() const + { + // Select a random shape from the pool + if (shape_pool_->empty()) + { + ESP_LOGE(TAG, "Shape pool is empty"); + return; + } + + ESP_LOGI(TAG, "Shape pool size: %zu", shape_pool_->size()); + + const size_t random_index = esp_random() % shape_pool_->size(); + shape_ = shape_pool_->at(random_index); + shape_pool_->erase(shape_pool_->begin() + random_index); + shape_pool_->shrink_to_fit(); + + ESP_LOGI(TAG, "Took shape %d from pool", shape_); + ESP_LOGI(TAG, "Shape pool size: %zu", shape_pool_->size()); + + step_started_ = false; + + // Clear paths + expected_path_.clear(); + measured_path_.clear(); + + // Generate expected path of shape shape_ + switch (shape_) { + case TaskStepTraceShape::FOUR_SIDED: + draw_four_sided_shape(); + close_shape(); + break; + case TaskStepTraceShape::POINT: + case TaskStepTraceShape::LINE: + draw_open_shape((uint8_t) shape_); + break; + case TaskStepTraceShape::TRIANGLE: + draw_open_shape(3); + close_shape(); + break; + case TaskStepTraceShape::SQUARE: + case TaskStepTraceShape::CIRCLE: + draw_regular_shape((uint8_t) shape_); + close_shape(); + break; + } + } + + /** + * @brief Adds the first point to the end of the vector + */ + void close_shape() const + { + expected_path_.push_back(expected_path_[0]); + } + + /** + * @brief Draws an open shape with n_points + * + * @param n_points Number of points (vertices) + */ + void draw_open_shape(const uint8_t n_points) const + { + const float limits[4] = { 5.0f, 95.0f, 30.0f, 90.0f }; + const float min_distance = 30.0f; + + while (expected_path_.size() < n_points) + { + // Generate random point within the limits + SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ + limits[0] + (float) esp_random() * (limits[1] - limits[0]) / UINT32_MAX, + limits[2] + (float) esp_random() * (limits[3] - limits[2]) / UINT32_MAX, + 0.0f + }; + + // Check if the point is too close to any other point + bool valid_point = true; + for (const auto& point : expected_path_) + { + const auto last_point = point.get_vector3(); + if (std::hypot( + (last_point.x - next_point.x), + (last_point.y - next_point.y)) < min_distance) + { + valid_point = false; + break; + } + } + + if (valid_point) + { + expected_path_.push_back(SensorMeasurement(next_point)); + } + } + } + + /** + * @brief Draws a four-sided shape + * + * @details The screen is divided into four sectors: Top left, bottom left, top right, and bottom right. + * The four-sided shape has one point in per sector. + * The points are not too close to each other. + */ + void draw_four_sided_shape() const + { + const float limits[4][4] = { + { 5.0f, 50.0f, 30.0f, 60.0f }, // Top left + { 5.0f, 50.0f, 60.0f, 90.0f }, // Bottom left + { 50.0f, 95.0f, 60.0f, 90.0f }, // Bottom right + { 50.0f, 95.0f, 30.0f, 60.0f } // Top right + }; + const float min_distance = 30.0f; + + while (expected_path_.size() < 4) + { + // Generate random point + SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ + limits[expected_path_.size()][0] + (float) esp_random() * (limits[expected_path_.size()][1] - limits[expected_path_.size()][0]) / UINT32_MAX, + limits[expected_path_.size()][2] + (float) esp_random() * (limits[expected_path_.size()][3] - limits[expected_path_.size()][2]) / UINT32_MAX, + 0.0f + }; + + // Check if the point is too close to any other point + bool valid_point = true; + for (const auto& point : expected_path_) + { + const auto last_point = point.get_vector3(); + if (std::hypot( + (last_point.x - next_point.x), + (last_point.y - next_point.y)) < min_distance) + { + valid_point = false; + break; + } + } + + if (valid_point) + { + expected_path_.push_back(SensorMeasurement(next_point)); + } + } + + // Choose a random point to start the shape + const size_t start_point = esp_random() % expected_path_.size(); + std::rotate(expected_path_.begin(), expected_path_.begin() + start_point, expected_path_.end()); + } + + /** + * @brief Draws a regular polygon with n_points + * + * @param n_points Number of points (vertices) + */ + void draw_regular_shape(const uint8_t n_points) const + { + // Random center point + SensorMeasurement::Vector3 center_point = SensorMeasurement::Vector3{ + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 0.0f + }; + // Random radius between 20 and 35 + const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; + //Random starting angle + const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; + + const float increment = 2.0f * M_PI / n_points; + for (size_t i = 0; i < n_points; i++) + { + const float angle = start_angle + i * increment; + const float x = center_point.x + radius * std::cos(angle); + const float y = center_point.y + radius * std::sin(angle); + expected_path_.push_back(SensorMeasurement(SensorMeasurement::Vector3{x, y, 0.0f})); + } + } + + /// Virtual method implementation + bool success() const override + { + const auto sensor_value = sensor_.read(); + bool pressing_screen = (sensor_value.get_vector3().z != 0); + if (!step_started_) + { + step_started_ = pressing_screen; + } + else + { + if (pressing_screen) + { + measured_path_.push_back(sensor_value.get_vector3()); + } + else + { + return true; + } + } + return false; + } + + /// Virtual method implementation + float score() const override + { + // Calculate distance between first point of expected path and first point of measured path + float first_distance = std::hypot( + (expected_path_[0].get_vector3().x - measured_path_[0].get_vector3().x), + (expected_path_[0].get_vector3().y - measured_path_[0].get_vector3().y)); + + // Calculate distance between last point of expected path and last point of measured path + float last_distance = std::hypot( + (expected_path_[expected_path_.size() - 1].get_vector3().x - measured_path_[measured_path_.size() - 1].get_vector3().x), + (expected_path_[expected_path_.size() - 1].get_vector3().y - measured_path_[measured_path_.size() - 1].get_vector3().y)); + + // Calculate length of expected path + float expected_length = 0.0f; + for (size_t i = 1; i < expected_path_.size(); i++) + { + expected_length += std::hypot( + (expected_path_[i].get_vector3().x - expected_path_[i - 1].get_vector3().x), + (expected_path_[i].get_vector3().y - expected_path_[i - 1].get_vector3().y)); + } + + // Calculate length of measured path + float measured_length = 0.0f; + for (size_t i = 1; i < measured_path_.size(); i++) + { + measured_length += std::hypot( + (measured_path_[i].get_vector3().x - measured_path_[i - 1].get_vector3().x), + (measured_path_[i].get_vector3().y - measured_path_[i - 1].get_vector3().y)); + } + + // Calculate score based on distances and difference of lenghts + float score = 100.0f + - 50.0*first_distance/141.42f + - 50.0*last_distance/141.42f + - (std::max(expected_length, measured_length) > 0.0f ? + 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length) : + 0.0f); + + if (score < 0.0f) + { + score = 0.0f; + } + + initialize_step(); + + return score; + } + + /// Virtual method implementation + SensorMeasurement expected_value() const override + { + return expected_path_[0]; + } + +protected: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + screen_controller.print_task_clue(sensor_.name()); + screen_controller.print_task_clue_path(expected_path_, measured_path_); + } + else + { + reset_clue(); + } + } + + mutable TaskStepTraceShape::ShapeType shape_; ///< Shape type to be traced + mutable bool step_started_ = 0; ///< Flag to indicate if the step has started + mutable std::vectorexpected_path_ = {}; ///< Path to be traced + mutable std::vectormeasured_path_ = {}; ///< Path measured + + std::vector* shape_pool_; ///< Vector of shapes to select from +}; diff --git a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp new file mode 100644 index 0000000..d8017e5 --- /dev/null +++ b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp @@ -0,0 +1,197 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include +#include + +#include + +/** + * @struct TaskStepTraceShapeSetPool + * + * @brief Implementation of TaskStep that empties a shape pool and fills it with a vector of shapes + */ +struct TaskStepTraceShapeSetPool : + public TaskStepAuto +{ + const char* TAG = "TaskStepTraceShapeSetPool"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTraceShapeSetPool object + * + * @param name Name identifier for the task step + * @param shape_pool Vector of shapes to be filled + * @param shapes_vector Vector of shapes to fill the pool with + */ + TaskStepTraceShapeSetPool( + std::string name, + std::vector* shape_pool, + std::vector* shapes_vector) + : TaskStepAuto(name) + , shape_pool_(shape_pool) + , shapes_vector_(shapes_vector) + { + TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; + + initialize_step(); + } + + void initialize_step() const + { + shape_pool_->clear(); + shape_pool_->shrink_to_fit(); + + shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); + ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); + } + + /// Virtual method implementation + bool success() const override + { + return true; + } + + /// Virtual method implementation + float score() const override + { + initialize_step(); + return -1.0f; + } + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + screen_controller.print_task_clue("Shape pool filled"); + } + + std::vector* shape_pool_; ///< Vector of shapes to be filled + const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with +}; + +/** + * @struct TaskStepTraceShapeFillPool + * + * @brief Implementation of TaskStep that fills a pool with a vector of shapes + */ +struct TaskStepTraceShapeFillPool : + public TaskStepAuto +{ + const char* TAG = "TaskStepTraceShapeFillPool"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTraceShapeFillPool object + * + * @param name Name identifier for the task step + * @param shape_pool Vector of shapes to be filled + * @param shapes_vector Vector of shapes to fill the pool with + */ + TaskStepTraceShapeFillPool( + std::string name, + std::vector* shape_pool, + std::vector* shapes_vector) + : TaskStepAuto(name) + , shape_pool_(shape_pool) + , shapes_vector_(shapes_vector) + { + TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; + + initialize_step(); + } + + void initialize_step() const + { + shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); + ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); + } + + /// Virtual method implementation + bool success() const override + { + return true; + } + + /// Virtual method implementation + float score() const override + { + initialize_step(); + return -1.0f; + } + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + screen_controller.print_task_clue("Shape pool filled"); + } + + std::vector* shape_pool_; ///< Vector of shapes to be filled + const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with +}; + +/** + * @brief TaskStepTraceShapeEmptyPool + * + * @details Implementation of TaskStep that empties a shape pool + */ +struct TaskStepTraceShapeEmptyPool : + public TaskStepAuto +{ + const char* TAG = "TaskStepTraceShapeEmptyPool"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTraceShapeEmptyPool object + * + * @param name Name identifier for the task step + * @param shape_pool Vector of shapes to be emptied + */ + TaskStepTraceShapeEmptyPool( + std::string name, + std::vector* shape_pool) + : TaskStepAuto(name) + , shape_pool_(shape_pool) + { + TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; + + initialize_step(); + } + + void initialize_step() const + { + shape_pool_->clear(); + shape_pool_->shrink_to_fit(); + ESP_LOGI(TAG, "Shape pool emptied. Cointains %zu shapes", shape_pool_->size()); + } + + /// Virtual method implementation + bool success() const override + { + return true; + } + + /// Virtual method implementation + float score() const override + { + initialize_step(); + return -1.0f; + } + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + screen_controller.print_task_clue("Shape pool emptied"); + } + + std::vector* shape_pool_; ///< Vector of shapes to be emptied +}; \ No newline at end of file From c9795a56214a1fd92cc876204689b70e4a947d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 22 Apr 2025 10:56:12 +0000 Subject: [PATCH 23/35] Shuffle the shapes when adding to the pool. Use and remove always the first one. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/task/TaskStepTraceShapeFromPool.hpp | 8 ++----- .../task/TaskStepTraceShapeManagePool.hpp | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp index 57daa08..c1461ff 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp @@ -47,13 +47,9 @@ struct TaskStepTraceShapeFromPool : ESP_LOGE(TAG, "Shape pool is empty"); return; } - - ESP_LOGI(TAG, "Shape pool size: %zu", shape_pool_->size()); - const size_t random_index = esp_random() % shape_pool_->size(); - shape_ = shape_pool_->at(random_index); - shape_pool_->erase(shape_pool_->begin() + random_index); - shape_pool_->shrink_to_fit(); + shape_ = shape_pool_->at(0); + shape_pool_->erase(shape_pool_->begin()); ESP_LOGI(TAG, "Took shape %d from pool", shape_); ESP_LOGI(TAG, "Shape pool size: %zu", shape_pool_->size()); diff --git a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp index d8017e5..9c5877d 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp @@ -10,6 +10,27 @@ #include +/** + * @brief Shuffles a vector using esp_random() as the RNG + * + * @tparam T Type of elements in the vector + * @param vec Pointer to the vector to be shuffled + */ +template +void esp_shuffle(std::vector* vec) { + if (vec == nullptr || vec->empty()) { + return; + } + + for (size_t i = vec->size() - 1; i > 0; --i) { + uint32_t r = esp_random() % (i + 1); + size_t j = static_cast(r); + + // Swap elements at positions i and j + std::swap((*vec)[i], (*vec)[j]); + } +} + /** * @struct TaskStepTraceShapeSetPool * @@ -46,6 +67,7 @@ struct TaskStepTraceShapeSetPool : shape_pool_->shrink_to_fit(); shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); + esp_shuffle(shape_pool_); ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); } @@ -108,6 +130,7 @@ struct TaskStepTraceShapeFillPool : void initialize_step() const { shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); + esp_shuffle(shape_pool_); ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); } From f647579fb2b130228879db5b52a16435df6ddc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Tue, 22 Apr 2025 13:09:02 +0000 Subject: [PATCH 24/35] Simplify initialize_step() calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/task/ParallelTask.hpp | 4 ++++ idf/taskboard/main/task/SequentialTask.hpp | 1 + idf/taskboard/main/task/TaskStep.hpp | 5 +++++ idf/taskboard/main/task/TaskStepEqual.hpp | 5 +++++ .../main/task/TaskStepEqualToRandom.hpp | 17 ++++++++--------- .../main/task/TaskStepGreaterEqualThan.hpp | 5 +++++ .../main/task/TaskStepTraceShape.hpp | 11 ++++++----- .../main/task/TaskStepTraceShapeFromPool.hpp | 11 ++++++----- .../task/TaskStepTraceShapeManagePool.hpp | 18 ++++++------------ .../main/task/TaskStepWaitRandom.hpp | 19 ++++--------------- 10 files changed, 50 insertions(+), 46 deletions(-) diff --git a/idf/taskboard/main/task/ParallelTask.hpp b/idf/taskboard/main/task/ParallelTask.hpp index 2b87b1b..bb9034b 100644 --- a/idf/taskboard/main/task/ParallelTask.hpp +++ b/idf/taskboard/main/task/ParallelTask.hpp @@ -133,6 +133,10 @@ struct ParallelTask : { std::fill(steps_status_.begin(), steps_status_.end(), false); Task::restart(); + for (size_t i = 0; i < steps_.size(); i++) + { + steps_[i]->initialize_step(); + } } protected: diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index d029a84..104c8d4 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -90,6 +90,7 @@ struct SequentialTask : if (current_step_ < steps_.size()) { steps_[current_step_]->restart_step(); + steps_[current_step_]->initialize_step(); } ret = true; diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 88eeaf6..3768eb6 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -155,6 +155,11 @@ struct TaskStepBase : */ virtual void restart_step() const = 0; + /** + * @brief runs at the beginning of the task step + */ + virtual void initialize_step() const = 0; + /** * @brief Gets the name of the task step * diff --git a/idf/taskboard/main/task/TaskStepEqual.hpp b/idf/taskboard/main/task/TaskStepEqual.hpp index 2730e47..1673423 100644 --- a/idf/taskboard/main/task/TaskStepEqual.hpp +++ b/idf/taskboard/main/task/TaskStepEqual.hpp @@ -38,6 +38,11 @@ struct TaskStepEqual : TaskStep::type_ = Type::EQUAL; } + /// Virtual method implementation + void initialize_step() const override + { + } + /// Virtual method implementation bool success() const override { diff --git a/idf/taskboard/main/task/TaskStepEqualToRandom.hpp b/idf/taskboard/main/task/TaskStepEqualToRandom.hpp index 02f9fb0..3c26ea2 100644 --- a/idf/taskboard/main/task/TaskStepEqualToRandom.hpp +++ b/idf/taskboard/main/task/TaskStepEqualToRandom.hpp @@ -36,17 +36,16 @@ struct TaskStepEqualToRandom : } /// Virtual method implementation - bool success() const override + void initialize_step() const override { - const bool ret = SensorMeasurement::equal(sensor_.read(), random_expected_value_, tolerance_); - - if (ret) - { - // Generate new random value between 0 and 1 - random_expected_value_ = SensorMeasurement((float) esp_random() / (float) UINT32_MAX); - } + // Generate initial random value between 0 and 1 + random_expected_value_ = SensorMeasurement((float) esp_random() / (float) UINT32_MAX); + } - return ret; + /// Virtual method implementation + bool success() const override + { + return SensorMeasurement::equal(sensor_.read(), random_expected_value_, tolerance_); } /// Virtual method implementation diff --git a/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp b/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp index 500609d..de14d8e 100644 --- a/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp +++ b/idf/taskboard/main/task/TaskStepGreaterEqualThan.hpp @@ -34,6 +34,11 @@ struct TaskStepGreaterEqualThan : TaskStep::type_ = Type::GREATER_OR_EQUAL; } + /// Virtual method implementation + void initialize_step() const override + { + } + /// Virtual method implementation bool success() const override { diff --git a/idf/taskboard/main/task/TaskStepTraceShape.hpp b/idf/taskboard/main/task/TaskStepTraceShape.hpp index b3388c9..9b20e33 100644 --- a/idf/taskboard/main/task/TaskStepTraceShape.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShape.hpp @@ -43,11 +43,10 @@ struct TaskStepTraceShape : shape_(shape) { TaskStep::type_ = Type::TRACE_SHAPE; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { step_started_ = false; @@ -270,8 +269,6 @@ struct TaskStepTraceShape : { score = 0.0f; } - - initialize_step(); return score; } @@ -279,6 +276,10 @@ struct TaskStepTraceShape : /// Virtual method implementation SensorMeasurement expected_value() const override { + if (expected_path_.empty()) + { + return SensorMeasurement(); + } return expected_path_[0]; } diff --git a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp index c1461ff..32292e4 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp @@ -35,11 +35,10 @@ struct TaskStepTraceShapeFromPool : shape_pool_(shape_pool) { TaskStep::type_ = Type::TRACE_SHAPE_FROM_POOL; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { // Select a random shape from the pool if (shape_pool_->empty()) @@ -275,8 +274,6 @@ struct TaskStepTraceShapeFromPool : { score = 0.0f; } - - initialize_step(); return score; } @@ -284,6 +281,10 @@ struct TaskStepTraceShapeFromPool : /// Virtual method implementation SensorMeasurement expected_value() const override { + if (expected_path_.empty()) + { + return SensorMeasurement(); + } return expected_path_[0]; } diff --git a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp index 9c5877d..a649dfa 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp @@ -57,11 +57,10 @@ struct TaskStepTraceShapeSetPool : , shapes_vector_(shapes_vector) { TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { shape_pool_->clear(); shape_pool_->shrink_to_fit(); @@ -80,7 +79,6 @@ struct TaskStepTraceShapeSetPool : /// Virtual method implementation float score() const override { - initialize_step(); return -1.0f; } @@ -123,11 +121,10 @@ struct TaskStepTraceShapeFillPool : , shapes_vector_(shapes_vector) { TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); esp_shuffle(shape_pool_); @@ -143,7 +140,6 @@ struct TaskStepTraceShapeFillPool : /// Virtual method implementation float score() const override { - initialize_step(); return -1.0f; } @@ -183,11 +179,10 @@ struct TaskStepTraceShapeEmptyPool : , shape_pool_(shape_pool) { TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { shape_pool_->clear(); shape_pool_->shrink_to_fit(); @@ -203,7 +198,6 @@ struct TaskStepTraceShapeEmptyPool : /// Virtual method implementation float score() const override { - initialize_step(); return -1.0f; } diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index 2901b9a..2ab7978 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -31,35 +31,24 @@ struct TaskStepWaitRandom : waiting_time_range_us_((maximum_waiting_time_ms - minimum_waiting_time_ms) * 1000L) { TaskStepAuto::type_ = Type::WAIT_RANDOM; - - initialize_step(); } - void initialize_step() const + /// Virtual method implementation + void initialize_step() const override { - initial_time_ = -1L; - // Generate random value between 2 and 10 seconds + initial_time_ = esp_timer_get_time(); random_waiting_time_us_ = minimum_waiting_time_us_ + waiting_time_range_us_ * esp_random() / UINT32_MAX; } /// Virtual method implementation bool success() const override { - if (initial_time_ == -1) - { - initial_time_ = esp_timer_get_time(); - } - - const bool ret = esp_timer_get_time() - initial_time_ >= random_waiting_time_us_; - - return ret; + return (esp_timer_get_time() - initial_time_) >= random_waiting_time_us_; } /// Virtual method implementation float score() const override { - initialize_step(); - // Score is irrelevant return -1.0f; } From 58b8cc7b45a10778a6571d1c740389e64c50ab43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 23 Apr 2025 07:53:11 +0000 Subject: [PATCH 25/35] Change to new PaHub+PbHub hardware configuration. At this point incompatible with v2023 build. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/HardwareLowLevelController.hpp | 10 +- .../main/hal/PaHubToPbHubController.hpp | 134 ++++++++++++++ idf/taskboard/main/hal/PbHubController.hpp | 24 +-- .../hal/board/TaskBoardDriver_TBv2025.hpp | 173 +++++------------- idf/taskboard/main/main_core0.cpp | 20 +- 5 files changed, 220 insertions(+), 141 deletions(-) create mode 100644 idf/taskboard/main/hal/PaHubToPbHubController.hpp diff --git a/idf/taskboard/main/hal/HardwareLowLevelController.hpp b/idf/taskboard/main/hal/HardwareLowLevelController.hpp index 7a5ada6..2ba0d67 100644 --- a/idf/taskboard/main/hal/HardwareLowLevelController.hpp +++ b/idf/taskboard/main/hal/HardwareLowLevelController.hpp @@ -5,14 +5,22 @@ #pragma once #include +#include /** * @struct HardwareLowLevelController * * @brief Aggregates low-level hardware controllers */ -struct HardwareLowLevelController +struct HardwareLowLevelController_v2023 { PbHubController& pb_hub_controller; ///< Reference to PbHub I/O expansion controller m5::M5Unified& m5_unified; ///< Reference to M5Stack core functionality controller }; + +struct HardwareLowLevelController +{ + PaHubToPbHubController& pb_hub_controller_1; ///< Reference to PbHub I/O expansion controller + PaHubToPbHubController& pb_hub_controller_2; ///< Reference to PbHub I/O expansion controller + m5::M5Unified& m5_unified; ///< Reference to M5Stack core functionality controller +}; \ No newline at end of file diff --git a/idf/taskboard/main/hal/PaHubToPbHubController.hpp b/idf/taskboard/main/hal/PaHubToPbHubController.hpp new file mode 100644 index 0000000..8962a33 --- /dev/null +++ b/idf/taskboard/main/hal/PaHubToPbHubController.hpp @@ -0,0 +1,134 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include + +#include + +#include + +#include + +/** + * @struct PaHubToPbHubController + * + * @brief Controller for I2C communication with PbHub device + * + */ +struct PaHubToPbHubController : + public PbHubController +{ + const char* TAG = "PaHubToPbHubController"; ///< Logging tag + + static constexpr uint8_t PAHUB_I2C_ADDR = 0x70; ///< Default I2C address for PaHub + static constexpr uint8_t PBHUB_I2C_ADDR = 0x61; ///< Default I2C address for PbHub + + /** + * @brief Constructs a new PaHubToPbHubController object + * + * @details Initializes I2C communication with default address + */ + PaHubToPbHubController(uint8_t pb_hub_channel) noexcept + : pa_hub_i2c_addr_(PAHUB_I2C_ADDR), + i2c_addr_(PBHUB_I2C_ADDR), + pb_hub_channel_(pb_hub_channel) + { + bool init = M5.Ex_I2C.begin(); + + if (init) + { + ESP_LOGI(TAG, "PaHubToPbHubController::PaHubToPbHubController() on address %d", i2c_addr_); + } + else + { + ESP_LOGE(TAG, "PaHubToPbHubController::PaHubToPbHubController() failed"); + } + } + +private: + + /** + * @brief Selects the TCA9548A I2C multiplexer channel + * + * @param bus Target bus number + * + * @return true if operation successful, false otherwise + */ + bool TCA9548A_select(uint8_t bus) + { + bool status = true; + + status = status && M5.Ex_I2C.start(pa_hub_i2c_addr_, false, I2C_FREQ); + status = status && M5.Ex_I2C.write(1 << bus); + status = status && M5.Ex_I2C.stop(); + + return status; + } + + /** + * @brief Performs I2C read operation + * + * @param channel Target channel + * @param operation Operation to perform + * @param data Buffer for read data + * @param length Number of bytes to read + * + * @return true if operation successful, false otherwise + */ + bool read_operation( + const Channel channel, + const Operation operation, + uint8_t* data, + const size_t length) + { + bool status = true; + + status = status && TCA9548A_select(pb_hub_channel_); + + status = status && PbHubController::read_operation(channel, operation, data, length); + + if (!status) + { + ESP_LOGE(TAG, "PaHubToPbHubController::read_digital() failed"); + } + + return status; + } + + /** + * @brief Performs I2C write operation + * + * @param channel Target channel + * @param operation Operation to perform + * @param data Data to write + * @param length Number of bytes to write + * + * @return true if operation successful, false otherwise + */ + bool write_operation( + const Channel channel, + const Operation operation, + const uint8_t* data, + const size_t length) + { + bool status = true; + + status = status && TCA9548A_select(pb_hub_channel_); + + status = status && PbHubController::write_operation(channel, operation, data, length); + + if (!status) + { + ESP_LOGE(TAG, "PaHubToPbHubController::write_digital() failed"); + } + + return status; + } + + const uint8_t pa_hub_i2c_addr_ = 0; ///< I2C address of PaHub device + const uint8_t i2c_addr_ = 0; ///< I2C address of PbHub device + const uint8_t pb_hub_channel_ = 0; ///< Channel of PbHub device +}; diff --git a/idf/taskboard/main/hal/PbHubController.hpp b/idf/taskboard/main/hal/PbHubController.hpp index d2343e9..e9dd718 100644 --- a/idf/taskboard/main/hal/PbHubController.hpp +++ b/idf/taskboard/main/hal/PbHubController.hpp @@ -160,7 +160,7 @@ struct PbHubController read_operation(channel, Operation::WRITE_IO1, reinterpret_cast(&data), sizeof(data)); } -private: +protected: /** * @brief Performs I2C read operation @@ -179,18 +179,18 @@ struct PbHubController const size_t length) { bool status = true; - status &= M5.Ex_I2C.start(i2c_addr_, false, I2C_FREQ); - status &= M5.Ex_I2C.write(static_cast(channel) + static_cast(operation)); - status &= M5.Ex_I2C.stop(); + status = status && M5.Ex_I2C.start(i2c_addr_, false, I2C_FREQ); + status = status && M5.Ex_I2C.write(static_cast(channel) + static_cast(operation)); + status = status && M5.Ex_I2C.stop(); - status &= M5.Ex_I2C.start(i2c_addr_, true, I2C_FREQ); + status = status && M5.Ex_I2C.start(i2c_addr_, true, I2C_FREQ); for (size_t i = 0; i < length; i++) { - status &= M5.Ex_I2C.read(&data[i], 1); + status = status && M5.Ex_I2C.read(&data[i], 1); } - status &= M5.Ex_I2C.stop(); + status = status && M5.Ex_I2C.stop(); if (!status) { @@ -217,10 +217,10 @@ struct PbHubController const size_t length) { bool status = true; - status &= M5.Ex_I2C.start(i2c_addr_, false, I2C_FREQ); - status &= M5.Ex_I2C.write(static_cast(channel) + static_cast(operation)); - status &= M5.Ex_I2C.write(data, length); - status &= M5.Ex_I2C.stop(); + status = status && M5.Ex_I2C.start(i2c_addr_, false, I2C_FREQ); + status = status && M5.Ex_I2C.write(static_cast(channel) + static_cast(operation)); + status = status && M5.Ex_I2C.write(data, length); + status = status && M5.Ex_I2C.stop(); if (!status) { @@ -230,5 +230,7 @@ struct PbHubController return status; } +private: + const uint8_t i2c_addr_ = 0; ///< I2C address of PbHub device }; diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 4dfa49a..b63dca4 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -53,70 +53,76 @@ struct TaskBoardDriver_v1 : unique_ssid_ = ssid_with_mac; // Initialize sensors - Sensor* blue_button = new Sensor("BLUE_BUTTON", [&]() + Sensor* ball_goal_1 = new Sensor("BALL_GOAL_1", [&]() { bool value = - hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: CHANNEL_0); - return SensorMeasurement(!value); // Button is inverted + return SensorMeasurement(value); }); - Sensor* red_button = new Sensor("RED_BUTTON", [&]() + Sensor* ball_goal_2 = new Sensor("BALL_GOAL_2", [&]() { bool value = - hardware_low_level_controller_.pb_hub_controller.read_digital_IO1(PbHubController::Channel:: - CHANNEL_0); + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: + CHANNEL_1); - return SensorMeasurement(!value); // Button is inverted + return SensorMeasurement(value); }); - Sensor* fader = new AnalogFilteredSensor("FADER", 10, [&]() + Sensor* ball_goal_3 = new Sensor("BALL_GOAL_3", [&]() { - uint16_t value = - hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( - PbHubController::Channel::CHANNEL_5); - float float_value = static_cast(value) / 4095.0f; + bool value = + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: + CHANNEL_2); - return SensorMeasurement(float_value); + return SensorMeasurement(value); }); - Sensor* door_angle = new AnalogFilteredSensor("DOOR_ANGLE", 10, [&]() + Sensor* ball_goal_4 = new Sensor("BALL_GOAL_4", [&]() { - uint16_t value = - hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( - PbHubController::Channel::CHANNEL_4); - float float_value = static_cast(value) / 4095.0f; + bool value = + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: + CHANNEL_3); - return SensorMeasurement(float_value); + return SensorMeasurement(value); }); - Sensor* light_right = new Sensor("LIGHT_RIGHT", [&]() + Sensor* blue_button_left = new Sensor("BLUE_BUTTON_LEFT", [&]() { bool value = - hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: - CHANNEL_2); + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: + CHANNEL_4); - return SensorMeasurement(value); + return SensorMeasurement(!value); // Button is inverted }); - Sensor* light_left = new Sensor("LIGHT_LEFT", [&]() + Sensor* red_button_left = new Sensor("RED_BUTTON_LEFT", [&]() { bool value = - hardware_low_level_controller_.pb_hub_controller.read_digital_IO0(PbHubController::Channel:: - CHANNEL_1); + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO1(PbHubController::Channel:: + CHANNEL_4); - return SensorMeasurement(value); + return SensorMeasurement(!value); // Button is inverted }); - Sensor* probe_goal_analog = new Sensor("PROBE_GOAL_ANALOG", [&]() + Sensor* blue_button_right = new Sensor("BLUE_BUTTON_RIGHT", [&]() { - uint16_t value = - hardware_low_level_controller_.pb_hub_controller.read_analog_IO0( - PbHubController::Channel::CHANNEL_3); - float float_value = static_cast(value) / 4095.0f; + bool value = + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO0(PbHubController::Channel:: + CHANNEL_5); - return SensorMeasurement(float_value); + return SensorMeasurement(!value); // Button is inverted + }); + + Sensor* red_button_right = new Sensor("RED_BUTTON_RIGHT", [&]() + { + bool value = + hardware_low_level_controller_.pb_hub_controller_1.read_digital_IO1(PbHubController::Channel:: + CHANNEL_5); + + return SensorMeasurement(!value); // Button is inverted }); Sensor* on_board_button_a = new Sensor("ON_BOARD_BUTTON_A", [&]() @@ -180,58 +186,6 @@ struct TaskBoardDriver_v1 : }); // Initialize aggregated sensors - Sensor* door_status = new Sensor("DOOR_OPEN", [=]() - { - bool is_open = true; - - if (door_angle->read().get_type() == SensorMeasurement::Type::ANALOG) - { - if (door_angle->read().get_analog() > 0.7) - { - is_open = false; - } - } - - return SensorMeasurement(is_open); - }); - - Sensor* free_cable = new Sensor("FREE_CABLE", [=]() - { - const bool is_cable_free = - !light_right->read().get_boolean() && - !light_left->read().get_boolean(); - - return SensorMeasurement(is_cable_free); - }); - - Sensor* attached_cable = new Sensor("ATTACHED_CABLE", [=]() - { - const bool is_cable_attached = - light_right->read().get_boolean() && - light_left->read().get_boolean(); - - return SensorMeasurement(is_cable_attached); - }); - - Sensor* probe_goal = new Sensor("PROBE_GOAL", [=]() - { - auto analog_measure = probe_goal_analog->read(); - - const bool is_touching_goal = analog_measure.get_analog() < 0.1; - - return SensorMeasurement(is_touching_goal); - }); - - Sensor* fader_trigger_blue_button = new TriggeredSensor("FADER_BLUE_BUTTON", *blue_button, [=]() - { - return fader->read(); - }); - - Sensor* red_button_counter = new CounterSensor("RED_BUTTON_COUNTER", [=]() - { - return red_button->read(); - }); - Sensor* touch_screen_position = new Sensor("TOUCH_SCREEN", [&]() { m5gfx::M5GFX& display = hardware_low_level_controller_.m5_unified.Display; @@ -258,13 +212,14 @@ struct TaskBoardDriver_v1 : }); // Store sensors - sensors_.push_back(blue_button); - sensors_.push_back(red_button); - sensors_.push_back(fader); - sensors_.push_back(door_angle); - sensors_.push_back(light_right); - sensors_.push_back(light_left); - sensors_.push_back(probe_goal_analog); + sensors_.push_back(ball_goal_1); + sensors_.push_back(ball_goal_2); + sensors_.push_back(ball_goal_3); + sensors_.push_back(ball_goal_4); + sensors_.push_back(blue_button_left); + sensors_.push_back(red_button_left); + sensors_.push_back(blue_button_right); + sensors_.push_back(red_button_right); sensors_.push_back(on_board_button_a); sensors_.push_back(on_board_button_b); sensors_.push_back(on_board_button_c); @@ -273,12 +228,6 @@ struct TaskBoardDriver_v1 : sensors_.push_back(magnetometer); sensors_.push_back(gyroscope); sensors_.push_back(temperature); - sensors_.push_back(door_status); - sensors_.push_back(free_cable); - sensors_.push_back(attached_cable); - sensors_.push_back(probe_goal); - sensors_.push_back(fader_trigger_blue_button); - sensors_.push_back(red_button_counter); sensors_.push_back(touch_screen_position); // Initial update @@ -297,37 +246,20 @@ struct TaskBoardDriver_v1 : // Create default tasks std::vector* precondition_steps = new std::vector { - new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.0f), 0.1f), - new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(false)), - new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(false)), - new TaskStepEqual(*get_sensor_by_name("FREE_CABLE"), SensorMeasurement(true)), new TaskStepTraceShapeSetPool("SET_SHAPE_POOL", shape_pool, default_shapes), }; default_precondition_task_ = new SimultaneousConditionTask(*precondition_steps, "Precondition Task"); - TaskStep* timed_fader_operation = - new TaskStepEqual(*get_sensor_by_name("FADER"), SensorMeasurement(0.5f), 0.05f); - // timed_fader_operation->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); - - TaskStep* random_fader_step = - new TaskStepEqualToRandom(*get_sensor_by_name("FADER"), 0.05f); - // random_fader_step->set_clue_timeout(*get_sensor_by_name("BLUE_BUTTON"), 3000); - std::vector* main_steps = new std::vector { - new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON"), SensorMeasurement(true)), - timed_fader_operation, + new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON_LEFT"), SensorMeasurement(true)), + new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON_LEFT"), SensorMeasurement(false)), + new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON_RIGHT"), SensorMeasurement(true)), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), - random_fader_step, - new TaskStepEqual(*get_sensor_by_name("FADER_BLUE_BUTTON"), SensorMeasurement(0.2f), 0.05f), new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), - new TaskStepEqual(*get_sensor_by_name("DOOR_OPEN"), SensorMeasurement(true)), - new TaskStepEqual(*get_sensor_by_name("PROBE_GOAL"), SensorMeasurement(true)), - new TaskStepEqual(*get_sensor_by_name("ATTACHED_CABLE"), SensorMeasurement(true)), - new TaskStepEqual(*get_sensor_by_name("RED_BUTTON_COUNTER"), SensorMeasurement(3ll)), }; default_task_ = new SequentialTask(*main_steps, "Default Task"); @@ -365,11 +297,6 @@ struct TaskBoardDriver_v1 : hardware_low_level_controller_.m5_unified.update(); hardware_low_level_controller_.m5_unified.Imu.update(); - // Handle floating values at PbHubController - // TODO(pgarrido): Handle this with Peter - hardware_low_level_controller_.pb_hub_controller.write_digital_IO0(PbHubController::Channel::CHANNEL_3, true); - hardware_low_level_controller_.pb_hub_controller.write_digital_IO1(PbHubController::Channel::CHANNEL_3, true); - for (auto& item : sensors_) { item->update(); diff --git a/idf/taskboard/main/main_core0.cpp b/idf/taskboard/main/main_core0.cpp index 3931e19..fba9bef 100644 --- a/idf/taskboard/main/main_core0.cpp +++ b/idf/taskboard/main/main_core0.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -100,17 +101,24 @@ extern "C" void app_main( M5.begin(); // Initialize hardware controllers and drivers - PbHubController pb_hub_controller; - HardwareLowLevelController hardware_low_level_controller = {pb_hub_controller, M5}; + PaHubToPbHubController pb_hub_controller_1(0); + PaHubToPbHubController pb_hub_controller_2(1); + HardwareLowLevelController hardware_low_level_controller = {pb_hub_controller_1, pb_hub_controller_2, M5}; TaskBoardDriver& task_board_driver = get_task_board_implementation(hardware_low_level_controller); ScreenController screen_controller(hardware_low_level_controller); NonVolatileStorage non_volatile_storage(task_board_driver.get_unique_id()); // Wait for PbHubController to initialize // This can take variable time after boot - while (!pb_hub_controller.check_status()) + while (!pb_hub_controller_1.check_status()) { - ESP_LOGI("app_main", "Waiting for PbHubController to start"); + ESP_LOGI("app_main", "Waiting for PbHubController 1 to start"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + + while (!pb_hub_controller_2.check_status()) + { + ESP_LOGI("app_main", "Waiting for PbHubController 2 to start"); vTaskDelay(pdMS_TO_TICKS(10)); } @@ -145,8 +153,8 @@ extern "C" void app_main( const SensorReader& BUTTON_A = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_A"); const SensorReader& BUTTON_B = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_B"); const SensorReader& BUTTON_PWR = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_PWR"); - const SensorReader& RED_BUTTON = *task_board_driver.get_sensor_by_name("RED_BUTTON"); - const SensorReader& BLUE_BUTTON = *task_board_driver.get_sensor_by_name("BLUE_BUTTON"); + const SensorReader& RED_BUTTON = *task_board_driver.get_sensor_by_name("RED_BUTTON_LEFT"); + const SensorReader& BLUE_BUTTON = *task_board_driver.get_sensor_by_name("BLUE_BUTTON_LEFT"); // Check if system should start in local mode (Button A pressed during boot) const bool start_local_mode = BUTTON_A.read() == true; From 728111c77316a5b63277b0c8b42ed1b080aa168f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 23 Apr 2025 10:03:51 +0000 Subject: [PATCH 26/35] Actuator.hpp, TaskStepActuator.hpp Add actuators (LEDS and solenoid) and 2025 task steps to TaskBoardDriver_TBv2025.hpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_TBv2025.hpp | 50 +++++++++++++ idf/taskboard/main/sensor/Actuator.hpp | 69 +++++++++++++++++ idf/taskboard/main/task/TaskStep.hpp | 1 + idf/taskboard/main/task/TaskStepActuator.hpp | 74 +++++++++++++++++++ .../main/task/TaskStepWaitRandom.hpp | 2 + 5 files changed, 196 insertions(+) create mode 100644 idf/taskboard/main/sensor/Actuator.hpp create mode 100644 idf/taskboard/main/task/TaskStepActuator.hpp diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index b63dca4..f456f33 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -230,6 +231,42 @@ struct TaskBoardDriver_v1 : sensors_.push_back(temperature); sensors_.push_back(touch_screen_position); + // Initialize actuators + Actuator* goal_1_led = new Actuator("GOAL_1_LED", [&](Actuator::State state) + { + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_0, state == Actuator::State::ON); + }); + Actuator* goal_2_led = new Actuator("GOAL_2_LED", [&](Actuator::State state) + { + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_1, state == Actuator::State::ON); + }); + Actuator* goal_3_led = new Actuator("GOAL_3_LED", [&](Actuator::State state) + { + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_2, state == Actuator::State::ON); + }); + Actuator* goal_4_led = new Actuator("GOAL_4_LED", [&](Actuator::State state) + { + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_3, state == Actuator::State::ON); + }); + Actuator* ball_drop_solenoid = new Actuator("BALL_DROP_SOLENOID", [&](Actuator::State state) + { + // TODO (anton): Check actual pin + }); + Actuator* all_goal_leds = new Actuator("ALL_GOAL_LEDS", [&](Actuator::State state) + { + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_0, state == Actuator::State::ON); + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_1, state == Actuator::State::ON); + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_2, state == Actuator::State::ON); + hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_3, state == Actuator::State::ON); + }); + + actuators_.push_back(goal_1_led); + actuators_.push_back(goal_2_led); + actuators_.push_back(goal_3_led); + actuators_.push_back(goal_4_led); + actuators_.push_back(ball_drop_solenoid); + actuators_.push_back(all_goal_leds); + // Initial update update(); @@ -247,6 +284,8 @@ struct TaskBoardDriver_v1 : std::vector* precondition_steps = new std::vector { new TaskStepTraceShapeSetPool("SET_SHAPE_POOL", shape_pool, default_shapes), + new TaskStepActuator(*all_goal_leds, Actuator::State::OFF), + new TaskStepActuator(*ball_drop_solenoid, Actuator::State::OFF), }; default_precondition_task_ = new SimultaneousConditionTask(*precondition_steps, "Precondition Task"); @@ -260,6 +299,16 @@ struct TaskBoardDriver_v1 : new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), + new TaskStepActuator(*ball_drop_solenoid, Actuator::State::ON), + new TaskStepActuator(*all_goal_leds, Actuator::State::ON), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_1"), SensorMeasurement(true)), + new TaskStepActuator(*goal_1_led, Actuator::State::OFF), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_2"), SensorMeasurement(true)), + new TaskStepActuator(*goal_2_led, Actuator::State::OFF), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_3"), SensorMeasurement(true)), + new TaskStepActuator(*goal_3_led, Actuator::State::OFF), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_4"), SensorMeasurement(true)), + new TaskStepActuator(*goal_4_led, Actuator::State::OFF), }; default_task_ = new SequentialTask(*main_steps, "Default Task"); @@ -351,6 +400,7 @@ struct TaskBoardDriver_v1 : HardwareLowLevelController& hardware_low_level_controller_; ///< Reference to hardware interface std::vector sensors_; ///< List of all board sensors + std::vector actuators_; ///< List of all board actuators std::string unique_id_ = "TaskBoard_v1"; ///< Board identifier std::string unique_ssid_ = "Robothon Task Board"; ///< Board identifier diff --git a/idf/taskboard/main/sensor/Actuator.hpp b/idf/taskboard/main/sensor/Actuator.hpp new file mode 100644 index 0000000..e3733df --- /dev/null +++ b/idf/taskboard/main/sensor/Actuator.hpp @@ -0,0 +1,69 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include + +#include +#include + +/** + * @struct Acuator + * + * @brief Concrete implementation of an actuator + */ +struct Actuator +{ + enum State + { + OFF = 0, + ON = 1 + }; + + /// @brief Function type for setting actuator state + using SetFunction = std::function; + + /** + * @brief Constructs a new Actuator object + * + * @param name Identifier for the actuator + * @param set_state_function Callback function that changes the actuator state + */ + Actuator( + const std::string& name, + SetFunction set_state_function) + : name_(name), + set_function_(set_state_function) + { + } + + /** + * @brief Virtual destructor + */ + virtual ~Actuator() = default; + + /** + * @brief Gets the name of the actuator + */ + const std::string& name() const + { + return name_; + } + + /** + * @brief Sets the state of the actuator + * + * @param status State to set the actuator to + */ + virtual void set_state(State status) const + { + set_function_(status); + } + +protected: + + std::string name_; ///< Sensor identifier + SetFunction set_function_; ///< Callback function to set actuator state +}; diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 3768eb6..e21ec53 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -147,6 +147,7 @@ struct TaskStepBase : TRACE_SHAPE_FROM_POOL, ///< Sensor value must follow a path selected at random from a pool TRACE_SHAPE_MANAGE_POOL, ///< Manage a shape pool WAIT_RANDOM, ///< Wait for a random time + ACTUATOR, ///< Actuator control step UNKNOWN ///< Undefined comparison type }; diff --git a/idf/taskboard/main/task/TaskStepActuator.hpp b/idf/taskboard/main/task/TaskStepActuator.hpp new file mode 100644 index 0000000..0a322c5 --- /dev/null +++ b/idf/taskboard/main/task/TaskStepActuator.hpp @@ -0,0 +1,74 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include + +#include +#include + +/** + * @struct TaskStepActuator + * + * @brief Implementation of TaskStep that acts on a Hardware actuator + */ +struct TaskStepActuator : + public TaskStepAuto +{ + /** + * @brief Constructs a new TaskStepActuator object + * + * @param actuator Actuator to control + * @param state State to set the actuator to + */ + TaskStepActuator( + Actuator& actuator, + const Actuator::State state) + : TaskStepAuto(actuator.name()), + actuator_(actuator), + state_(state) + { + TaskStepAuto::type_ = Type::ACTUATOR; + } + + /// Virtual method implementation + void initialize_step() const override + { + actuator_.set_state(state_); + } + + /// Virtual method implementation + bool success() const override + { + return true; + } + + /// Virtual method implementation + float score() const override + { + return -1.0f; + } + + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + screen_controller.print_task_clue("Activating " + actuator_.name() + " to state " + std::to_string(state_)); + } + else + { + reset_clue(); + } + } + + Actuator& actuator_; ///< Reference to the actuator + const Actuator::State state_; ///< State to set the actuator to +}; diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index 2ab7978..5bfcb69 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -21,6 +21,8 @@ struct TaskStepWaitRandom : * @brief Constructs a new TaskStepWaitRandom object * * @param name Name identifier for the task step + * @param minimum_waiting_time_ms Minimum waiting time in milliseconds + * @param maximum_waiting_time_ms Maximum waiting time in milliseconds */ TaskStepWaitRandom( std::string name = "", From ebfd3d46f3277f20154ebc9509564d5868e94643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Wed, 23 Apr 2025 15:48:56 +0000 Subject: [PATCH 27/35] Ball-drop solenoid actual hardware pin. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/board/TaskBoardDriver_TBv2025.hpp | 12 +++++++++++- .../main/task/TaskStepTraceShapeFromPool.hpp | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index f456f33..3ed2d01 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -248,9 +248,19 @@ struct TaskBoardDriver_v1 : { hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_3, state == Actuator::State::ON); }); + + gpio_config_t io_conf = { + .pin_bit_mask = (1ULL << GPIO_NUM_27), // Use GPIO 27 + .mode = GPIO_MODE_OUTPUT, // Set as output + .pull_up_en = GPIO_PULLUP_DISABLE, // No pull-up + .pull_down_en = GPIO_PULLDOWN_DISABLE, // No pull-down + .intr_type = GPIO_INTR_DISABLE // No interrupt + }; + gpio_config(&io_conf); // Apply the configuration + Actuator* ball_drop_solenoid = new Actuator("BALL_DROP_SOLENOID", [&](Actuator::State state) { - // TODO (anton): Check actual pin + gpio_set_level(GPIO_NUM_27, state == Actuator::State::ON); }); Actuator* all_goal_leds = new Actuator("ALL_GOAL_LEDS", [&](Actuator::State state) { diff --git a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp index 32292e4..e274aa2 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp @@ -195,7 +195,7 @@ struct TaskStepTraceShapeFromPool : }; // Random radius between 20 and 35 const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; - //Random starting angle + // Random starting angle const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; const float increment = 2.0f * M_PI / n_points; From 3ea333e573902249ed8d80e6287ffff1b6624e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 08:00:01 +0000 Subject: [PATCH 28/35] Fix calling the proper read_operation/write_operation functions. Reduce write operations to PaHub by saving last selected channel. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/PaHubToPbHubController.hpp | 101 +++++++++++++----- idf/taskboard/main/hal/PbHubController.hpp | 4 +- idf/taskboard/main/main_core0.cpp | 8 +- 3 files changed, 83 insertions(+), 30 deletions(-) diff --git a/idf/taskboard/main/hal/PaHubToPbHubController.hpp b/idf/taskboard/main/hal/PaHubToPbHubController.hpp index 8962a33..ded3184 100644 --- a/idf/taskboard/main/hal/PaHubToPbHubController.hpp +++ b/idf/taskboard/main/hal/PaHubToPbHubController.hpp @@ -13,43 +13,38 @@ #include /** - * @struct PaHubToPbHubController - * - * @brief Controller for I2C communication with PbHub device - * + * @struct PaHubController + * + * @brief Controller for I2C communication with PaHub device + * */ -struct PaHubToPbHubController : - public PbHubController +struct PaHubController { - const char* TAG = "PaHubToPbHubController"; ///< Logging tag + const char* TAG = "PaHubController"; ///< Logging tag + static constexpr uint32_t I2C_FREQ = 400000; ///< I2C bus frequency in Hz static constexpr uint8_t PAHUB_I2C_ADDR = 0x70; ///< Default I2C address for PaHub - static constexpr uint8_t PBHUB_I2C_ADDR = 0x61; ///< Default I2C address for PbHub /** - * @brief Constructs a new PaHubToPbHubController object + * @brief Constructs a new PaHubController object * * @details Initializes I2C communication with default address */ - PaHubToPbHubController(uint8_t pb_hub_channel) noexcept - : pa_hub_i2c_addr_(PAHUB_I2C_ADDR), - i2c_addr_(PBHUB_I2C_ADDR), - pb_hub_channel_(pb_hub_channel) + PaHubController() noexcept + : i2c_addr_(PAHUB_I2C_ADDR) { bool init = M5.Ex_I2C.begin(); if (init) { - ESP_LOGI(TAG, "PaHubToPbHubController::PaHubToPbHubController() on address %d", i2c_addr_); + ESP_LOGI(TAG, "PaHubController::PaHubController() on address %d", i2c_addr_); } else { - ESP_LOGE(TAG, "PaHubToPbHubController::PaHubToPbHubController() failed"); + ESP_LOGE(TAG, "PaHubController::PaHubController() failed"); } } -private: - /** * @brief Selects the TCA9548A I2C multiplexer channel * @@ -61,13 +56,67 @@ struct PaHubToPbHubController : { bool status = true; - status = status && M5.Ex_I2C.start(pa_hub_i2c_addr_, false, I2C_FREQ); - status = status && M5.Ex_I2C.write(1 << bus); - status = status && M5.Ex_I2C.stop(); + if (bus != last_channel_selected_) + { + status = status && M5.Ex_I2C.start(i2c_addr_, false, I2C_FREQ); + status = status && M5.Ex_I2C.write(1 << bus); + status = status && M5.Ex_I2C.stop(); + if (status) + { + last_channel_selected_ = bus; + ESP_LOGI(TAG, "TCA9548A_select() bus %d selected", bus); + } + } return status; } +private: + + const uint8_t i2c_addr_ = 0; ///< I2C address of PaHub device + uint8_t last_channel_selected_ = -1; ///< Last selected channel + +}; + + + +/** + * @struct PaHubToPbHubController + * + * @brief Controller for I2C communication with PbHub device through PaHub + * + */ +struct PaHubToPbHubController : + public PbHubController +{ + const char* TAG = "PaHubToPbHubController"; ///< Logging tag + + static constexpr uint8_t PBHUB_I2C_ADDR = 0x61; ///< Default I2C address for PbHub + + /** + * @brief Constructs a new PaHubToPbHubController object + * + * @details Initializes I2C communication with default address + */ + PaHubToPbHubController(PaHubController& pa_hub_controller,uint8_t pb_hub_channel) noexcept + : i2c_addr_(PBHUB_I2C_ADDR), + pa_hub_controller_(pa_hub_controller), + pb_hub_channel_(pb_hub_channel) + { + bool init = M5.Ex_I2C.begin(); + + if (init) + { + ESP_LOGI(TAG, "PaHubToPbHubController::PaHubToPbHubController() on address %d", i2c_addr_); + } + else + { + ESP_LOGE(TAG, "PaHubToPbHubController::PaHubToPbHubController() failed"); + } + } + +private: + /** * @brief Performs I2C read operation * @@ -82,11 +131,11 @@ struct PaHubToPbHubController : const Channel channel, const Operation operation, uint8_t* data, - const size_t length) + const size_t length) override { bool status = true; - status = status && TCA9548A_select(pb_hub_channel_); + status = status && pa_hub_controller_.TCA9548A_select(pb_hub_channel_); status = status && PbHubController::read_operation(channel, operation, data, length); @@ -112,11 +161,11 @@ struct PaHubToPbHubController : const Channel channel, const Operation operation, const uint8_t* data, - const size_t length) + const size_t length) override { bool status = true; - status = status && TCA9548A_select(pb_hub_channel_); + status = status && pa_hub_controller_.TCA9548A_select(pb_hub_channel_); status = status && PbHubController::write_operation(channel, operation, data, length); @@ -128,7 +177,7 @@ struct PaHubToPbHubController : return status; } - const uint8_t pa_hub_i2c_addr_ = 0; ///< I2C address of PaHub device const uint8_t i2c_addr_ = 0; ///< I2C address of PbHub device - const uint8_t pb_hub_channel_ = 0; ///< Channel of PbHub device + PaHubController& pa_hub_controller_; ///< Reference to PaHub controller + const uint8_t pb_hub_channel_ = 0; ///< Channel of PaHub where PbHub is located }; diff --git a/idf/taskboard/main/hal/PbHubController.hpp b/idf/taskboard/main/hal/PbHubController.hpp index e9dd718..1360467 100644 --- a/idf/taskboard/main/hal/PbHubController.hpp +++ b/idf/taskboard/main/hal/PbHubController.hpp @@ -172,7 +172,7 @@ struct PbHubController * * @return true if operation successful, false otherwise */ - bool read_operation( + virtual bool read_operation( const Channel channel, const Operation operation, uint8_t* data, @@ -210,7 +210,7 @@ struct PbHubController * * @return true if operation successful, false otherwise */ - bool write_operation( + virtual bool write_operation( const Channel channel, const Operation operation, const uint8_t* data, diff --git a/idf/taskboard/main/main_core0.cpp b/idf/taskboard/main/main_core0.cpp index fba9bef..907289b 100644 --- a/idf/taskboard/main/main_core0.cpp +++ b/idf/taskboard/main/main_core0.cpp @@ -33,6 +33,9 @@ #include #include +static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB1 = 0; +static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB2 = 1; + // Forward declarations struct WebSocketTaskArgs { @@ -101,8 +104,9 @@ extern "C" void app_main( M5.begin(); // Initialize hardware controllers and drivers - PaHubToPbHubController pb_hub_controller_1(0); - PaHubToPbHubController pb_hub_controller_2(1); + PaHubController pa_hub_controller; + PaHubToPbHubController pb_hub_controller_1(pa_hub_controller, PAHUB_CHANNEL_FOR_PBHUB1); + PaHubToPbHubController pb_hub_controller_2(pa_hub_controller, PAHUB_CHANNEL_FOR_PBHUB2); HardwareLowLevelController hardware_low_level_controller = {pb_hub_controller_1, pb_hub_controller_2, M5}; TaskBoardDriver& task_board_driver = get_task_board_implementation(hardware_low_level_controller); ScreenController screen_controller(hardware_low_level_controller); From 4bde417bf5f211d4bd89e2051dc88f0da5048f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 08:32:01 +0000 Subject: [PATCH 29/35] TaskStepEqualDuringRandom: To complete the task step the condition must be met during a random amount of time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_TBv2025.hpp | 5 +- idf/taskboard/main/task/TaskStep.hpp | 1 + .../main/task/TaskStepEqualDuringRandom.hpp | 107 ++++++++++++++++++ .../main/task/TaskStepWaitRandom.hpp | 4 +- 4 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 3ed2d01..0d975d0 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -257,7 +258,7 @@ struct TaskBoardDriver_v1 : .intr_type = GPIO_INTR_DISABLE // No interrupt }; gpio_config(&io_conf); // Apply the configuration - + Actuator* ball_drop_solenoid = new Actuator("BALL_DROP_SOLENOID", [&](Actuator::State state) { gpio_set_level(GPIO_NUM_27, state == Actuator::State::ON); @@ -308,7 +309,7 @@ struct TaskBoardDriver_v1 : new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), - new TaskStepWaitRandom("WAIT_FOR_BALL_RELEASE"), + new TaskStepEqualDuringRandom(*get_sensor_by_name("BLUE_BUTTON_LEFT"), SensorMeasurement(true), 0.0, 3000L, 8000L), new TaskStepActuator(*ball_drop_solenoid, Actuator::State::ON), new TaskStepActuator(*all_goal_leds, Actuator::State::ON), new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_1"), SensorMeasurement(true)), diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index e21ec53..527f456 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -142,6 +142,7 @@ struct TaskStepBase : { EQUAL, ///< Sensor value must exactly match target EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target + EQUAL_DURING_RANDOM,///< Sensor value must match a target value maintained during a random time GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target TRACE_SHAPE, ///< Sensor value must follow a specific path TRACE_SHAPE_FROM_POOL, ///< Sensor value must follow a path selected at random from a pool diff --git a/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp new file mode 100644 index 0000000..baec39b --- /dev/null +++ b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp @@ -0,0 +1,107 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include + +#include +#include + +/** + * @struct TaskStepEqualDuringRandom + * + * @brief Implementation of TaskStep that checks for equality maintained during a random amount of time + */ +struct TaskStepEqualDuringRandom : + public TaskStepEqual +{ + /** + * @brief Constructs a new TaskStepEqualDuringRandom object + * + * @param sensor Reference to the sensor to monitor + * @param expected_value Target value that sensor should match + * @param tolerance Allowable deviation from expected value (default: 0.00) + * @param min_wait_time_ms Minimum wait time in milliseconds + * @param max_wait_time_ms Maximum wait time in milliseconds + */ + TaskStepEqualDuringRandom( + SensorReader& sensor, + const SensorMeasurement& expected_value, + const float tolerance = 0.00, + const int64_t min_wait_time_ms = 2000L, + const int64_t max_wait_time_ms = 10000L) + : TaskStepEqual(sensor, expected_value, tolerance) + , expected_value_(expected_value) + , tolerance_(tolerance) + , minimum_waiting_time_us_(min_wait_time_ms * 1000L) + , waiting_time_range_us_((max_wait_time_ms - min_wait_time_ms) * 1000L) + { + TaskStep::type_ = Type::EQUAL_DURING_RANDOM; + } + + /// Virtual method implementation + void initialize_step() const override + { + initial_time_ = esp_timer_get_time(); + random_waiting_time_us_ = minimum_waiting_time_us_ + waiting_time_range_us_ * esp_random() / UINT32_MAX; + + ESP_LOGI(TAG, "TaskStepEqualDuringRandom::initialize_step() minimum_waiting_time_us_ = %lld, waiting_time_range_us_ = %lld", + minimum_waiting_time_us_, waiting_time_range_us_); + ESP_LOGI(TAG, "TaskStepEqualDuringRandom::initialize_step() random_waiting_time_us_ = %lld", + random_waiting_time_us_); + + } + + /// Virtual method implementation + bool success() const override + { + if (SensorMeasurement::equal(sensor_.read(), expected_value_, tolerance_)) + { + return (esp_timer_get_time() - initial_time_) >= random_waiting_time_us_; + } + else + { + initial_time_ = esp_timer_get_time(); + } + return false; + } + + /// Virtual method implementation + float score() const override + { + return -1.0f; + } + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + screen_controller.print_task_clue(sensor_.name() + " != " + expected_value_.to_string() + + " (during " + std::to_string(random_waiting_time_us_ / 1000) + " ms)"); + + const auto sensor_value = sensor_.read(); + + if (sensor_value.get_type() == SensorMeasurement::Type::ANALOG) + { + screen_controller.print_task_clue_analog(sensor_value.get_analog(), expected_value_.get_analog()); + } + } + else + { + reset_clue(); + } + } + + const SensorMeasurement expected_value_; ///< Expected value + const float tolerance_; ///< Tolerance for equality check + const int64_t minimum_waiting_time_us_; ///< Minimum wait time in microseconds + const int64_t waiting_time_range_us_; ///< Waiting time range in microseconds + mutable int64_t initial_time_ = -1L; ///< Initial time when the step started + mutable int64_t random_waiting_time_us_ = 0L; ///< Current random target value +}; diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index 5bfcb69..7326328 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -71,8 +71,8 @@ struct TaskStepWaitRandom : } } - const int64_t minimum_waiting_time_us_ = 2000000L; ///< Minimum waiting time in microseconds - const int64_t waiting_time_range_us_ = 8000000L; ///< Waiting time range in microseconds + const int64_t minimum_waiting_time_us_; ///< Minimum waiting time in microseconds + const int64_t waiting_time_range_us_; ///< Waiting time range in microseconds mutable int64_t initial_time_ = -1L; ///< Initial time when the step started mutable int64_t random_waiting_time_us_ = 0L; ///< Current random target value }; From 8c0953fab9de5afe73d40e2093f599fdda771eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 08:55:17 +0000 Subject: [PATCH 30/35] Do not count time on TaskStepEqualDuringRandom, since completion time depends on random parameter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/task/SequentialTask.hpp | 2 +- idf/taskboard/main/task/TaskStep.hpp | 10 +++++----- idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index 104c8d4..0d678b4 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -79,7 +79,7 @@ struct SequentialTask : steps_completion_time_[current_step_] = steps_finish_time_[current_step_] - steps_finish_time_[current_step_ - 1]; } - if (!steps_[current_step_]->is_auto()) + if (steps_[current_step_]->is_time_counted()) { steps_time_sum_ += steps_completion_time_[current_step_]; } diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 527f456..6407c84 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -197,7 +197,7 @@ struct TaskStepBase : * * @return true if the step is automatic, false if it requires operation */ - virtual bool is_auto() const = 0; + virtual bool is_time_counted() const = 0; /** * @brief Gets the comparison type for this step @@ -257,9 +257,9 @@ struct TaskStep : } /// Virtual method implementation - bool is_auto() const override + bool is_time_counted() const override { - return false; + return true; } /** @@ -305,9 +305,9 @@ struct TaskStepAuto : } /// Virtual method implementation - bool is_auto() const override + bool is_time_counted() const override { - return true; + return false; } /// Virtual method implementation diff --git a/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp index baec39b..debd0ba 100644 --- a/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp +++ b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp @@ -74,6 +74,12 @@ struct TaskStepEqualDuringRandom : return -1.0f; } + /// Virtual method implementation + bool is_time_counted() const override + { + return false; + } + private: /// Virtual method implementation From c6be97760f4008d73f9414fbfd85eec18ead28ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 09:07:17 +0000 Subject: [PATCH 31/35] Initialize first step on sequential tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/task/SequentialTask.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/idf/taskboard/main/task/SequentialTask.hpp b/idf/taskboard/main/task/SequentialTask.hpp index 0d678b4..91b41ce 100644 --- a/idf/taskboard/main/task/SequentialTask.hpp +++ b/idf/taskboard/main/task/SequentialTask.hpp @@ -169,6 +169,10 @@ struct SequentialTask : current_step_ = 0; steps_time_sum_ = 0; Task::restart(); + if (steps_.size() > 0) + { + steps_[0]->initialize_step(); + } } private: From 7fc74f2b7d7ceedddac147709d245f7459e97bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 09:40:47 +0000 Subject: [PATCH 32/35] Hide uninteresting steps (immediate actuator steps) from user on web interface and screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- idf/taskboard/main/hal/ScreenController.hpp | 12 +++++++++--- idf/taskboard/main/network/JSONHandler.hpp | 5 +++++ idf/taskboard/main/task/TaskStep.hpp | 19 +++++++++++++++++++ .../main/task/TaskStepWaitRandom.hpp | 5 +++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/idf/taskboard/main/hal/ScreenController.hpp b/idf/taskboard/main/hal/ScreenController.hpp index f8e3008..16b423a 100644 --- a/idf/taskboard/main/hal/ScreenController.hpp +++ b/idf/taskboard/main/hal/ScreenController.hpp @@ -99,16 +99,22 @@ struct ScreenController : // Draw one circle per each task step constexpr uint32_t CIRCLE_RADIUS = 10; - for (size_t i = 0; i < task.total_steps(); i++) + for (size_t i = 0, aux = 0; i < task.total_steps(); i++) { + if (!task.step(i).show_to_user()) + { + continue; + } + if (task.step_done(i)) { - display_.fillCircle(15 + ((CIRCLE_RADIUS + 3) * 2 * i), 30, CIRCLE_RADIUS, TFT_GREEN); + display_.fillCircle(15 + ((CIRCLE_RADIUS + 3) * 2 * aux), 30, CIRCLE_RADIUS, TFT_GREEN); } else { - display_.drawCircle(15 + ((CIRCLE_RADIUS + 3) * 2 * i), 30, CIRCLE_RADIUS, TFT_RED); + display_.drawCircle(15 + ((CIRCLE_RADIUS + 3) * 2 * aux), 30, CIRCLE_RADIUS, TFT_RED); } + aux++; } } diff --git a/idf/taskboard/main/network/JSONHandler.hpp b/idf/taskboard/main/network/JSONHandler.hpp index 22ed15d..296289c 100644 --- a/idf/taskboard/main/network/JSONHandler.hpp +++ b/idf/taskboard/main/network/JSONHandler.hpp @@ -249,6 +249,11 @@ struct JSONHandler for (size_t i = 0; i < task.total_steps(); i++) { + if (!task.step(i).show_to_user()) + { + continue; + } + cJSON* step = cJSON_CreateObject(); cJSON_AddStringToObject(step, "sensor", task.step(i).name().c_str()); cJSON* done = task.step_done(i) ? cJSON_CreateTrue() : cJSON_CreateFalse(); diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index 6407c84..c9f11ab 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -199,6 +199,13 @@ struct TaskStepBase : */ virtual bool is_time_counted() const = 0; + /** + * @brief Checks if the step should be shown to the user + * + * @return true if the step should be shown, false otherwise + */ + virtual bool show_to_user() const = 0; + /** * @brief Gets the comparison type for this step * @@ -262,6 +269,12 @@ struct TaskStep : return true; } + /// Virtual method implementation + bool show_to_user() const override + { + return true; + } + /** * @brief Gets the associated sensor * @@ -310,6 +323,12 @@ struct TaskStepAuto : return false; } + /// Virtual method implementation + bool show_to_user() const override + { + return false; + } + /// Virtual method implementation SensorMeasurement expected_value() const override { diff --git a/idf/taskboard/main/task/TaskStepWaitRandom.hpp b/idf/taskboard/main/task/TaskStepWaitRandom.hpp index 7326328..dd4af64 100644 --- a/idf/taskboard/main/task/TaskStepWaitRandom.hpp +++ b/idf/taskboard/main/task/TaskStepWaitRandom.hpp @@ -54,6 +54,11 @@ struct TaskStepWaitRandom : return -1.0f; } + /// Virtual method implementation + bool show_to_user() const override + { + return true; + } private: From 3c5c19b5fc00490d518447dc933ddfbabaad56a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 12:32:59 +0000 Subject: [PATCH 33/35] Remove duplicated code in TraceShape task steps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../hal/board/TaskBoardDriver_TBv2025.hpp | 10 +- .../main/task/TaskStepEqualDuringRandom.hpp | 6 - .../main/task/TaskStepTraceShape.hpp | 263 ++++++++++-------- .../main/task/TaskStepTraceShapeFromPool.hpp | 201 +------------ .../task/TaskStepTraceShapeManagePool.hpp | 23 +- 5 files changed, 172 insertions(+), 331 deletions(-) diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index 0d975d0..b4b8306 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -281,15 +281,15 @@ struct TaskBoardDriver_v1 : // Initial update update(); - std::vector* default_shapes = new std::vector + std::vector* default_shapes = new std::vector { - TaskStepTraceShape::ShapeType::TRIANGLE, - TaskStepTraceShape::ShapeType::CIRCLE, - TaskStepTraceShape::ShapeType::SQUARE + TraceShapeCommon::ShapeType::TRIANGLE, + TraceShapeCommon::ShapeType::CIRCLE, + TraceShapeCommon::ShapeType::SQUARE }; // Create shape pool - std::vector* shape_pool = new std::vector {}; + std::vector* shape_pool = new std::vector {}; // Create default tasks std::vector* precondition_steps = new std::vector diff --git a/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp index debd0ba..5ea9afe 100644 --- a/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp +++ b/idf/taskboard/main/task/TaskStepEqualDuringRandom.hpp @@ -46,12 +46,6 @@ struct TaskStepEqualDuringRandom : { initial_time_ = esp_timer_get_time(); random_waiting_time_us_ = minimum_waiting_time_us_ + waiting_time_range_us_ * esp_random() / UINT32_MAX; - - ESP_LOGI(TAG, "TaskStepEqualDuringRandom::initialize_step() minimum_waiting_time_us_ = %lld, waiting_time_range_us_ = %lld", - minimum_waiting_time_us_, waiting_time_range_us_); - ESP_LOGI(TAG, "TaskStepEqualDuringRandom::initialize_step() random_waiting_time_us_ = %lld", - random_waiting_time_us_); - } /// Virtual method implementation diff --git a/idf/taskboard/main/task/TaskStepTraceShape.hpp b/idf/taskboard/main/task/TaskStepTraceShape.hpp index 9b20e33..8d99195 100644 --- a/idf/taskboard/main/task/TaskStepTraceShape.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShape.hpp @@ -10,16 +10,12 @@ #include /** - * @struct TaskStepTraceShape - * - * @brief Implementation of TaskStep that checks how closely a path is followed + * @struct TraceShapeCommon * - * @details Performs trace score evaluation between measured path and desired path + * @brief Helper functions common to TaskStepTraceShape and TaskStepTraceShapeFromPool */ -struct TaskStepTraceShape : - public TaskStep +struct TraceShapeCommon { - const char* TAG = "TaskStepTraceShape"; ///< Logging tag enum ShapeType { @@ -30,71 +26,79 @@ struct TaskStepTraceShape : SQUARE = 4, CIRCLE = 100 }; - + /** - * @brief Constructs a new TaskStepTraceShape object - * - * @param sensor Reference to the sensor to monitor + * @brief Generate expected path of shape shape + * + * @param shape Shape type to be traced + * @param expected_path Path to be traced */ - TaskStepTraceShape( - SensorReader& sensor, - ShapeType shape) - : TaskStep(sensor), - shape_(shape) + static void generate_expected_path( + const ShapeType shape, + std::vector& expected_path) { - TaskStep::type_ = Type::TRACE_SHAPE; - } - - /// Virtual method implementation - void initialize_step() const override - { - step_started_ = false; - - // Clear paths - expected_path_.clear(); - measured_path_.clear(); - - // Generate expected path of shape shape_ - switch (shape_) { + switch (shape) { case FOUR_SIDED: - draw_four_sided_shape(); - close_shape(); + draw_four_sided_shape(expected_path); + close_shape(expected_path); break; case POINT: case LINE: - draw_open_shape((uint8_t) shape_); + draw_open_shape((uint8_t) shape, expected_path); break; case TRIANGLE: - draw_open_shape(3); - close_shape(); + draw_open_shape(3, expected_path); + close_shape(expected_path); break; case SQUARE: case CIRCLE: - draw_regular_shape((uint8_t) shape_); - close_shape(); + draw_regular_shape((uint8_t) shape, expected_path); + close_shape(expected_path); break; } } /** - * @brief Adds the first point to the end of the vector + * @brief Draws a regular polygon with n_points + * + * @param n_points Number of points (vertices) + * @param expected_path Path to be traced */ - void close_shape() const + static void draw_regular_shape(const uint8_t n_points, std::vector& expected_path) { - expected_path_.push_back(expected_path_[0]); + // Random center point + SensorMeasurement::Vector3 center_point = SensorMeasurement::Vector3{ + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, + 0.0f + }; + // Random radius between 20 and 35 + const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; + // Random starting angle + const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; + + const float increment = 2.0f * M_PI / n_points; + for (size_t i = 0; i < n_points; i++) + { + const float angle = start_angle + i * increment; + const float x = center_point.x + radius * std::cos(angle); + const float y = center_point.y + radius * std::sin(angle); + expected_path.push_back(SensorMeasurement(SensorMeasurement::Vector3{x, y, 0.0f})); + } } /** * @brief Draws an open shape with n_points * * @param n_points Number of points (vertices) + * @param expected_path Path to be traced */ - void draw_open_shape(const uint8_t n_points) const + static void draw_open_shape(const uint8_t n_points, std::vector& expected_path) { const float limits[4] = { 5.0f, 95.0f, 30.0f, 90.0f }; const float min_distance = 30.0f; - while (expected_path_.size() < n_points) + while (expected_path.size() < n_points) { // Generate random point within the limits SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ @@ -105,7 +109,7 @@ struct TaskStepTraceShape : // Check if the point is too close to any other point bool valid_point = true; - for (const auto& point : expected_path_) + for (const auto& point : expected_path) { const auto last_point = point.get_vector3(); if (std::hypot( @@ -119,7 +123,7 @@ struct TaskStepTraceShape : if (valid_point) { - expected_path_.push_back(SensorMeasurement(next_point)); + expected_path.push_back(SensorMeasurement(next_point)); } } } @@ -130,8 +134,10 @@ struct TaskStepTraceShape : * @details The screen is divided into four sectors: Top left, bottom left, top right, and bottom right. * The four-sided shape has one point in per sector. * The points are not too close to each other. + * + * @param expected_path Path to be traced */ - void draw_four_sided_shape() const + static void draw_four_sided_shape(std::vector& expected_path) { const float limits[4][4] = { { 5.0f, 50.0f, 30.0f, 60.0f }, // Top left @@ -141,18 +147,18 @@ struct TaskStepTraceShape : }; const float min_distance = 30.0f; - while (expected_path_.size() < 4) + while (expected_path.size() < 4) { // Generate random point SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ - limits[expected_path_.size()][0] + (float) esp_random() * (limits[expected_path_.size()][1] - limits[expected_path_.size()][0]) / UINT32_MAX, - limits[expected_path_.size()][2] + (float) esp_random() * (limits[expected_path_.size()][3] - limits[expected_path_.size()][2]) / UINT32_MAX, + limits[expected_path.size()][0] + (float) esp_random() * (limits[expected_path.size()][1] - limits[expected_path.size()][0]) / UINT32_MAX, + limits[expected_path.size()][2] + (float) esp_random() * (limits[expected_path.size()][3] - limits[expected_path.size()][2]) / UINT32_MAX, 0.0f }; // Check if the point is too close to any other point bool valid_point = true; - for (const auto& point : expected_path_) + for (const auto& point : expected_path) { const auto last_point = point.get_vector3(); if (std::hypot( @@ -166,95 +172,63 @@ struct TaskStepTraceShape : if (valid_point) { - expected_path_.push_back(SensorMeasurement(next_point)); + expected_path.push_back(SensorMeasurement(next_point)); } } // Choose a random point to start the shape - const size_t start_point = esp_random() % expected_path_.size(); - std::rotate(expected_path_.begin(), expected_path_.begin() + start_point, expected_path_.end()); - } + const size_t start_point = esp_random() % expected_path.size(); + std::rotate(expected_path.begin(), expected_path.begin() + start_point, expected_path.end()); + } /** - * @brief Draws a regular polygon with n_points + * @brief Adds the first point to the end of the vector * - * @param n_points Number of points (vertices) + * @param expected_path Path to be traced */ - void draw_regular_shape(const uint8_t n_points) const + static void close_shape(std::vector& expected_path) { - // Random center point - SensorMeasurement::Vector3 center_point = SensorMeasurement::Vector3{ - 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, - 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, - 0.0f - }; - // Random radius between 20 and 35 - const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; - //Random starting angle - const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; - - const float increment = 2.0f * M_PI / n_points; - for (size_t i = 0; i < n_points; i++) - { - const float angle = start_angle + i * increment; - const float x = center_point.x + radius * std::cos(angle); - const float y = center_point.y + radius * std::sin(angle); - expected_path_.push_back(SensorMeasurement(SensorMeasurement::Vector3{x, y, 0.0f})); - } + expected_path.push_back(expected_path[0]); } - /// Virtual method implementation - bool success() const override - { - const auto sensor_value = sensor_.read(); - bool pressing_screen = (sensor_value.get_vector3().z != 0); - if (!step_started_) - { - step_started_ = pressing_screen; - } - else - { - if (pressing_screen) - { - measured_path_.push_back(sensor_value.get_vector3()); - } - else - { - return true; - } - } - return false; - } - - /// Virtual method implementation - float score() const override + /** + * @brief Calculates the score + * + * @param expected_path Path to be traced + * @param measured_path Path measured + * + * @return float Score + */ + static float calculate_score( + const std::vector& expected_path, + const std::vector& measured_path) { // Calculate distance between first point of expected path and first point of measured path float first_distance = std::hypot( - (expected_path_[0].get_vector3().x - measured_path_[0].get_vector3().x), - (expected_path_[0].get_vector3().y - measured_path_[0].get_vector3().y)); + (expected_path[0].get_vector3().x - measured_path[0].get_vector3().x), + (expected_path[0].get_vector3().y - measured_path[0].get_vector3().y)); // Calculate distance between last point of expected path and last point of measured path float last_distance = std::hypot( - (expected_path_[expected_path_.size() - 1].get_vector3().x - measured_path_[measured_path_.size() - 1].get_vector3().x), - (expected_path_[expected_path_.size() - 1].get_vector3().y - measured_path_[measured_path_.size() - 1].get_vector3().y)); + (expected_path[expected_path.size() - 1].get_vector3().x - measured_path[measured_path.size() - 1].get_vector3().x), + (expected_path[expected_path.size() - 1].get_vector3().y - measured_path[measured_path.size() - 1].get_vector3().y)); // Calculate length of expected path float expected_length = 0.0f; - for (size_t i = 1; i < expected_path_.size(); i++) + for (size_t i = 1; i < expected_path.size(); i++) { expected_length += std::hypot( - (expected_path_[i].get_vector3().x - expected_path_[i - 1].get_vector3().x), - (expected_path_[i].get_vector3().y - expected_path_[i - 1].get_vector3().y)); + (expected_path[i].get_vector3().x - expected_path[i - 1].get_vector3().x), + (expected_path[i].get_vector3().y - expected_path[i - 1].get_vector3().y)); } // Calculate length of measured path float measured_length = 0.0f; - for (size_t i = 1; i < measured_path_.size(); i++) + for (size_t i = 1; i < measured_path.size(); i++) { measured_length += std::hypot( - (measured_path_[i].get_vector3().x - measured_path_[i - 1].get_vector3().x), - (measured_path_[i].get_vector3().y - measured_path_[i - 1].get_vector3().y)); + (measured_path[i].get_vector3().x - measured_path[i - 1].get_vector3().x), + (measured_path[i].get_vector3().y - measured_path[i - 1].get_vector3().y)); } // Calculate score based on distances and difference of lenghts @@ -272,6 +246,73 @@ struct TaskStepTraceShape : return score; } +}; + +/** + * @struct TaskStepTraceShape + * + * @brief Implementation of TaskStep that checks how closely a path is followed + * + * @details Performs trace score evaluation between measured path and desired path + */ +struct TaskStepTraceShape : + public TaskStep +{ + const char* TAG = "TaskStepTraceShape"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTraceShape object + * + * @param sensor Reference to the sensor to monitor + */ + TaskStepTraceShape( + SensorReader& sensor, + TraceShapeCommon::ShapeType shape) + : TaskStep(sensor), + shape_(shape) + { + TaskStep::type_ = Type::TRACE_SHAPE; + } + + /// Virtual method implementation + void initialize_step() const override + { + step_started_ = false; + + expected_path_.clear(); + measured_path_.clear(); + + TraceShapeCommon::generate_expected_path(shape_, expected_path_); + } + + /// Virtual method implementation + bool success() const override + { + const auto sensor_value = sensor_.read(); + bool pressing_screen = (sensor_value.get_vector3().z != 0); + if (!step_started_) + { + step_started_ = pressing_screen; + } + else + { + if (pressing_screen) + { + measured_path_.push_back(sensor_value.get_vector3()); + } + else + { + return true; + } + } + return false; + } + + /// Virtual method implementation + float score() const override + { + return TraceShapeCommon::calculate_score(expected_path_, measured_path_); + } /// Virtual method implementation SensorMeasurement expected_value() const override @@ -300,7 +341,7 @@ struct TaskStepTraceShape : } } - const ShapeType shape_; ///< Shape type to be traced + const TraceShapeCommon::ShapeType shape_; ///< Shape type to be traced mutable bool step_started_ = 0; ///< Flag to indicate if the step has started mutable std::vectorexpected_path_ = {}; ///< Path to be traced mutable std::vectormeasured_path_ = {}; ///< Path measured diff --git a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp index e274aa2..9e6b050 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeFromPool.hpp @@ -30,7 +30,7 @@ struct TaskStepTraceShapeFromPool : */ TaskStepTraceShapeFromPool( SensorReader& sensor, - std::vector* shape_pool) + std::vector* shape_pool) : TaskStep(sensor), shape_pool_(shape_pool) { @@ -50,162 +50,12 @@ struct TaskStepTraceShapeFromPool : shape_ = shape_pool_->at(0); shape_pool_->erase(shape_pool_->begin()); - ESP_LOGI(TAG, "Took shape %d from pool", shape_); - ESP_LOGI(TAG, "Shape pool size: %zu", shape_pool_->size()); - step_started_ = false; - // Clear paths expected_path_.clear(); measured_path_.clear(); - // Generate expected path of shape shape_ - switch (shape_) { - case TaskStepTraceShape::FOUR_SIDED: - draw_four_sided_shape(); - close_shape(); - break; - case TaskStepTraceShape::POINT: - case TaskStepTraceShape::LINE: - draw_open_shape((uint8_t) shape_); - break; - case TaskStepTraceShape::TRIANGLE: - draw_open_shape(3); - close_shape(); - break; - case TaskStepTraceShape::SQUARE: - case TaskStepTraceShape::CIRCLE: - draw_regular_shape((uint8_t) shape_); - close_shape(); - break; - } - } - - /** - * @brief Adds the first point to the end of the vector - */ - void close_shape() const - { - expected_path_.push_back(expected_path_[0]); - } - - /** - * @brief Draws an open shape with n_points - * - * @param n_points Number of points (vertices) - */ - void draw_open_shape(const uint8_t n_points) const - { - const float limits[4] = { 5.0f, 95.0f, 30.0f, 90.0f }; - const float min_distance = 30.0f; - - while (expected_path_.size() < n_points) - { - // Generate random point within the limits - SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ - limits[0] + (float) esp_random() * (limits[1] - limits[0]) / UINT32_MAX, - limits[2] + (float) esp_random() * (limits[3] - limits[2]) / UINT32_MAX, - 0.0f - }; - - // Check if the point is too close to any other point - bool valid_point = true; - for (const auto& point : expected_path_) - { - const auto last_point = point.get_vector3(); - if (std::hypot( - (last_point.x - next_point.x), - (last_point.y - next_point.y)) < min_distance) - { - valid_point = false; - break; - } - } - - if (valid_point) - { - expected_path_.push_back(SensorMeasurement(next_point)); - } - } - } - - /** - * @brief Draws a four-sided shape - * - * @details The screen is divided into four sectors: Top left, bottom left, top right, and bottom right. - * The four-sided shape has one point in per sector. - * The points are not too close to each other. - */ - void draw_four_sided_shape() const - { - const float limits[4][4] = { - { 5.0f, 50.0f, 30.0f, 60.0f }, // Top left - { 5.0f, 50.0f, 60.0f, 90.0f }, // Bottom left - { 50.0f, 95.0f, 60.0f, 90.0f }, // Bottom right - { 50.0f, 95.0f, 30.0f, 60.0f } // Top right - }; - const float min_distance = 30.0f; - - while (expected_path_.size() < 4) - { - // Generate random point - SensorMeasurement::Vector3 next_point = SensorMeasurement::Vector3{ - limits[expected_path_.size()][0] + (float) esp_random() * (limits[expected_path_.size()][1] - limits[expected_path_.size()][0]) / UINT32_MAX, - limits[expected_path_.size()][2] + (float) esp_random() * (limits[expected_path_.size()][3] - limits[expected_path_.size()][2]) / UINT32_MAX, - 0.0f - }; - - // Check if the point is too close to any other point - bool valid_point = true; - for (const auto& point : expected_path_) - { - const auto last_point = point.get_vector3(); - if (std::hypot( - (last_point.x - next_point.x), - (last_point.y - next_point.y)) < min_distance) - { - valid_point = false; - break; - } - } - - if (valid_point) - { - expected_path_.push_back(SensorMeasurement(next_point)); - } - } - - // Choose a random point to start the shape - const size_t start_point = esp_random() % expected_path_.size(); - std::rotate(expected_path_.begin(), expected_path_.begin() + start_point, expected_path_.end()); - } - - /** - * @brief Draws a regular polygon with n_points - * - * @param n_points Number of points (vertices) - */ - void draw_regular_shape(const uint8_t n_points) const - { - // Random center point - SensorMeasurement::Vector3 center_point = SensorMeasurement::Vector3{ - 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, - 40.0f + (float) esp_random() * 20.0f / UINT32_MAX, - 0.0f - }; - // Random radius between 20 and 35 - const float radius = 20.0f + (float) esp_random() * 15.0f / UINT32_MAX; - // Random starting angle - const float start_angle = (float) esp_random() * 2.0f * M_PI / UINT32_MAX; - - const float increment = 2.0f * M_PI / n_points; - for (size_t i = 0; i < n_points; i++) - { - const float angle = start_angle + i * increment; - const float x = center_point.x + radius * std::cos(angle); - const float y = center_point.y + radius * std::sin(angle); - expected_path_.push_back(SensorMeasurement(SensorMeasurement::Vector3{x, y, 0.0f})); - } + TraceShapeCommon::generate_expected_path(shape_, expected_path_); } /// Virtual method implementation @@ -234,48 +84,7 @@ struct TaskStepTraceShapeFromPool : /// Virtual method implementation float score() const override { - // Calculate distance between first point of expected path and first point of measured path - float first_distance = std::hypot( - (expected_path_[0].get_vector3().x - measured_path_[0].get_vector3().x), - (expected_path_[0].get_vector3().y - measured_path_[0].get_vector3().y)); - - // Calculate distance between last point of expected path and last point of measured path - float last_distance = std::hypot( - (expected_path_[expected_path_.size() - 1].get_vector3().x - measured_path_[measured_path_.size() - 1].get_vector3().x), - (expected_path_[expected_path_.size() - 1].get_vector3().y - measured_path_[measured_path_.size() - 1].get_vector3().y)); - - // Calculate length of expected path - float expected_length = 0.0f; - for (size_t i = 1; i < expected_path_.size(); i++) - { - expected_length += std::hypot( - (expected_path_[i].get_vector3().x - expected_path_[i - 1].get_vector3().x), - (expected_path_[i].get_vector3().y - expected_path_[i - 1].get_vector3().y)); - } - - // Calculate length of measured path - float measured_length = 0.0f; - for (size_t i = 1; i < measured_path_.size(); i++) - { - measured_length += std::hypot( - (measured_path_[i].get_vector3().x - measured_path_[i - 1].get_vector3().x), - (measured_path_[i].get_vector3().y - measured_path_[i - 1].get_vector3().y)); - } - - // Calculate score based on distances and difference of lenghts - float score = 100.0f - - 50.0*first_distance/141.42f - - 50.0*last_distance/141.42f - - (std::max(expected_length, measured_length) > 0.0f ? - 50.0*std::abs(expected_length - measured_length)/std::max(expected_length, measured_length) : - 0.0f); - - if (score < 0.0f) - { - score = 0.0f; - } - - return score; + return TraceShapeCommon::calculate_score(expected_path_, measured_path_); } /// Virtual method implementation @@ -305,10 +114,10 @@ struct TaskStepTraceShapeFromPool : } } - mutable TaskStepTraceShape::ShapeType shape_; ///< Shape type to be traced + mutable TraceShapeCommon::ShapeType shape_; ///< Shape type to be traced mutable bool step_started_ = 0; ///< Flag to indicate if the step has started mutable std::vectorexpected_path_ = {}; ///< Path to be traced mutable std::vectormeasured_path_ = {}; ///< Path measured - std::vector* shape_pool_; ///< Vector of shapes to select from + std::vector* shape_pool_; ///< Vector of shapes to select from }; diff --git a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp index a649dfa..70a5720 100644 --- a/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp +++ b/idf/taskboard/main/task/TaskStepTraceShapeManagePool.hpp @@ -50,8 +50,8 @@ struct TaskStepTraceShapeSetPool : */ TaskStepTraceShapeSetPool( std::string name, - std::vector* shape_pool, - std::vector* shapes_vector) + std::vector* shape_pool, + std::vector* shapes_vector) : TaskStepAuto(name) , shape_pool_(shape_pool) , shapes_vector_(shapes_vector) @@ -67,7 +67,6 @@ struct TaskStepTraceShapeSetPool : shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); esp_shuffle(shape_pool_); - ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); } /// Virtual method implementation @@ -91,8 +90,8 @@ struct TaskStepTraceShapeSetPool : screen_controller.print_task_clue("Shape pool filled"); } - std::vector* shape_pool_; ///< Vector of shapes to be filled - const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with + std::vector* shape_pool_; ///< Vector of shapes to be filled + const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with }; /** @@ -114,8 +113,8 @@ struct TaskStepTraceShapeFillPool : */ TaskStepTraceShapeFillPool( std::string name, - std::vector* shape_pool, - std::vector* shapes_vector) + std::vector* shape_pool, + std::vector* shapes_vector) : TaskStepAuto(name) , shape_pool_(shape_pool) , shapes_vector_(shapes_vector) @@ -128,7 +127,6 @@ struct TaskStepTraceShapeFillPool : { shape_pool_->insert(shape_pool_->end(), shapes_vector_->begin(), shapes_vector_->end()); esp_shuffle(shape_pool_); - ESP_LOGI(TAG, "Shape pool filled. Cointains %zu shapes", shape_pool_->size()); } /// Virtual method implementation @@ -152,8 +150,8 @@ struct TaskStepTraceShapeFillPool : screen_controller.print_task_clue("Shape pool filled"); } - std::vector* shape_pool_; ///< Vector of shapes to be filled - const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with + std::vector* shape_pool_; ///< Vector of shapes to be filled + const std::vector* shapes_vector_; ///< Vector of shapes to fill the pool with }; /** @@ -174,7 +172,7 @@ struct TaskStepTraceShapeEmptyPool : */ TaskStepTraceShapeEmptyPool( std::string name, - std::vector* shape_pool) + std::vector* shape_pool) : TaskStepAuto(name) , shape_pool_(shape_pool) { @@ -186,7 +184,6 @@ struct TaskStepTraceShapeEmptyPool : { shape_pool_->clear(); shape_pool_->shrink_to_fit(); - ESP_LOGI(TAG, "Shape pool emptied. Cointains %zu shapes", shape_pool_->size()); } /// Virtual method implementation @@ -210,5 +207,5 @@ struct TaskStepTraceShapeEmptyPool : screen_controller.print_task_clue("Shape pool emptied"); } - std::vector* shape_pool_; ///< Vector of shapes to be emptied + std::vector* shape_pool_; ///< Vector of shapes to be emptied }; \ No newline at end of file From be61472f273d512765d6364462d20d125270a85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Thu, 24 Apr 2025 14:56:02 +0000 Subject: [PATCH 34/35] Fix compatibility with TBv2023 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/HardwareLowLevelController.hpp | 14 ++--- idf/taskboard/main/hal/TaskBoardDriver.hpp | 9 ++++ .../hal/board/TaskBoardDriver_TBv2023.hpp | 22 ++++++-- .../hal/board/TaskBoardDriver_TBv2025.hpp | 37 +++++++++++-- idf/taskboard/main/main_core0.cpp | 53 ++++--------------- 5 files changed, 79 insertions(+), 56 deletions(-) diff --git a/idf/taskboard/main/hal/HardwareLowLevelController.hpp b/idf/taskboard/main/hal/HardwareLowLevelController.hpp index 2ba0d67..0923f61 100644 --- a/idf/taskboard/main/hal/HardwareLowLevelController.hpp +++ b/idf/taskboard/main/hal/HardwareLowLevelController.hpp @@ -4,6 +4,8 @@ #pragma once +#include + #include #include @@ -12,15 +14,15 @@ * * @brief Aggregates low-level hardware controllers */ -struct HardwareLowLevelController_v2023 -{ - PbHubController& pb_hub_controller; ///< Reference to PbHub I/O expansion controller - m5::M5Unified& m5_unified; ///< Reference to M5Stack core functionality controller -}; - struct HardwareLowLevelController { + +#if CONFIG_M5STACK_CORE2 PaHubToPbHubController& pb_hub_controller_1; ///< Reference to PbHub I/O expansion controller PaHubToPbHubController& pb_hub_controller_2; ///< Reference to PbHub I/O expansion controller +#else + PbHubController& pb_hub_controller; ///< Reference to PbHub I/O expansion controller +#endif + m5::M5Unified& m5_unified; ///< Reference to M5Stack core functionality controller }; \ No newline at end of file diff --git a/idf/taskboard/main/hal/TaskBoardDriver.hpp b/idf/taskboard/main/hal/TaskBoardDriver.hpp index 2e0633a..bba4152 100644 --- a/idf/taskboard/main/hal/TaskBoardDriver.hpp +++ b/idf/taskboard/main/hal/TaskBoardDriver.hpp @@ -7,6 +7,8 @@ #include #include +#include + #include #include @@ -69,6 +71,13 @@ struct TaskBoardDriver */ virtual const std::string& get_unique_ssid() const = 0; + /** + * @brief Gets the hardware low-level controller reference + * + * @return Reference to the hardware low-level controller + */ + virtual HardwareLowLevelController& get_hardware_low_level_controller() = 0; + /** * @brief Gets the default task configured for this board * diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp index 5e7223d..8cc8b03 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2023.hpp @@ -34,8 +34,9 @@ struct TaskBoardDriver_v1 : * @param hardware_low_level_controller Reference to hardware interface */ TaskBoardDriver_v1( - HardwareLowLevelController& hardware_low_level_controller) - : hardware_low_level_controller_(hardware_low_level_controller) + m5::M5Unified& m5_unified) + : pb_hub_controller_(new PbHubController()), + hardware_low_level_controller_(*pb_hub_controller_, m5_unified) { // Fill unique id uint8_t mac[6]; @@ -47,6 +48,14 @@ struct TaskBoardDriver_v1 : snprintf(ssid_with_mac, sizeof(ssid_with_mac), "Robothon Task Board %01X%02X", (mac[4] & 0x0F), mac[5]); unique_ssid_ = ssid_with_mac; + // Wait for PbHubController to initialize + // This can take variable time after boot + while (!hardware_low_level_controller_.pb_hub_controller.check_status()) + { + ESP_LOGI("app_main", "Waiting for PbHubController to start"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // Initialize sensors Sensor* blue_button = new Sensor("BLUE_BUTTON", [&]() { @@ -374,9 +383,16 @@ struct TaskBoardDriver_v1 : return unique_ssid_; } + /// Virtual method implementation + HardwareLowLevelController& get_hardware_low_level_controller() override + { + return hardware_low_level_controller_; + } + private: - HardwareLowLevelController& hardware_low_level_controller_; ///< Reference to hardware interface + PbHubController* pb_hub_controller_; ///< Pointer to the PbHubController instance + HardwareLowLevelController hardware_low_level_controller_; ///< Reference to hardware interface std::vector sensors_; ///< List of all board sensors std::string unique_id_ = "TaskBoard_v1"; ///< Board identifier std::string unique_ssid_ = "Robothon Task Board"; ///< Board identifier diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index b4b8306..ef48c7b 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -5,6 +5,8 @@ #pragma once +#include "driver/gpio.h" + #include #include #include @@ -35,14 +37,20 @@ struct TaskBoardDriver_v1 : { const char* TAG = "TaskBoardDriver_v1"; ///< Logging tag + static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB1 = 0; + static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB2 = 1; + /** * @brief Constructs a new TaskBoardDriver_v1 object * * @param hardware_low_level_controller Reference to hardware interface */ TaskBoardDriver_v1( - HardwareLowLevelController& hardware_low_level_controller) - : hardware_low_level_controller_(hardware_low_level_controller) + m5::M5Unified& m5_unified) + : pa_hub_controller_(new PaHubController()), + pb_hub_controller_1_(new PaHubToPbHubController(*pa_hub_controller_, PAHUB_CHANNEL_FOR_PBHUB1)), + pb_hub_controller_2_(new PaHubToPbHubController(*pa_hub_controller_, PAHUB_CHANNEL_FOR_PBHUB2)), + hardware_low_level_controller_(*pb_hub_controller_1_, *pb_hub_controller_2_, m5_unified) { // Fill unique id uint8_t mac[6]; @@ -54,6 +62,20 @@ struct TaskBoardDriver_v1 : snprintf(ssid_with_mac, sizeof(ssid_with_mac), "Robothon Task Board %01X%02X", (mac[4] & 0x0F), mac[5]); unique_ssid_ = ssid_with_mac; + // Wait for PbHubControllers to initialize + // This can take variable time after boot + while (!hardware_low_level_controller_.pb_hub_controller_1.check_status()) + { + ESP_LOGI("app_main", "Waiting for PbHubController 1 to start"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + + while (!hardware_low_level_controller_.pb_hub_controller_2.check_status()) + { + ESP_LOGI("app_main", "Waiting for PbHubController 2 to start"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // Initialize sensors Sensor* ball_goal_1 = new Sensor("BALL_GOAL_1", [&]() { @@ -407,9 +429,18 @@ struct TaskBoardDriver_v1 : return unique_ssid_; } + /// Virtual method implementation + HardwareLowLevelController& get_hardware_low_level_controller() override + { + return hardware_low_level_controller_; + } + private: - HardwareLowLevelController& hardware_low_level_controller_; ///< Reference to hardware interface + PaHubController* pa_hub_controller_; ///< Reference to PaHub controller + PaHubToPbHubController* pb_hub_controller_1_; ///< Reference to PbHub controller 1 + PaHubToPbHubController* pb_hub_controller_2_; ///< Reference to PbHub controller 2 + HardwareLowLevelController hardware_low_level_controller_; ///< Reference to hardware interface std::vector sensors_; ///< List of all board sensors std::vector actuators_; ///< List of all board actuators std::string unique_id_ = "TaskBoard_v1"; ///< Board identifier diff --git a/idf/taskboard/main/main_core0.cpp b/idf/taskboard/main/main_core0.cpp index 907289b..e3c30cf 100644 --- a/idf/taskboard/main/main_core0.cpp +++ b/idf/taskboard/main/main_core0.cpp @@ -33,9 +33,6 @@ #include #include -static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB1 = 0; -static constexpr uint8_t PAHUB_CHANNEL_FOR_PBHUB2 = 1; - // Forward declarations struct WebSocketTaskArgs { @@ -48,25 +45,6 @@ struct WebSocketTaskArgs void websockets_task( void* args); -/** - * @brief Get the task board implementation - * - * @details This functions returns an instance of the actual class that implements the current configuration - * of the task board. This is useful to allow the user to change the task board implementation without - * changing the main code. - * - * @param hardware_low_level_controller The hardware low level controller - * - * @return TaskBoardDriver& The task board implementation - */ -TaskBoardDriver& get_task_board_implementation( - HardwareLowLevelController& hardware_low_level_controller) -{ - TaskBoardDriver_v1* task_board_driver = new TaskBoardDriver_v1(hardware_low_level_controller); - - return *task_board_driver; -} - /** * @brief System entry point */ @@ -104,28 +82,11 @@ extern "C" void app_main( M5.begin(); // Initialize hardware controllers and drivers - PaHubController pa_hub_controller; - PaHubToPbHubController pb_hub_controller_1(pa_hub_controller, PAHUB_CHANNEL_FOR_PBHUB1); - PaHubToPbHubController pb_hub_controller_2(pa_hub_controller, PAHUB_CHANNEL_FOR_PBHUB2); - HardwareLowLevelController hardware_low_level_controller = {pb_hub_controller_1, pb_hub_controller_2, M5}; - TaskBoardDriver& task_board_driver = get_task_board_implementation(hardware_low_level_controller); - ScreenController screen_controller(hardware_low_level_controller); + TaskBoardDriver_v1 task_board_driver_v1(M5); + TaskBoardDriver& task_board_driver = task_board_driver_v1; + ScreenController screen_controller(task_board_driver.get_hardware_low_level_controller()); NonVolatileStorage non_volatile_storage(task_board_driver.get_unique_id()); - // Wait for PbHubController to initialize - // This can take variable time after boot - while (!pb_hub_controller_1.check_status()) - { - ESP_LOGI("app_main", "Waiting for PbHubController 1 to start"); - vTaskDelay(pdMS_TO_TICKS(10)); - } - - while (!pb_hub_controller_2.check_status()) - { - ESP_LOGI("app_main", "Waiting for PbHubController 2 to start"); - vTaskDelay(pdMS_TO_TICKS(10)); - } - // ------------------------ // System Setup // ------------------------ @@ -157,8 +118,12 @@ extern "C" void app_main( const SensorReader& BUTTON_A = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_A"); const SensorReader& BUTTON_B = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_B"); const SensorReader& BUTTON_PWR = *task_board_driver.get_sensor_by_name("ON_BOARD_BUTTON_PWR"); - const SensorReader& RED_BUTTON = *task_board_driver.get_sensor_by_name("RED_BUTTON_LEFT"); - const SensorReader& BLUE_BUTTON = *task_board_driver.get_sensor_by_name("BLUE_BUTTON_LEFT"); + const SensorReader& RED_BUTTON = nullptr != task_board_driver.get_sensor_by_name("RED_BUTTON") ? + *task_board_driver.get_sensor_by_name("RED_BUTTON") : + *task_board_driver.get_sensor_by_name("RED_BUTTON_LEFT"); + const SensorReader& BLUE_BUTTON = nullptr != task_board_driver.get_sensor_by_name("BLUE_BUTTON") ? + *task_board_driver.get_sensor_by_name("BLUE_BUTTON") : + *task_board_driver.get_sensor_by_name("BLUE_BUTTON_LEFT"); // Check if system should start in local mode (Button A pressed during boot) const bool start_local_mode = BUTTON_A.read() == true; From a1449b303896a964e77ff0d1ea7d28b06a120eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Casas?= Date: Fri, 25 Apr 2025 16:05:32 +0000 Subject: [PATCH 35/35] Screen prompts task step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Antón Casas --- .../main/hal/ClueScreenController.hpp | 2 + idf/taskboard/main/hal/ScreenController.hpp | 28 + .../hal/board/TaskBoardDriver_TBv2025.hpp | 52 +- idf/taskboard/main/task/TaskStep.hpp | 1 + .../main/task/TaskStepTouchGoalFromPool.hpp | 605 ++++++++++++++++++ 5 files changed, 676 insertions(+), 12 deletions(-) create mode 100644 idf/taskboard/main/task/TaskStepTouchGoalFromPool.hpp diff --git a/idf/taskboard/main/hal/ClueScreenController.hpp b/idf/taskboard/main/hal/ClueScreenController.hpp index 6932133..ff76817 100644 --- a/idf/taskboard/main/hal/ClueScreenController.hpp +++ b/idf/taskboard/main/hal/ClueScreenController.hpp @@ -42,6 +42,8 @@ struct ClueScreenController const std::vector& expected_path, const std::vector& measured_path) = 0; + virtual void print_task_clue_goal(const char* clue_text) = 0; + /** * @brief Clears the screen of any displayed clues */ diff --git a/idf/taskboard/main/hal/ScreenController.hpp b/idf/taskboard/main/hal/ScreenController.hpp index 16b423a..9dbe299 100644 --- a/idf/taskboard/main/hal/ScreenController.hpp +++ b/idf/taskboard/main/hal/ScreenController.hpp @@ -192,6 +192,34 @@ struct ScreenController : } } + /// Virtual method implementation + void print_task_clue_goal(const char* clue_text) override + { + // static constexpr int32_t TEXT_TOP = 35; + // static constexpr int32_t TEXT_CENTER = 160; + static constexpr uint8_t TEXT_FONT = 4; + + display_.setTextSize(2); + display_.setCursor(70, 90); + display_.print(clue_text); + + // Draw two squares to act as buttons on the bottom of the screen + static constexpr int32_t BUTTON_WIDTH = 80; + static constexpr int32_t BUTTON_HEIGHT = 80; + static constexpr int32_t BUTTON_Y = 220 - BUTTON_HEIGHT; + static constexpr int32_t BUTTON_A_X = 40; + static constexpr int32_t BUTTON_B_X = 320 - BUTTON_WIDTH -40; + + display_.fillRect(BUTTON_A_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_BLUE); + display_.drawRect(BUTTON_A_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_WHITE); + display_.fillRect(BUTTON_B_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_BLUE); + display_.drawRect(BUTTON_B_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_WHITE); + // display_.setTextSize(2); + // display_.setTextColor(TFT_WHITE, TFT_BLUE); + display_.drawCentreString("A", BUTTON_A_X + BUTTON_WIDTH / 2, BUTTON_Y + BUTTON_HEIGHT / 2-10); + display_.drawCentreString("B", BUTTON_B_X + BUTTON_WIDTH / 2, BUTTON_Y + BUTTON_HEIGHT / 2-10); + } + /// Virtual method implementation void clear_all_task_clue() override { diff --git a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp index ef48c7b..d6f24e3 100644 --- a/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp +++ b/idf/taskboard/main/hal/board/TaskBoardDriver_TBv2025.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -272,15 +273,6 @@ struct TaskBoardDriver_v1 : hardware_low_level_controller_.pb_hub_controller_2.write_digital_IO0(PbHubController::Channel::CHANNEL_3, state == Actuator::State::ON); }); - gpio_config_t io_conf = { - .pin_bit_mask = (1ULL << GPIO_NUM_27), // Use GPIO 27 - .mode = GPIO_MODE_OUTPUT, // Set as output - .pull_up_en = GPIO_PULLUP_DISABLE, // No pull-up - .pull_down_en = GPIO_PULLDOWN_DISABLE, // No pull-down - .intr_type = GPIO_INTR_DISABLE // No interrupt - }; - gpio_config(&io_conf); // Apply the configuration - Actuator* ball_drop_solenoid = new Actuator("BALL_DROP_SOLENOID", [&](Actuator::State state) { gpio_set_level(GPIO_NUM_27, state == Actuator::State::ON); @@ -313,12 +305,41 @@ struct TaskBoardDriver_v1 : // Create shape pool std::vector* shape_pool = new std::vector {}; + // Create touch goal pool + std::vector* default_touch_goals = new std::vector + { + TaskStepTouchGoalFromPool::TouchGoalType::TapAGoal, + TaskStepTouchGoalFromPool::TouchGoalType::TapBGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DoubleTapAGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DoubleTapBGoal, + TaskStepTouchGoalFromPool::TouchGoalType::LongPressAGoal, + TaskStepTouchGoalFromPool::TouchGoalType::LongPressBackgroundGoal, + TaskStepTouchGoalFromPool::TouchGoalType::LongPressBGoal, + TaskStepTouchGoalFromPool::TouchGoalType::TapBackgroundGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DoubleTapBackgroundGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromAtoBGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromBtoAGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromAtoBackgroundGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromBtoBackgroundGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromBackgroundtoAGoal, + TaskStepTouchGoalFromPool::TouchGoalType::DragFromBackgroundtoBGoal, + TaskStepTouchGoalFromPool::TouchGoalType::SwipeUpGoal, + TaskStepTouchGoalFromPool::TouchGoalType::SwipeDownGoal, + TaskStepTouchGoalFromPool::TouchGoalType::SwipeLeftGoal, + TaskStepTouchGoalFromPool::TouchGoalType::SwipeRightGoal + }; + + std::vector* touch_goal_pool = new std::vector {}; + // Create default tasks std::vector* precondition_steps = new std::vector { new TaskStepTraceShapeSetPool("SET_SHAPE_POOL", shape_pool, default_shapes), + new TaskStepTouchGoalSetPool("SET_TOUCH_GOAL_POOL", touch_goal_pool, default_touch_goals), new TaskStepActuator(*all_goal_leds, Actuator::State::OFF), new TaskStepActuator(*ball_drop_solenoid, Actuator::State::OFF), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_1"), SensorMeasurement(true)), + new TaskStepEqual(*get_sensor_by_name("BLUE_BUTTON_RIGHT"), SensorMeasurement(true)), }; default_precondition_task_ = new SimultaneousConditionTask(*precondition_steps, "Precondition Task"); @@ -331,17 +352,24 @@ struct TaskBoardDriver_v1 : new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), new TaskStepTraceShapeFromPool(*get_sensor_by_name("TOUCH_SCREEN"), shape_pool), - new TaskStepEqualDuringRandom(*get_sensor_by_name("BLUE_BUTTON_LEFT"), SensorMeasurement(true), 0.0, 3000L, 8000L), + new TaskStepTouchGoalFromPool(*get_sensor_by_name("TOUCH_SCREEN"), touch_goal_pool), + new TaskStepTouchGoalFromPool(*get_sensor_by_name("TOUCH_SCREEN"), touch_goal_pool), + new TaskStepTouchGoalFromPool(*get_sensor_by_name("TOUCH_SCREEN"), touch_goal_pool), + new TaskStepTouchGoalFromPool(*get_sensor_by_name("TOUCH_SCREEN"), touch_goal_pool), + new TaskStepTouchGoalFromPool(*get_sensor_by_name("TOUCH_SCREEN"), touch_goal_pool), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_2"), SensorMeasurement(true)), new TaskStepActuator(*ball_drop_solenoid, Actuator::State::ON), + new TaskStepEqualDuringRandom(*get_sensor_by_name("BLUE_BUTTON_LEFT"), SensorMeasurement(true), 0.0, 3000L, 8000L), + new TaskStepActuator(*ball_drop_solenoid, Actuator::State::OFF), new TaskStepActuator(*all_goal_leds, Actuator::State::ON), new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_1"), SensorMeasurement(true)), new TaskStepActuator(*goal_1_led, Actuator::State::OFF), - new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_2"), SensorMeasurement(true)), - new TaskStepActuator(*goal_2_led, Actuator::State::OFF), new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_3"), SensorMeasurement(true)), new TaskStepActuator(*goal_3_led, Actuator::State::OFF), new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_4"), SensorMeasurement(true)), new TaskStepActuator(*goal_4_led, Actuator::State::OFF), + new TaskStepEqual(*get_sensor_by_name("BALL_GOAL_2"), SensorMeasurement(true)), + new TaskStepActuator(*goal_2_led, Actuator::State::OFF), }; default_task_ = new SequentialTask(*main_steps, "Default Task"); diff --git a/idf/taskboard/main/task/TaskStep.hpp b/idf/taskboard/main/task/TaskStep.hpp index c9f11ab..d203f56 100644 --- a/idf/taskboard/main/task/TaskStep.hpp +++ b/idf/taskboard/main/task/TaskStep.hpp @@ -144,6 +144,7 @@ struct TaskStepBase : EQUAL_TO_RANDOM, ///< Sensor value must match a randomly generated target EQUAL_DURING_RANDOM,///< Sensor value must match a target value maintained during a random time GREATER_OR_EQUAL, ///< Sensor value must be greater or equal to target + TOUCH_GOAL_FROM_POOL, ///< Sensor value must match a target value from a pool TRACE_SHAPE, ///< Sensor value must follow a specific path TRACE_SHAPE_FROM_POOL, ///< Sensor value must follow a path selected at random from a pool TRACE_SHAPE_MANAGE_POOL, ///< Manage a shape pool diff --git a/idf/taskboard/main/task/TaskStepTouchGoalFromPool.hpp b/idf/taskboard/main/task/TaskStepTouchGoalFromPool.hpp new file mode 100644 index 0000000..1e516bf --- /dev/null +++ b/idf/taskboard/main/task/TaskStepTouchGoalFromPool.hpp @@ -0,0 +1,605 @@ +/** + * Robothon Task Board Firmware + */ + +#pragma once + +#include +#include +#include + +#include + +/** + * @struct TaskStepTouchGoalFromPool + * + * @brief + * + * @details + */ +struct TaskStepTouchGoalFromPool : + public TaskStep +{ + const char* TAG = "TaskStepTouchGoalFromPool"; ///< Logging tag + static constexpr uint64_t TIMEOUT_LIMIT = 8000000L; ///< Timeout limit in microseconds (8 seconds) + + /** + * @brief Enumeration of touch goals + */ + enum TouchGoalType + { + TapAGoal, + TapBGoal, + DoubleTapAGoal, + DoubleTapBGoal, + LongPressAGoal, + LongPressBackgroundGoal, + LongPressBGoal, + TapBackgroundGoal, + DoubleTapBackgroundGoal, + DragFromAtoBGoal, + DragFromBtoAGoal, + DragFromAtoBackgroundGoal, + DragFromBtoBackgroundGoal, + DragFromBackgroundtoAGoal, + DragFromBackgroundtoBGoal, + SwipeUpGoal, + SwipeDownGoal, + SwipeLeftGoal, + SwipeRightGoal + }; + + /** + * @brief Constructs a new TaskStepTouchGoalFromPool object + * + * @param sensor Reference to the sensor to monitor + * @param goal_pool Vector of touch goals to select from + */ + TaskStepTouchGoalFromPool( + SensorReader& sensor, + std::vector* goal_pool) + : TaskStep(sensor), + goal_pool_(goal_pool) + { + TaskStep::type_ = Type::TOUCH_GOAL_FROM_POOL; + } + + /// Virtual method implementation + void initialize_step() const override + { + // Select a random goal from the pool + if (goal_pool_->empty()) + { + ESP_LOGE(TAG, "Goal pool is empty"); + return; + } + + goal_ = goal_pool_->at(0); + goal_pool_->erase(goal_pool_->begin()); + + step_started_ = false; + initial_time_ = esp_timer_get_time(); + + measured_path_.clear(); + } + + /// Virtual method implementation + bool success() const override + { + auto sensor_value_aux = sensor_.read(); + SensorMeasurement::Vector3 sensor_value = SensorMeasurement::Vector3{ + sensor_value_aux.get_vector3().x * 320.0f / 100.0f, + sensor_value_aux.get_vector3().y * 240.0f / 100.0f, + sensor_value_aux.get_vector3().z}; + bool pressing_screen = (sensor_value.z != 0); + if (!step_started_) + { + if (pressing_screen) + { + step_started_ = true; + first_tap_start_time_ = esp_timer_get_time(); + first_tap_duration_ = 0; + tap_count_ = 0; + ESP_LOGI(TAG, "Step started"); + } + } + else + { + if (pressing_screen) + { + measured_path_.push_back(sensor_value); + } + } + + if (pressing_screen && !last_touching_) + { + tap_count_++; + ESP_LOGI(TAG, "Tap count: %d", tap_count_); + if (tap_count_ == 1) + { + first_tap_duration_ = esp_timer_get_time() - first_tap_start_time_; + } + } + + last_touching_ = pressing_screen; + + // Check if the time limit has been reached+ + if (esp_timer_get_time() - initial_time_ > TIMEOUT_LIMIT) + { + ESP_LOGI(TAG, "Time limit reached"); + return true; + } + + return false; + } + + bool is_inside_button_area( + const SensorMeasurement& point, + uint8_t button) const + { + static constexpr int32_t BUTTON_WIDTH = 80; + static constexpr int32_t BUTTON_HEIGHT = 80; + static constexpr int32_t BUTTON_Y = 220 - BUTTON_HEIGHT; + static constexpr int32_t BUTTON_A_X = 40; + static constexpr int32_t BUTTON_B_X = 320 - BUTTON_WIDTH -40; + + switch (button) + { + case 0: + return (point.get_vector3().x >= BUTTON_A_X && + point.get_vector3().x <= BUTTON_A_X + BUTTON_WIDTH && + point.get_vector3().y >= BUTTON_Y && + point.get_vector3().y <= BUTTON_Y + BUTTON_HEIGHT); + case 1: + return (point.get_vector3().x >= BUTTON_B_X && + point.get_vector3().x <= BUTTON_B_X + BUTTON_WIDTH && + point.get_vector3().y >= BUTTON_Y && + point.get_vector3().y <= BUTTON_Y + BUTTON_HEIGHT); + default: + ESP_LOGE(TAG, "Invalid button index"); + return false; + } + } + + /// Virtual method implementation + float score() const override + { + float score = 0.0f; + if (measured_path_.empty()) + { + return score; + } + + switch (goal_) + { + case TapAGoal: + // Check if all points are in the button A area + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 0)) + { + return 0.0f; + } + } + // Check if count_taps is 1 + if (tap_count_ != 1) + { + return 0.0f; + } + score = 100.0f; + break; + case TapBGoal: + // Check if all points are in the button B area + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + // Check if count_taps is 1 + if (tap_count_ != 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DoubleTapAGoal: + // Check if all points are in the button A area and there are two taps + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 0)) + { + return 0.0f; + } + } + if (tap_count_ != 2) + { + return 0.0f; + } + score = 100.0f; + break; + case DoubleTapBGoal: + // Check if all points are in the button A area and there are two taps + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + if (tap_count_ != 2) + { + return 0.0f; + } + score = 100.0f; + break; + case LongPressAGoal: + // Check if all points are in the button A area and there is a long press + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 0)) + { + return 0.0f; + } + } + if (tap_count_ != 1 || first_tap_duration_ < 1000) + { + return 0.0f; + } + score = 100.0f; + break; + case LongPressBackgroundGoal: + // Check if all points are in the background area and there is a long press (check the duration of the tap with the z coordinate) + for (const auto& point : measured_path_) + { + if (is_inside_button_area(point, 0) || + is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + if (tap_count_ != 1 || first_tap_duration_ < 1000) + { + return 0.0f; + } + score = 100.0f; + break; + case LongPressBGoal: + // Check if all points are in the button A area and there is a long press + for (const auto& point : measured_path_) + { + if (!is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + if (tap_count_ != 1 || first_tap_duration_ < 1000) + { + return 0.0f; + } + score = 100.0f; + break; + case TapBackgroundGoal: + // Check if all points are in the background area + for (const auto& point : measured_path_) + { + if (is_inside_button_area(point, 0) || + is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + // Check if count_taps is 1 + if (tap_count_ != 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DoubleTapBackgroundGoal: + // Check if all points are in the background area + for (const auto& point : measured_path_) + { + if (is_inside_button_area(point, 0) || + is_inside_button_area(point, 1)) + { + return 0.0f; + } + } + // Check if count_taps is 2 + if (tap_count_ != 2) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromAtoBGoal: + // Check if the starting point is in the button A area and the ending point is in the button B area + if (!is_inside_button_area(measured_path_[0], 0) || + !is_inside_button_area(measured_path_.back(), 1)) + { + ESP_LOGI(TAG, "DragFromAtoBGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromBtoAGoal: + // Check if the starting point is in the button B area and the ending point is in the button A area + if (!is_inside_button_area(measured_path_[0], 1) || + !is_inside_button_area(measured_path_.back(), 0)) + { + ESP_LOGI(TAG, "DragFromBtoAGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromAtoBackgroundGoal: + // Check if the starting point is in the button A area and the ending point is in the background area + if (!is_inside_button_area(measured_path_[0], 0) || + (is_inside_button_area(measured_path_.back(), 0) || + is_inside_button_area(measured_path_.back(), 1))) + { + ESP_LOGI(TAG, "DragFromAtoBackgroundGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromBtoBackgroundGoal: + // Check if the starting point is in the button B area and the ending point is in the background area + if (!is_inside_button_area(measured_path_[0], 1) || + (is_inside_button_area(measured_path_.back(), 0) || + is_inside_button_area(measured_path_.back(), 1))) + { + ESP_LOGI(TAG, "DragFromBtoBackgroundGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromBackgroundtoAGoal: + // Check if the starting point is in the background area and the ending point is in the button A area + if ((is_inside_button_area(measured_path_[0], 0) || + is_inside_button_area(measured_path_[0], 1)) || + !is_inside_button_area(measured_path_.back(), 0)) + { + ESP_LOGI(TAG, "DragFromBackgroundtoAGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case DragFromBackgroundtoBGoal: + // Check if the starting point is in the background area and the ending point is in the button B area + if ((is_inside_button_area(measured_path_[0], 0) || + is_inside_button_area(measured_path_[0], 1)) || + !is_inside_button_area(measured_path_.back(), 1)) + { + ESP_LOGI(TAG, "DragFromBackgroundtoBGoal: not in button area"); + return 0.0f; + } + // Check if the path is continuous + if (tap_count_ > 1) + { + return 0.0f; + } + score = 100.0f; + break; + case SwipeUpGoal: + // Check if the starting point is significantly lower than the ending point + if (measured_path_[0].get_vector3().y > measured_path_.back().get_vector3().y - 20) + { + score = 100.0f; + } + break; + case SwipeDownGoal: + // Check if the starting point is significantly higher than the ending point + if (measured_path_[0].get_vector3().y < measured_path_.back().get_vector3().y + 20) + { + score = 100.0f; + } + break; + case SwipeLeftGoal: + // Check if the starting point is significantly to the right of the ending point + if (measured_path_[0].get_vector3().x > measured_path_.back().get_vector3().x + 20) + { + score = 100.0f; + } + break; + case SwipeRightGoal: + // Check if the starting point is significantly to the left of the ending point + if (measured_path_[0].get_vector3().x < measured_path_.back().get_vector3().x - 20) + { + score = 100.0f; + } + break; + default: + ESP_LOGE(TAG, "Unknown goal type"); + score = 0.0f; + break; + } + + return score; + } + + /// Virtual method implementation + SensorMeasurement expected_value() const override + { + return SensorMeasurement(); + } + +protected: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + if (!success()) + { + const char* clue = nullptr; + switch(goal_) + { + case TouchGoalType::TapAGoal: + clue = "Tap A"; + break; + case TouchGoalType::TapBGoal: + clue = "Tap B"; + break; + case TouchGoalType::DoubleTapAGoal: + clue = "Double Tap A"; + break; + case TouchGoalType::DoubleTapBGoal: + clue = "Double Tap B"; + break; + case TouchGoalType::LongPressAGoal: + clue = "Long Press A"; + break; + case TouchGoalType::LongPressBackgroundGoal: + clue = "Long Press Background"; + break; + case TouchGoalType::LongPressBGoal: + clue = "Long Press B"; + break; + case TouchGoalType::TapBackgroundGoal: + clue = "Tap Background"; + break; + case TouchGoalType::DoubleTapBackgroundGoal: + clue = "Double Tap Background"; + break; + case TouchGoalType::DragFromAtoBGoal: + clue = "Drag from A to B"; + break; + case TouchGoalType::DragFromBtoAGoal: + clue = "Drag from B to A"; + break; + case TouchGoalType::DragFromAtoBackgroundGoal: + clue = "Drag from A to Background"; + break; + case TouchGoalType::DragFromBtoBackgroundGoal: + clue = "Drag from B to Background"; + break; + case TouchGoalType::DragFromBackgroundtoAGoal: + clue = "Drag from Background to A"; + break; + case TouchGoalType::DragFromBackgroundtoBGoal: + clue = "Drag from Background to B"; + break; + case TouchGoalType::SwipeUpGoal: + clue = "Swipe Up"; + break; + case TouchGoalType::SwipeDownGoal: + clue = "Swipe Down"; + break; + case TouchGoalType::SwipeLeftGoal: + clue = "Swipe Left"; + break; + case TouchGoalType::SwipeRightGoal: + clue = "Swipe Right"; + break; + } + screen_controller.print_task_clue(sensor_.name()); + screen_controller.print_task_clue_goal(clue); + } + else + { + reset_clue(); + } + } + + mutable TouchGoalType goal_; ///< Shape type to be traced + mutable bool step_started_ = 0; ///< Flag to indicate if the step has started + mutable std::vectormeasured_path_ = {}; ///< Path measured + mutable int64_t initial_time_ = 0; ///< Time when the step started + mutable int tap_count_ = 0; ///< Number of taps detected + mutable int32_t first_tap_duration_ = 0; ///< Longest tap duration detected + mutable int32_t first_tap_start_time_ = 0; ///< Start time of the longest tap + mutable bool last_touching_ = false; ///< Flag to indicate if the last touch was a tap + + std::vector* goal_pool_; ///< Vector of shapes to select from +}; + +/** + * @struct TaskStepTouchGoalSetPool + * + * @brief Implementation of TaskStep that empties a shape pool and fills it with a vector of shapes + */ +struct TaskStepTouchGoalSetPool : + public TaskStepAuto +{ + const char* TAG = "TaskStepTouchGoalSetPool"; ///< Logging tag + + /** + * @brief Constructs a new TaskStepTouchGoalSetPool object + * + * @param name Name identifier for the task step + * @param goal_pool Vector of shapes to be filled + * @param goal_vector Vector of shapes to fill the pool with + */ + TaskStepTouchGoalSetPool( + std::string name, + std::vector* goal_pool, + std::vector* goal_vector) + : TaskStepAuto(name) + , goal_pool_(goal_pool) + , goal_vector_(goal_vector) + { + TaskStepAuto::type_ = Type::TRACE_SHAPE_MANAGE_POOL; + } + + /// Virtual method implementation + void initialize_step() const override + { + goal_pool_->clear(); + goal_pool_->shrink_to_fit(); + + goal_pool_->insert(goal_pool_->end(), goal_vector_->begin(), goal_vector_->end()); + esp_shuffle(goal_pool_); + } + + /// Virtual method implementation + bool success() const override + { + return true; + } + + /// Virtual method implementation + float score() const override + { + return -1.0f; + } + +private: + + /// Virtual method implementation + void show_clue_implementation( + ClueScreenController& screen_controller) const override + { + screen_controller.print_task_clue("Goal pool filled"); + } + + std::vector* goal_pool_; ///< Vector of shapes to be filled + const std::vector* goal_vector_; ///< Vector of shapes to fill the pool with +}; \ No newline at end of file