text:
namespace {

const int kDesiredBubbleWidth = 370;

enum ColumnSetType {
  // | | (FILL, FILL) | |
  // Used for the bubble's header, the credentials list, and for simple
  // messages like "No passwords".
  SINGLE_VIEW_COLUMN_SET = 0,

  // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | |
  // Used for buttons at the bottom of the bubble which should nest at the
  // bottom-right corner.
  DOUBLE_BUTTON_COLUMN_SET = 1,

  // | | (LEADING, CENTER) | | (TRAILING, CENTER) | |
  // Used for buttons at the bottom of the bubble which should occupy
  // the corners.
  LINK_BUTTON_COLUMN_SET = 2,

  // | | (TRAILING, CENTER) | |
  // Used when there is only one button which should next at the bottom-right
  // corner.
  SINGLE_BUTTON_COLUMN_SET = 3,
};

enum TextRowType { ROW_SINGLE, ROW_MULTILINE };

// Construct an appropriate ColumnSet for the given |type|, and add it
// to |layout|.
void BuildColumnSet(views::GridLayout* layout, ColumnSetType type) {
  views::ColumnSet* column_set = layout->AddColumnSet(type);
  column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
  int full_width = kDesiredBubbleWidth - (2 * views::kPanelHorizMargin);
  switch (type) {
    case SINGLE_VIEW_COLUMN_SET:
      column_set->AddColumn(views::GridLayout::FILL,
                            views::GridLayout::FILL,
                            0,
                            views::GridLayout::FIXED,
                            full_width,
                            0);
      break;

    case DOUBLE_BUTTON_COLUMN_SET:
      column_set->AddColumn(views::GridLayout::TRAILING,
                            views::GridLayout::CENTER,
                            1,
                            views::GridLayout::USE_PREF,
                            0,
                            0);
      column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
      column_set->AddColumn(views::GridLayout::TRAILING,
                            views::GridLayout::CENTER,
                            0,
                            views::GridLayout::USE_PREF,
                            0,
                            0);
      break;
    case LINK_BUTTON_COLUMN_SET:
      column_set->AddColumn(views::GridLayout::LEADING,
                            views::GridLayout::CENTER,
                            1,
                            views::GridLayout::USE_PREF,
                            0,
                            0);
      column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
      column_set->AddColumn(views::GridLayout::TRAILING,
                            views::GridLayout::CENTER,
                            0,
                            views::GridLayout::USE_PREF,
                            0,
                            0);
      break;
    case SINGLE_BUTTON_COLUMN_SET:
      column_set->AddColumn(views::GridLayout::TRAILING,
                            views::GridLayout::CENTER,
                            1,
                            views::GridLayout::USE_PREF,
                            0,
                            0);
  }
  column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
}

// Given |layout| and |color| adds border with |color| using
// SINGLE_VIEW_COLUMN_SET.
void AddBorderRow(views::GridLayout* layout, SkColor color) {
  layout->StartRowWithPadding(0, SINGLE_VIEW_COLUMN_SET, 0,
                              views::kRelatedControlVerticalSpacing);
  views::Separator* border = new views::Separator(views::Separator::HORIZONTAL);
  border->SetColor(color);
  layout->AddView(border);
}

// Given a layout and a model, add an appropriate title using a
// SINGLE_VIEW_COLUMN_SET, followed by a spacer row.
void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) {
  views::Label* title_label = new views::Label(model->title());
  title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  title_label->SetMultiLine(true);
  title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::MediumFont));

  // Add the title to the layout with appropriate padding.
  layout->StartRowWithPadding(
      0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
  layout->AddView(title_label);
  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
}

// Given a |layout| and |text|, adds a text row with small font using a
// SINGLE_VIEW_COLUMN_SET.
void AddTextRow(views::GridLayout* layout,
                const base::string16& text,
                TextRowType row_type) {
  views::Label* text_label = new views::Label(text);
  text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  text_label->SetMultiLine(row_type == ROW_MULTILINE);
  text_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));
  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
  layout->AddView(text_label);
}

// Returns the string representing the reported URL. This string will be shown
// to the user and reported through Feedback.
std::string PresentURL(const GURL& url) {
  return url.GetAsReferrer().spec();
}

}  // namespace

// ManagePasswordsBubbleView::AccountChooserView ------------------------------

// A view offering the user the ability to choose credentials for
// authentication. Contains a list of CredentialsItemView, along with a
// "Cancel" button.
class ManagePasswordsBubbleView::AccountChooserView
    : public views::View,
      public views::ButtonListener {
 public:
  explicit AccountChooserView(ManagePasswordsBubbleView* parent);
  ~AccountChooserView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  ManagePasswordsBubbleView* parent_;
  views::LabelButton* cancel_button_;
};

ManagePasswordsBubbleView::AccountChooserView::AccountChooserView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  SetLayoutManager(layout);

  cancel_button_ =
      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_CANCEL));
  cancel_button_->SetStyle(views::Button::STYLE_BUTTON);
  cancel_button_->SetFontList(
      ui::ResourceBundle::GetSharedInstance().GetFontList(
          ui::ResourceBundle::SmallFont));

  // Title row.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  const auto& pending_credentials = parent_->model()->pending_credentials();
  for (autofill::PasswordForm* form : pending_credentials) {
    CredentialsItemView* credential_view = new CredentialsItemView(this, *form);
    // Add the title to the layout with appropriate padding.
    layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
    layout->AddView(credential_view);
  }

  // Button row.
  BuildColumnSet(layout, SINGLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, SINGLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
  layout->AddView(cancel_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(cancel_button_);
}

ManagePasswordsBubbleView::AccountChooserView::~AccountChooserView() {
}

void ManagePasswordsBubbleView::AccountChooserView::ButtonPressed(
    views::Button* sender, const ui::Event& event) {
  if (sender != cancel_button_) {
    // ManagePasswordsBubbleModel should care about calling a callback in case
    // the bubble is dismissed by any other means.
    CredentialsItemView* view = static_cast<CredentialsItemView*>(sender);
    parent_->model()->OnChooseCredentials(view->form());
  } else {
    parent_->model()->OnNopeClicked();
  }
  parent_->Close();
}

// ManagePasswordsBubbleView::AskUserToSubmitURLView -------------------------

// Asks users if they want to report the URL when the password manager failed
// to detect the form. View has following structure:
// We detected that Chrome password manager failed to handle this URL.
// Do you want to send this URL to Google to improve Chrome?
// -------------------------------------------------------------
// https://strangesite.com/
// -------------------------------------------------------------
//                                  [Send URL]            [Nope]
class ManagePasswordsBubbleView::AskUserToSubmitURLView
    : public views::View,
      public views::ButtonListener {
 public:
  explicit AskUserToSubmitURLView(ManagePasswordsBubbleView* parent);
  ~AskUserToSubmitURLView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  ManagePasswordsBubbleView* parent_;

  views::LabelButton* send_button_;
  views::LabelButton* no_button_;
};

ManagePasswordsBubbleView::AskUserToSubmitURLView::AskUserToSubmitURLView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  GURL origin = parent->model()->origin();
  DCHECK(origin.is_valid() && !origin.is_empty() && origin.has_host());
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  send_button_ = new views::LabelButton(
      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SEND_URL_BUTTON));
  send_button_->SetStyle(views::Button::STYLE_BUTTON);
  no_button_ = new views::LabelButton(
      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_CANCEL_BUTTON));
  no_button_->SetStyle(views::Button::STYLE_BUTTON);

  // Title row.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());
  // Confirmation text.
  AddTextRow(layout, l10n_util::GetStringUTF16(
                         IDS_MANAGE_PASSWORDS_ASK_TO_SUBMIT_URL_TEXT),
             ROW_MULTILINE);
  // Border row.
  SkColor color = GetNativeTheme()->GetSystemColor(
      ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor);
  AddBorderRow(layout, color);
  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
  // URL row.
  AddTextRow(layout, base::UTF8ToUTF16(PresentURL(parent->model()->origin())),
             ROW_SINGLE);
  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
  // Border row.
  AddBorderRow(layout, color);
  // Button row.
  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(0, DOUBLE_BUTTON_COLUMN_SET, 0,
                              views::kRelatedControlVerticalSpacing);
  layout->AddView(send_button_);
  layout->AddView(no_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(no_button_);
}

ManagePasswordsBubbleView::AskUserToSubmitURLView::~AskUserToSubmitURLView() {
}

void ManagePasswordsBubbleView::AskUserToSubmitURLView::ButtonPressed(
    views::Button* sender,
    const ui::Event& event) {
  DCHECK(sender == send_button_ || sender == no_button_);
  // TODO(melandory): Add actions on button clicks: url reporting, pref saving.
  if (sender == send_button_)
    parent_->model()->OnCollectURLClicked(
        PresentURL(parent_->model()->origin()));
  else if (sender == no_button_)
    parent_->model()->OnDoNotCollectURLClicked();
  parent_->Close();
}

// ManagePasswordsBubbleView::PendingView -------------------------------------

// A view offering the user the ability to save credentials. Contains a
// single ManagePasswordItemsView, along with a "Save Passwords" button
// and a rejection combobox.
class ManagePasswordsBubbleView::PendingView : public views::View,
                                               public views::ButtonListener,
                                               public views::ComboboxListener {
 public:
  explicit PendingView(ManagePasswordsBubbleView* parent);
  ~PendingView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  // Handles the event when the user changes an index of a combobox.
  void OnPerformAction(views::Combobox* source) override;

  ManagePasswordsBubbleView* parent_;

  views::BlueButton* save_button_;

  // The combobox doesn't take ownership of its model. If we created a
  // combobox we need to ensure that we delete the model here, and because the
  // combobox uses the model in it's destructor, we need to make sure we
  // delete the model _after_ the combobox itself is deleted.
  scoped_ptr<SavePasswordRefusalComboboxModel> combobox_model_;
  scoped_ptr<views::Combobox> refuse_combobox_;
};

ManagePasswordsBubbleView::PendingView::PendingView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  std::vector<const autofill::PasswordForm*> credentials(
      1, &parent->model()->pending_password());
  // Create the pending credential item, save button and refusal combobox.
  ManagePasswordItemsView* item =
      new ManagePasswordItemsView(parent_->model(), credentials);
  save_button_ = new views::BlueButton(
      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
  save_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));

  combobox_model_.reset(new SavePasswordRefusalComboboxModel());
  refuse_combobox_.reset(new views::Combobox(combobox_model_.get()));
  refuse_combobox_->set_listener(this);
  refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
  // TODO(mkwst): Need a mechanism to pipe a font list down into a combobox.

  // Title row.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  // Credential row.
  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
  layout->AddView(item);

  // Button row.
  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
  layout->AddView(save_button_);
  layout->AddView(refuse_combobox_.get());

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(save_button_);
}

ManagePasswordsBubbleView::PendingView::~PendingView() {
}

void ManagePasswordsBubbleView::PendingView::ButtonPressed(
    views::Button* sender,
    const ui::Event& event) {
  DCHECK(sender == save_button_);
  parent_->model()->OnSaveClicked();
  parent_->Close();
}

void ManagePasswordsBubbleView::PendingView::OnPerformAction(
    views::Combobox* source) {
  DCHECK_EQ(source, refuse_combobox_);
  switch (refuse_combobox_->selected_index()) {
    case SavePasswordRefusalComboboxModel::INDEX_NOPE:
      parent_->model()->OnNopeClicked();
      parent_->Close();
      break;
    case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
      parent_->NotifyNeverForThisSiteClicked();
      break;
  }
}

// ManagePasswordsBubbleView::ConfirmNeverView ---------------------------------

// A view offering the user the ability to undo her decision to never save
// passwords for a particular site.
class ManagePasswordsBubbleView::ConfirmNeverView
    : public views::View,
      public views::ButtonListener {
 public:
  explicit ConfirmNeverView(ManagePasswordsBubbleView* parent);
  ~ConfirmNeverView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  ManagePasswordsBubbleView* parent_;

  views::LabelButton* confirm_button_;
  views::LabelButton* undo_button_;
};

ManagePasswordsBubbleView::ConfirmNeverView::ConfirmNeverView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  // Title row.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  // Confirmation text.
  views::Label* confirmation = new views::Label(l10n_util::GetStringUTF16(
      IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_TEXT));
  confirmation->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  confirmation->SetMultiLine(true);
  confirmation->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));
  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
  layout->AddView(confirmation);
  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);

  // Confirm and undo buttons.
  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);

  confirm_button_ = new views::LabelButton(
      this,
      l10n_util::GetStringUTF16(
          IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_BUTTON));
  confirm_button_->SetStyle(views::Button::STYLE_BUTTON);
  confirm_button_->SetFontList(
      ui::ResourceBundle::GetSharedInstance().GetFontList(
          ui::ResourceBundle::SmallFont));
  layout->AddView(confirm_button_);

  undo_button_ =
      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_CANCEL));
  undo_button_->SetStyle(views::Button::STYLE_BUTTON);
  undo_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));
  layout->AddView(undo_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(confirm_button_);
}

ManagePasswordsBubbleView::ConfirmNeverView::~ConfirmNeverView() {
}

void ManagePasswordsBubbleView::ConfirmNeverView::ButtonPressed(
    views::Button* sender,
    const ui::Event& event) {
  DCHECK(sender == confirm_button_ || sender == undo_button_);
  if (sender == confirm_button_)
    parent_->NotifyConfirmedNeverForThisSite();
  else
    parent_->NotifyUndoNeverForThisSite();
}

// ManagePasswordsBubbleView::ManageView --------------------------------------

// A view offering the user a list of her currently saved credentials
// for the current page, along with a "Manage passwords" link and a
// "Done" button.
class ManagePasswordsBubbleView::ManageView : public views::View,
                                              public views::ButtonListener,
                                              public views::LinkListener {
 public:
  explicit ManageView(ManagePasswordsBubbleView* parent);
  ~ManageView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  // views::LinkListener:
  void LinkClicked(views::Link* source, int event_flags) override;

  ManagePasswordsBubbleView* parent_;

  views::Link* manage_link_;
  views::LabelButton* done_button_;
};

ManagePasswordsBubbleView::ManageView::ManageView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  // Add the title.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  // If we have a list of passwords to store for the current site, display
  // them to the user for management. Otherwise, render a "No passwords for
  // this site" message.
  if (!parent_->model()->best_matches().empty()) {
      std::vector<const autofill::PasswordForm*> password_forms;
      for (auto password_form : parent_->model()->best_matches()) {
        password_forms.push_back(password_form.second);
      }
      ManagePasswordItemsView* item = new ManagePasswordItemsView(
          parent_->model(), password_forms);
      layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
      layout->AddView(item);
  } else {
    views::Label* empty_label = new views::Label(
        l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
    empty_label->SetMultiLine(true);
    empty_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
    empty_label->SetFontList(
        ui::ResourceBundle::GetSharedInstance().GetFontList(
            ui::ResourceBundle::SmallFont));

    layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
    layout->AddView(empty_label);
    layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
  }

  // Then add the "manage passwords" link and "Done" button.
  manage_link_ = new views::Link(parent_->model()->manage_link());
  manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  manage_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));
  manage_link_->SetUnderline(false);
  manage_link_->set_listener(this);

  done_button_ =
      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
  done_button_->SetStyle(views::Button::STYLE_BUTTON);
  done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));

  BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
  layout->AddView(manage_link_);
  layout->AddView(done_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(done_button_);
}

ManagePasswordsBubbleView::ManageView::~ManageView() {
}

void ManagePasswordsBubbleView::ManageView::ButtonPressed(
    views::Button* sender,
    const ui::Event& event) {
  DCHECK(sender == done_button_);
  parent_->model()->OnDoneClicked();
  parent_->Close();
}

void ManagePasswordsBubbleView::ManageView::LinkClicked(views::Link* source,
                                                        int event_flags) {
  DCHECK_EQ(source, manage_link_);
  parent_->model()->OnManageLinkClicked();
  parent_->Close();
}

// ManagePasswordsBubbleView::BlacklistedView ---------------------------------

// A view offering the user the ability to re-enable the password manager for
// a specific site after she's decided to "never save passwords".
class ManagePasswordsBubbleView::BlacklistedView
    : public views::View,
      public views::ButtonListener {
 public:
  explicit BlacklistedView(ManagePasswordsBubbleView* parent);
  ~BlacklistedView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  ManagePasswordsBubbleView* parent_;

  views::BlueButton* unblacklist_button_;
  views::LabelButton* done_button_;
};

ManagePasswordsBubbleView::BlacklistedView::BlacklistedView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  // Add the title.
  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  // Add the "Hey! You blacklisted this site!" text.
  views::Label* blacklisted = new views::Label(
      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_BLACKLISTED));
  blacklisted->SetMultiLine(true);
  blacklisted->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));
  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
  layout->AddView(blacklisted);
  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);

  // Then add the "enable password manager" and "Done" buttons.
  unblacklist_button_ = new views::BlueButton(
      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UNBLACKLIST_BUTTON));
  unblacklist_button_->SetFontList(
      ui::ResourceBundle::GetSharedInstance().GetFontList(
          ui::ResourceBundle::SmallFont));
  done_button_ =
      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
  done_button_->SetStyle(views::Button::STYLE_BUTTON);
  done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));

  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
  layout->AddView(unblacklist_button_);
  layout->AddView(done_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(unblacklist_button_);
}

ManagePasswordsBubbleView::BlacklistedView::~BlacklistedView() {
}

void ManagePasswordsBubbleView::BlacklistedView::ButtonPressed(
    views::Button* sender,
    const ui::Event& event) {
  if (sender == done_button_)
    parent_->model()->OnDoneClicked();
  else if (sender == unblacklist_button_)
    parent_->model()->OnUnblacklistClicked();
  else
    NOTREACHED();
  parent_->Close();
}

// ManagePasswordsBubbleView::SaveConfirmationView ----------------------------

// A view confirming to the user that a password was saved and offering a link
// to the Google account manager.
class ManagePasswordsBubbleView::SaveConfirmationView
    : public views::View,
      public views::ButtonListener,
      public views::StyledLabelListener {
 public:
  explicit SaveConfirmationView(ManagePasswordsBubbleView* parent);
  ~SaveConfirmationView() override;

 private:
  // views::ButtonListener:
  void ButtonPressed(views::Button* sender, const ui::Event& event) override;

  // views::StyledLabelListener implementation
  void StyledLabelLinkClicked(const gfx::Range& range,
                              int event_flags) override;

  ManagePasswordsBubbleView* parent_;

  views::LabelButton* ok_button_;
};

ManagePasswordsBubbleView::SaveConfirmationView::SaveConfirmationView(
    ManagePasswordsBubbleView* parent)
    : parent_(parent) {
  views::GridLayout* layout = new views::GridLayout(this);
  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
  SetLayoutManager(layout);

  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
  AddTitleRow(layout, parent_->model());

  views::StyledLabel* confirmation =
      new views::StyledLabel(parent_->model()->save_confirmation_text(), this);
  confirmation->SetBaseFontList(
      ui::ResourceBundle::GetSharedInstance().GetFontList(
          ui::ResourceBundle::SmallFont));
  confirmation->AddStyleRange(
      parent_->model()->save_confirmation_link_range(),
      views::StyledLabel::RangeStyleInfo::CreateForLink());

  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
  layout->AddView(confirmation);

  ok_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK));
  ok_button_->SetStyle(views::Button::STYLE_BUTTON);
  ok_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
      ui::ResourceBundle::SmallFont));

  BuildColumnSet(layout, SINGLE_BUTTON_COLUMN_SET);
  layout->StartRowWithPadding(
      0, SINGLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
  layout->AddView(ok_button_);

  // Extra padding for visual awesomeness.
  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);

  parent_->set_initially_focused_view(ok_button_);
}

ManagePasswordsBubbleView::SaveConfirmationView::~SaveConfirmationView() {
}

void ManagePasswordsBubbleView::SaveConfirmationView::StyledLabelLinkClicked(
    const gfx::Range& range, int event_flags) {
  DCHECK_EQ(range, parent_->model()->save_confirmation_link_range());
  parent_->model()->OnManageLinkClicked();
  parent_->Close();
}

void ManagePasswordsBubbleView::SaveConfirmationView::ButtonPressed(
    views::Button* sender, const ui::Event& event) {
  DCHECK_EQ(sender, ok_button_);
  parent_->model()->OnOKClicked();
  parent_->Close();
}

// ManagePasswordsBubbleView::WebContentMouseHandler --------------------------

// The class listens for WebContentsView events and notifies the bubble if the
// view was clicked on or received keystrokes.
class ManagePasswordsBubbleView::WebContentMouseHandler
    : public ui::EventHandler {
 public:
  explicit WebContentMouseHandler(ManagePasswordsBubbleView* bubble);

  void OnKeyEvent(ui::KeyEvent* event) override;
  void OnMouseEvent(ui::MouseEvent* event) override;

 private:
  ManagePasswordsBubbleView* bubble_;
  scoped_ptr<views::EventMonitor> event_monitor_;

  DISALLOW_COPY_AND_ASSIGN(WebContentMouseHandler);
};

ManagePasswordsBubbleView::WebContentMouseHandler::WebContentMouseHandler(
    ManagePasswordsBubbleView* bubble)
    : bubble_(bubble) {
  content::WebContents* web_contents = bubble_->web_contents();
  DCHECK(web_contents);
  event_monitor_ = views::EventMonitor::CreateWindowMonitor(
      this, web_contents->GetTopLevelNativeWindow());
}

void ManagePasswordsBubbleView::WebContentMouseHandler::OnKeyEvent(
    ui::KeyEvent* event) {
  content::WebContents* web_contents = bubble_->web_contents();
  content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
  if (rvh->IsFocusedElementEditable() &&
      event->type() == ui::ET_KEY_PRESSED)
    bubble_->Close();
}

void ManagePasswordsBubbleView::WebContentMouseHandler::OnMouseEvent(
    ui::MouseEvent* event) {
  if (event->type() == ui::ET_MOUSE_PRESSED)
    bubble_->Close();
}

// ManagePasswordsBubbleView --------------------------------------------------

// static
ManagePasswordsBubbleView* ManagePasswordsBubbleView::manage_passwords_bubble_ =
    NULL;

// static
void ManagePasswordsBubbleView::ShowBubble(content::WebContents* web_contents,
                                           DisplayReason reason) {
  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
  DCHECK(browser);
  DCHECK(browser->window());
  DCHECK(browser->fullscreen_controller());

  if (IsShowing())
    return;

  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
  bool is_fullscreen = browser_view->IsFullscreen();
  ManagePasswordsIconView* anchor_view =
      is_fullscreen
          ? NULL
          : browser_view->GetLocationBarView()->manage_passwords_icon_view();
  manage_passwords_bubble_ = new ManagePasswordsBubbleView(
      web_contents, anchor_view, reason);

  if (is_fullscreen)
    manage_passwords_bubble_->set_parent_window(web_contents->GetNativeView());

  views::BubbleDelegateView::CreateBubble(manage_passwords_bubble_);

  // Adjust for fullscreen after creation as it relies on the content size.
  if (is_fullscreen) {
    manage_passwords_bubble_->AdjustForFullscreen(
        browser_view->GetBoundsInScreen());
  }
  if (reason == AUTOMATIC)
    manage_passwords_bubble_->GetWidget()->ShowInactive();
  else
    manage_passwords_bubble_->GetWidget()->Show();
}

// static
void ManagePasswordsBubbleView::CloseBubble() {
  if (manage_passwords_bubble_)
    manage_passwords_bubble_->Close();
}

// static
void ManagePasswordsBubbleView::ActivateBubble() {
  if (!IsShowing())
    return;
  manage_passwords_bubble_->GetWidget()->Activate();
}

// static
bool ManagePasswordsBubbleView::IsShowing() {
  // The bubble may be in the process of closing.
  return (manage_passwords_bubble_ != NULL) &&
      manage_passwords_bubble_->GetWidget()->IsVisible();
}

content::WebContents* ManagePasswordsBubbleView::web_contents() const {
  return model()->web_contents();
}

ManagePasswordsBubbleView::ManagePasswordsBubbleView(
    content::WebContents* web_contents,
    ManagePasswordsIconView* anchor_view,
    DisplayReason reason)
    : ManagePasswordsBubble(web_contents, reason),
      ManagedFullScreenBubbleDelegateView(anchor_view, web_contents),
      anchor_view_(anchor_view),
      initially_focused_view_(NULL) {
  // Compensate for built-in vertical padding in the anchor view's image.
  set_anchor_view_insets(gfx::Insets(5, 0, 5, 0));
  if (anchor_view)
    anchor_view->SetActive(true);
  mouse_handler_.reset(new WebContentMouseHandler(this));
}

ManagePasswordsBubbleView::~ManagePasswordsBubbleView() {
  if (anchor_view_)
    anchor_view_->SetActive(false);
}

views::View* ManagePasswordsBubbleView::GetInitiallyFocusedView() {
  return initially_focused_view_;
}

void ManagePasswordsBubbleView::Init() {
  views::FillLayout* layout = new views::FillLayout();
  SetLayoutManager(layout);

  Refresh();
}

void ManagePasswordsBubbleView::WindowClosing() {
  // Close() closes the window asynchronously, so by the time we reach here,
  // |manage_passwords_bubble_| may have already been reset.
  if (manage_passwords_bubble_ == this)
    manage_passwords_bubble_ = NULL;
}

void ManagePasswordsBubbleView::Close() {
  mouse_handler_.reset();
  ManagedFullScreenBubbleDelegateView::Close();
}

void ManagePasswordsBubbleView::Refresh() {
  RemoveAllChildViews(true);
  initially_focused_view_ = NULL;
  if (password_manager::ui::IsPendingState(model()->state())) {
    if (model()->never_save_passwords())
      AddChildView(new ConfirmNeverView(this));
    else
      AddChildView(new PendingView(this));
  } else if (IsAskSubmitURLState(model()->state())) {
    AddChildView(new AskUserToSubmitURLView(this));
  } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) {
    AddChildView(new BlacklistedView(this));
  } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) {
    AddChildView(new SaveConfirmationView(this));
  } else if (password_manager::ui::IsCredentialsState(model()->state())) {
    AddChildView(new AccountChooserView(this));
  } else {
    AddChildView(new ManageView(this));
  }
  GetLayoutManager()->Layout(this);
}

void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() {
  model()->OnNeverForThisSiteClicked();
  Close();
}

void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() {
  model()->OnUndoNeverForThisSite();
  Refresh();
}

void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() {
  if (model()->best_matches().empty()) {
    // Skip confirmation if there are no existing passwords for this site.
    NotifyConfirmedNeverForThisSite();
  } else {
    model()->OnConfirmationForNeverForThisSite();
    Refresh();
  }
}

redpajama_set_name: RedPajamaGithub


text:
Province-wide strike halts work on Wellington water tower
Administrator | May 06, 2022 | Comments 0
UPDATE JUNE 1: Construction has resumed on the Wellington water tower following the conclusion of the strike.
Work at the site of the Wellington water tower got under way last month. – John Ferguson photo
A province-wide strike by the International Union of Operating Engineers (IUOE) has impacted the construction of the new water tower in Wellington.
IUOE went on strike as of Monday, May 2. All work at the Wellington water tower has stopped as a result.
"Construction on the foundation of the water tower cannot proceed as the operators of the drill machinery are members of the IUOE," explains Mark Kerr, the County's Communications and Media Coordinator.
He states County staff are monitoring the situation and will provide further updates as they become available.
Construction began early April at the northeast corner of the Belleville Street and First Avenue intersection.
It was tentatively scheduled for completion in the spring of 2023. The new elevated water tank is expected to provide the recommended pressures for the existing system, and for the planned future developments over the next 20 years.

redpajama_set_name: RedPajamaCommonCrawl


Bright & Spacious 4 Bedroom Home In Prestigious St.Andrews Neighborhood! Formal Principal Rooms,Upgraded Gourmet Eat-In Kitchen,Master Retreat With 5-Pc Ensuite, Newly Laid Broadloom In 3 Bedrooms. Professionally Finished Basement With Large Rec Room, Custom Cherry Wet Bar & Exercise Room. Professionally Landscaped & Newly Renovated Entertainer's Backyard Complete With In-Ground Pool & Cabana.Walk To Subway At York Mills/Yonge! Excellent Schools.


text:
Glenn Yarbrough
Glenn Yarbrough (12 January, 1930 - 11 August, 2016) was the composer and performer of the music of The Hobbit (1977 film) and The Return of the King. His songs include "The Greatest Adventure", "Frodo of the Nine Fingers" and "Where There's a Whip, There's a Way". In The Return of the King, he is also the voice of the "Minstrel of Gondor", a character that sings the story of the movie to Bilbo and Elrond in Rivendell.
[edit] Discography
1977: The Hobbit: Original Soundtrack
"The Greatest Adventure" (also writer)
"The Road Goes Ever On"
1980: The Return of the King: Soundtrack
"Frodo of the Nine Fingers"
"Where There's a Whip, There's a Way
"The End of the Ring"
"Roads Go Ever, Ever On"
[edit] External links
Glenn Yarbrough at Wikipedia
Glenn Yarbrough at IMDb
Retrieved from "http://tolkiengateway.net/wiki/Glenn_Yarbrough"
Categories: Actors and actresses | American people | Composers | Folk music | People by name | The Return of the King (1980 film) cast | Singers
Content is available under GNU Free Documentation License.


In November of 2015 I realised it was time. I had been wanting to join a hip hop group for ten years, but yet I always feel too white and too big to actually join one, even though when I was little I used to come up with choreo's all the time, and perform them for the whole school. I thought I'd be pretty good at hip hop dancing, cause I absolutely love doing it.
So I joined a group of 30+ ladies, even though I am 28, as I did not want to spoil the hip hop fun for a group of 16 year olds. So at first I thought: I might be rusty, but I will be okay in this group. Well, I was wrong. Right now we are getting lessons from a new teacher, that is teaching us crazy cool moves pretty fast, and I notice (and get super frustrated) by how my brain is just too tired after a full day of work and being borderline, so I just kinda crash and then it takes me ten times before I finally have the step in my head.
But when I remember the choreo and I do it a lot, I kinda program my brain to do it, (music is very helpful!) and then it gets a bit easier and more fun. I never realised though, how hard it is to learn someone elses choreo's. I am used to making my own. And I do hip hop video games, but they go so slow, especially compared to the stuff we are doing now. I am pretty impressed too, with the other ladies, some of them are around 50 years old, but they have moves and a way better memory than I do.
Not that it is a competition by the way. We are very friendly towards each other and I would even consider many of them my friends. When I started dancing at this hip hop school, I never really thought about what great things I could get out of it besides being a super cool hip hop chick (which I clearly am not haha). This is going to sound very sappy, but I feel very blessed to have these amazing women around me, that care about my well being, that are just as nervous as I am for our big performance (remember the boxer braids? 😉 ) and that are showing up every time even though they don't just have jobs, they have kids too.
It is so cool to have this group feeling again, of belonging to a a group, but also as an extra reason to go dancing. If I would not like the people and I was feeling as low as I was this evening, I would probably have not gone. But because I know these ladies are awesome, I did go, and even though it went super sucky at first, I really left with a happy feeling inside, not just because at the end my brain understood the choreo again, but also because the ladies hugged me, asked how I was doing (lots of stuff going on people, still can't really write about it..) and they just made me feel all warm and fuzzy inside.
Previous Happy 20 year anniversary Spice Girls!


March 2016 Events at Florey's Book Co.
A fun illustrated childrens's book!
March 12th, 2-4pm. Come and share the joy of writing, reading, and poetry!
February 2016 Poetry at Florey's!
The featured poets this month are: Erica Goss and Renee M. Schell. The featured poets will be followed by an open mic period. Open mic sign-up is first come, first served. This event is open to the public and free of charge. You are welcome to bring a snack or beverage to share.
Erica Goss served as Poet Laureate of Los Gatos, CA from 2013-2016. She is co-founder of Media Poetry Studio, a poetry-and-film camp for teen girls: www.mediapoetrystudio.com. She is the author of Wild Place(Finishing Line Press 2012) and Vibrant Words: Ideas and Inspirations for Poets (PushPen Press 2014). Her poems, reviews and articles appear widely, both on-line and in print. Erica works as a poet-teacher and Development Director for California Poets in the Schools. Please visit her at: www.ericagoss.com.
Renée M. Schell's chapbook Overtones won Second Place in the 2014 Palettes & Quills Chapbook Contest. Her poem "Accidental Bird-Watcher' won First Place in the 2015 Los Gatos Poet Laureate Contest. In 2014 her poem "Beyond Vienna" took Third Prize in the 2014 String Poet competition. Renée's poetry has appeared in On the Dark Path: An Anthology of Fairy Tale Poetry, Catamaran Literary Reader, Perfume River Poetry Review, and other journals. Her work appears online at literarymama.com, sharkreef.org, MonkeyBicycle, Mezzo Cammin and Eye To the Telescope and is forthcoming in All We Can Hold, an anthology of poems about motherhood. She was a contributing editor to the literary journal Red Wheelbarrow for two years and was lead editor of the anthology (AFTER)life: Poems and Stories of the Dead, published by Purple Passion Press in 2015. She holds a Ph.D. in German Studies from Stanford University and taught German for many years. She enjoys sharing poetry with elementary school students and is currently working toward a teaching credential. In her free time she enjoys zumba and classical piano.
Local Forum: 'The Pursuit of Happiness', February 24th at Florey's!
First off, I'd like to happily announce that I've FINALLY decided on a better group name than Culture Club. Honestly, since that popped into my head a year ago I didn't like it at all but I had no idea what else to call it. Eureka! I've got it! Henceforth I'll be referring to our discussion group as "Local Forum" since it just makes way more sense. Let me know if you like it or not.
February's topic is one I'm pretty excited about since it's more abstract than any previous topics we've had. We'll be discussing The Pursuit of Happiness. Questions like... how much happiness is a person entitled to? Why are some 'pursuits of happiness' more socially acceptable than others and is that fair (drugs vs. health)? Do you agree with the inclusion of this as an American right? How does this affect our culture? Can money buy happiness? What is the difference between contentment and happiness?
Pacifica Book Club: 'The Martian', February 23rd at Florey's!
Come by for a chat about our February book, 'The Martian' by Andy Weir.
'Experience Your Soul Dynamics' with Andrea Siebert, Feb. 17th at Florey's!


text:
lua50 • man page
lua - Lua interpreter
lua50 (1)
lua.man,v 1.8 2003/04/02 00:05:20 lhf Exp
(The comments found at the beginning of the groff file "man1/lua50.1".)
lua [ options ] [ script [ args ] ]
lua is the stand-alone Lua interpreter. It loads and executes Lua programs, either in textual source form or in precompiled binary form. (Precompiled binaries are output by luac, the Lua compiler.) lua can be used as a batch interpreter and also interactively.
The given options (see below) are executed and then the Lua program in file script is loaded and executed. The given args are available to script as strings in a global table named arg. If these arguments contain spaces or other characters special to the shell, then they should be quoted (but note that the quotes will be removed by the shell). The arguments in arg start at 0, which contains the string `script'. The index of the last argument is stored in arg.n. The arguments given in the command line before script, including the name of the interpreter, are available in negative indices in arg.
At the very start, before even handling the command line, lua executes the contents of the environment variable LUA_INIT, if it is defined. If the value of LUA_INIT is of the form `@filename', then filename is executed. Otherwise, the string is assumed to be a Lua statement and is executed.
Options start with - and are described below. You can use -- to signal the end of options.
If no arguments are given, then -v -i is assumed when the standard input is a terminal; otherwise, - is assumed.
In interactive mode, lua prompts the user, reads lines from the standard input, and executes them as they are read. If a line does not contain a complete statement, then a secondary prompt is displayed and lines are read until a complete statement is formed or a syntax error is found. So, one way to interrupt the reading of an incomplete statement is to force a syntax error: adding a `;' in the middle of a statement is a sure way of forcing a syntax error (except inside multiline strings and comments; these must be closed explicitly). If a line starts with `=', then lua displays the values of all the expressions in the remainder of the line. The expressions must be separated by commas. The primary prompt is the value of the global variable _PROMPT, if this value is a string; otherwise, the default prompt is used. Similarly, the secondary prompt is the value of the global variable _PROMPT2. So, to change the prompts, set the corresponding variable to a string of your choice. You can do that after calling the interpreter or on the command line with _PROMPT='lua: ', for example. (Note the need for quotes, because the string contains a space.) The default prompts are ``> '' and ``>> ''.
load and execute the standard input as a file, that is, not interactively, even when the standard input is a terminal.
-e stat
execute statement stat. You need to quote stat if it contains spaces, quotes, or other characters special to the shell.
enter interactive mode after script is executed.
-l file
call require(file) before executing script. Typically used to load libraries (hence the letter l).
show version information.
suppress the creation of a standard LUA_PATH variable. Use this if you need to run scripts which conflict with system-installed libraries.
luac(1)
www.lua.org
Error messages should be self explanatory.
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes
<lua@tecgraf.puc-rio.br>
Debian modifications to the manpage by Daniel Silverstone
<dsilvers@debian.org>
lua50
luac (1)


text:
Jordan Clarkson Believes Lakers Need To 'Grow Up'
For Los Angeles Lakers point guard D'Angelo Russell, playmaking with a more simplistic approach, might be the most beneficial offensive focus for him this season. During their Christmas Day win over the L.A. Clippers on Sunday night, head coach Luke Walton said he got on Russell a couples times for trying to make the spectacular play, rather then the simple pass.
It's something Walton has continued to stress, especially with Russell committing an average of 3.1 turnovers per game this season.
"In reality, the simple leads to the spectacular," Walton explained after the game.
Russell is averaging 4.5 assists this season, up from his 3.3 apg last season, but his assist to turnover ratio has yet to improve. Walton said Russell was great in practice on Monday, but when it came time to scrimmage, Russell made a similar ill-advised pass, when he could have made the simple play.
"The tough part is, I'm a big believer in letting these guys use their creativity," Walton furthered after practice. "They're the best players in the world. Obviously, I don't want them thinking they cant make plays, but you've got to know time and score and when somebody is open, to me, just hit him, and let that guy make the next pass and for where we're at as a team right now, that's going to give us our best chance to succeed, and he (Russell) did that for a lot of the game yesterday, but there's a few plays that could've cost us, and one in the fourth that did cost us, where we could've just made the simple pass and we tried to do something a little too flashy."
Walton comes from the coaching philosophy of wanting to give his players freedom to make their own decisions, but with a young group, that too can be challenging.
"We give them freedom, and then we coach them," Walton said. "It's how you grow, you let them make mistakes, but you've got to correct them when they do…but you still encourage them at the same time."
Lakers News: Lonzo Ball, Luke Walton Hold Same Philosophy Despite Rookie's Shooting Struggles
When the Los Angeles Lakers selected Lonzo Ball with the No. 2 overall pick in the 2017 Draft, one of, if not the biggest…
Matthew Moreno
VIDEO: Phil Jackson On The Lakers, 'They've Got A Lot Of Needs'
For years now, Los Angeles Lakers fans have been pleading to bring…
Los Angeles Lakers Vs. Minnesota Timberwolves NBA Highlights
The Los Angeles Lakers start off the 2015-2016 NBA season against No.…
PHOTO: Kobe Bryant Tweets Picture Of Kobe 9 Elite Masterpiece
With Kobe Bryant out for as much as another month with his…


text:
.. pipenv documentation master file, created by
   sphinx-quickstart on Mon Jan 30 13:28:36 2017.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Pipenv: Python Dev Workflow for Humans
======================================

.. image:: https://img.shields.io/pypi/v/pipenv.svg
    :target: https://pypi.python.org/pypi/pipenv

.. image:: https://img.shields.io/pypi/l/pipenv.svg
    :target: https://pypi.python.org/pypi/pipenv

.. image:: https://img.shields.io/pypi/pyversions/pipenv.svg
    :target: https://pypi.python.org/pypi/pipenv

.. image:: https://img.shields.io/badge/Say%20Thanks!-🦉-1EAEDB.svg
    :target: https://saythanks.io/to/kennethreitz

---------------

**Pipenv** — the officially recommended Python packaging tool from `Python.org <https://packaging.python.org/tutorials/managing-dependencies/#managing-dependencies>`_, free (as in freedom).

Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. *Windows is a first–class citizen, in our world.*

It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your ``Pipfile`` as you install/uninstall packages. It also generates the ever–important ``Pipfile.lock``, which is used to produce deterministic builds.

.. raw:: html

    <iframe src="https://player.vimeo.com/video/233134524" width="700" height="460" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

The problems that Pipenv seeks to solve are multi-faceted:

- You no longer need to use ``pip`` and ``virtualenv`` separately. They work together.
- Managing a ``requirements.txt`` file `can be problematic <https://www.kennethreitz.org/essays/a-better-pip-workflow>`_, so Pipenv uses the upcoming ``Pipfile`` and ``Pipfile.lock`` instead, which is superior for basic use cases.
- Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
- Give you insight into your dependency graph (e.g. ``$ pipenv graph``).
- Streamline development workflow by loading ``.env`` files.

Install Pipenv Today!
---------------------

.. note:: The use of **Python 3** is *highly* preferred over Python 2, when installing Pipenv. Compatibility with three virtualenvs is greatly improved when using Python 3 as the installation target.

  —*Kenneth Reitz*

Pipenv is a python package and so can be installed using ``pip`` as you would expect.
::

    $ pip install pipenv
    ✨🍰✨

If you have excellent taste, there are various other installation methods which
prevent pipenv and its dependencies from interfering with the rest of your
Python installation. These include
`Pipsi <https://docs.pipenv.org/install.html#fancy-installation-of-pipenv>`_,
`Nix <https://docs.pipenv.org/install.html#referentially-transparent-installation-of-pipenv>`_
and `Homebrew <https://docs.pipenv.org/install.html#homebrew-installation-of-pipenv>`_.

.. toctree::
   :maxdepth: 2

   install

User Testimonials
-----------------

**Jannis Leidel**, former pip maintainer—
    *Pipenv is the porcelain I always wanted to build for pip. It fits my brain and mostly replaces virtualenvwrapper and manual pip calls for me. Use it.*

**Justin Myles Holmes**—
    *Pipenv is finally an abstraction meant to engage the mind instead of merely the filesystem.*

**Isaac Sanders**—
    *Pipenv is literally the best thing about my day today. Thanks, Kenneth!*

☤ Pipenv Features
-----------------

- Enables truly *deterministic builds*, while easily specifying *only what you want*.
- Generates and checks file hashes for locked dependencies.
- Automatically install required Pythons, if ``pyenv`` is available.
- Automatically finds your project home, recursively, by looking for a ``Pipfile``.
- Automatically generates a ``Pipfile``, if one doesn't exist.
- Automatically creates a virtualenv in a standard location.
- Automatically adds/removes packages to a ``Pipfile`` when they are un/installed.
- Automatically loads ``.env`` files, if they exist.

The main commands are ``install``, ``uninstall``, and ``lock``, which generates a ``Pipfile.lock``. These are intended to replace ``$ pip install`` usage, as well as manual virtualenv management (to activate a virtualenv, run ``$ pipenv shell``).

Basic Concepts
//////////////

- A virtualenv will automatically be created, when one doesn't exist.
- When no parameters are passed to ``install``, all packages ``[packages]`` specified will be installed.
- To initialize a Python 3 virtual environment, run ``$ pipenv --three``.
- To initialize a Python 2 virtual environment, run ``$ pipenv --two``.
- Otherwise, whatever virtualenv defaults to will be the default.

Other Commands
//////////////

- ``graph`` will show you a dependency graph, of your installed dependencies.
- ``shell`` will spawn a shell with the virtualenv activated.
- ``run`` will run a given command from the virtualenv, with any arguments forwarded (e.g. ``$ pipenv run python``).
- ``check`` checks for security vulnerabilities and asserts that PEP 508 requirements are being met by the current environment.

Further Documentation Guides
----------------------------

.. toctree::
   :maxdepth: 2

   basics
   advanced

☤ Pipenv Usage
--------------

.. click:: pipenv:cli
   :prog: pipenv
   :show-nested:

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`


A birthday party for Louisa gets her brooding about her age. Leslie takes up fashion photography. Gerry wears out another tutor. Vasilia offers Louisa a diabolical deal. The Durrells in Corfu, Season 2, Episode 3 airs Sunday, October 29th, 2017 at 8/7c on MASTERPIECE on PBS.
synopsis: A birthday party for Louisa gets her brooding about her age. Leslie takes up fashion photography. Gerry wears out another tutor. Vasilia offers Louisa a diabolical deal. The Durrells in Corfu, Season 2, Episode 3 airs Sunday, October 29th, 2017 at 8/7c on MASTERPIECE on PBS.


Collaborating with other artists has been an important role on his journey – leading to projects and remixes for the likes of Philip Bader, NU and Acid Pauli to name a few.
LETHARGY FESTIVAL want to say 'watch this space', but we already are. 2016 ACID TRIBE !


text:
Boats Caison 67 On the Drawing Board
Caison 67 On the Drawing Board
Hardcore fishability and head-turning good looks
By Marlin Staff
The Caison 67 will be powered by a pair of MTU 2,600-horsepower diesels, which should produce a cruising speed of over 40 knots. Courtesy Caison
Donnie Caison continues to define his brand by offering a complete design and build experience: His boats are designed to fish hard by someone with a deep passion for the sport. Caison's boats are based on the classically flared cold-molded Carolina hull, yet each build is entirely unique based on the customer's choice of length, power, electronics and amenities. With his latest project, a 67-foot sport-fisher, he continues to design and build custom yachts to the exacting specifications of his clients.
This build is for a returning customer, underscoring Caison's inspirational loyalty to those with whom he works. "The Caison 67 will maintain my traditional values of no-nonsense fishability, classic lines and modern technology," he says, "but it's always exciting to incorporate the customer's input, and utilize state-of-the-art manufacturing and equipment to produce an incredible sport-fishing boat."
The Caison 67 will be powered by a pair of MTU 2,600-horsepower diesels, which should produce a cruising speed of over 40 knots. It will also sport a pair of 25-kilowatt generators, a Seakeeper 16 gyrostabilizer and a full tuna tower. The interior layout will feature a spacious salon, well-appointed galley, four staterooms and three heads. The Caison 67 is expected to splash in fall 2019.
More Boat Building, caison yachts, On the Drawing Board, Sport Fishing Boats
More Boats


Leicester City midfielder Richie Wellens had agreed a one-month loan deal with Ipswich Town.
The former Doncaster man is continuing his recovery from a significant knee injury and has been allowed out on loan by Nigel Pearson in a bid to speed up that process.
"I've been looking to go out on loan and when the opportunity arose to come to Ipswich, I didn't have to think twice," said Wellens, "Leicester wanted me to go out on loan and when they showed me the list of clubs that I could go to, Ipswich stood out."
Wellens is expected to go straight into the Tractor Boys' matchday squad.


text:
Sony presents a prototype VR headset with 8K resolution and OLED microscreens
Sony has celebrated its Technology Day, a day that the company takes advantage of to present some of the technological advances that it currently has in development. One of these novelties has to do with virtual reality, since a prototype of headset VR able to reproduce a 8K resolution thanks to 4K ultra-high definition OLED micro-displays that are barely an inch in size: "It has more than twice the pixels of OLEDs in smartphones and the size of the panel is reduced to almost 1/20", explain those responsible for the prototype in the vdeo which you can see below:
This is not the first headset VR 8K that exists, in fact there are already some for sale, but from Sony they consider that with this technology in the process of development may reduce both the physical size of the device and the latencya of the material that is reproduced, thus resulting in a more comfortable way of playing that avoids dizziness in people prone to it.
Virtual reality beyond the video game
"Our goal is to make head-mounted displays smaller, lighter and ultra-high resolution"Explain those responsible, who also seek new uses for this type of device beyond the video game:" Ultimately we would like to create an amazing sensation of immersion for collaboration and remote exchange. (…) Create spaces for people to interact through the network ", something for which they have already moved token.
Although this prototype is not exclusively oriented to the video game, the truth is that even in the video we can see an example of how it would be compatible with VR titles. Unlike Xbox, PlayStation continues to support this technology and in fact we are waiting to learn more about the game. new headset from PS VR to PS5, a new generation of the one we already saw on PS4 and of which only the controls have been shown at the moment. There is no official confirmation of its release date, but it is expected that it could hit stores by the end of next year.
PrevPokémon GO – All Events for December 2021
NextStream it or skip it: 'Crime Scene Kitchen' on Fox, a baking competition where contestants gather
Put intelligence at the service of tranquility


Immediate access to the IBM 000-057 Exam and 1000+ other exam PDFs. This is the BEST deal at only $99.00 for unlimited access. You WILL pass right away - we Guarantee it!
Begin unlocking IBM Solution Advisor 000-057 answers and the secrets to passing any exam faster without expensive and time consuming IBM 000-057 books. What's the problem with traditional book learning you ask? Unlike IBM 000-057 CBT, your IBM 000-057 book is not updated as new information or changes in technology happen. AppScan Source Edition Your printed material is always only a snapshot of that present's IBM Solution Advisor 000-057 exam details, and does not adapt. AppScan Source Edition This fact alone demonstrates why the IBM 000-057 cost of training is so great using traditional methods.
ActualCerts goes above and beyond by preventing frequent checks for relevance and performs an automatic AppScan Source Edition download of any updated materials, keeping your ActualCerts products up-to-date. AppScan Source Edition This is one of the chief resona more certification candidates select ActualCerts over other providers, IBM 000-057 exam papers from ActualCerts guarantee that you pass IBM Solution Advisor 000-057 exam questions on the first attempt.
ActualCerts IBM Solution Advisor 000-057 practice questions come in an easy to print format similar to the AppScan Source Edition free PDF files. AppScan Source Edition Take your IBM 000-057 practice exams with you and study any time you like on your own schedule. Unlike any other IBM 000-057 PDF however, the printable IBM Solution Advisor 000-057 practice exam is kept up to date and is always relevant.
When you are ready, go beyond the Q&A and dive right into a AppScan Source Edition lab. Comprehensive IBM 000-057 labs put your skills through the wringer and demonstrate your strengths and weaknesses in real-world situations. Lab tools and other detailed IBM 000-057 materials are created to compliment the IBM Solution Advisor 000-057 online test and make certain you pass the real exam when you have finally mastered all IBM 000-057 online tests. AppScan Source Edition Labs give you the added benefit of documenting what you have learned, and learn while studying by permitting you to take powerful IBM 000-057 notes and retain them for later use.
Labs are not the only IBM 000-057 tutorials however, in fact you will find IBM Solution Advisor 000-057 study materials in every format imaginable to assist even the most difficult learning styles. Going beyond the IBM 000-057 sample questions you will find AppScan Source Edition simulation questions and condensed format IBM Solution Advisor 000-057 study guides. AppScan Source Edition IBM 000-057 simulations are the same as the labs and will test your knowledge under a particular situation; however they are not necessarily timed.
For a time sensitive AppScan Source Edition tutorial you should select to use the IBM 000-057 practise test where you can edit the kinds of questions, time limit and even which section of the exam you would like to focus on. AppScan Source Edition Choose to only answer or cover IBM Solution Advisor 000-057 questions you have already answered, but were incorrect. This customizable IBM 000-057 practice exam is perfect for someone who wants to score 100% on the actual exam without spending a fortune on IBM 000-057 video training.
IBM 000-057 Exam Dumps, Seriously?
Your quest for the latest IBM 000-057 dumps ends here, if you take our advice and choose to use our AppScan Source Edition tests and practice materials to study for your next AppScan Source Edition quiz. A large percentage of IBM 000-057 latest dumps have been found to infect computers, servers and reading devices. AppScan Source Edition However this is insignificant in comparison to the kind of destruction IBM 000-057 free dumps can do to your career and professional life.
To be blunt, IBM 000-057 dumps are illegal, cheating, and if you use a IBM 000-057 dump to pass your exam you are ruining the validity of your certification. Your reputation is on the line and it will be tarnished if and when your employer or colleagues discover you used IBM Solution Advisor 000-057 braindumps to pass your exam. AppScan Source Edition There is no AppScan Source Edition braindump that can impart any real education. By nature, AppScan Source Edition brain dumps only purpose to to force you to memorize questions and answers, without any understanding of the actual materials themselves.
Although candidates lie to themselves all the time about it, its painfully obvious when someone uses the AppScan Source Edition brain dump to pass their test. AppScan Source Edition The lack of understanding and competency in discussion or in practice will force the cheater from gainful employment.
So use the fast and easy IBM 000-057 practice test to your advantage and use timed results to perfect your AppScan Source Edition practice tests ability. AppScan Source Edition With each IBM 000-057 practise exam you will find that the comprehension increases and your retention from AppScan Source Edition practise exams solidifies your prep. Turn on that cam and make your own AppScan Source Edition video to complement training and use IBM 000-057 notes to become an instant star showing off how you passed your AppScan Source Edition practice tests with 100% success!


text:
Study: Men Are Wonderful
Why males put female happiness above their own
Next time a woman tells you that men are slime, refute her claim by citing new research from the University of Chicago. Researchers found that men are more likely than women to put their partners' happiness ahead of their own. This unremarkable conclusion came after a survey of altruistic tendencies among 1,300 men and women. True, the study found that women are more altruistic and empathetic in virtually all other areas of life, but that's not the subject here.
"Women are more empathetic toward abstract humanity -- 'strangers' or 'poor people,' " says study author Tom W. Smith, Ph.D., "while men's altruism is more focused on their intimate others." Another finding: People who put the welfare of significant others ahead of their own were 17 percent more likely to describe themselves as happy in their marriages.
Special-Occasion Sex Is the Best Kind of Sex
Is Porn Bad For You? The Answer Is Complicated.
25 Sexy Gifts for the Woman in Your Life
The Difference Between Bisexual and Pansexual
Everything to Know About Buying a Sex Swing
Meet the World's Greatest Sex Hacker
Guys Share Stupidest Things They Did While Horny
This Perineum Patch Fixes Prematures Ejaculation
Celebrity Couples You Forgot Started as Affairs
12 Exercises That'll Make You Better at Sex
"Mystery Is a Good Thing"
23 Ways to Be the Man She Wants
Light Her Fuse
The Couples Commandments
10 Simple Ways to Keep Her Happy
21st-Century Foreplay


text:
Catherine Ross on Student Walkouts: "What is at stake in teaching young people how to live liberty—particularly how to exercise their expressive rights—is nothing less than the future of our democracy."
Catherine J. Ross is a professor at George Washington University Law School where she specializes in constitutional law (with particular emphasis on the First Amendment), family law, and legal and policy issues concerning children. Her book, Lessons in Censorship: How Schools and Courts Subvert Students' First Amendment Rights (Harvard University Press, 2015) was named the Best Book on the First Amendment by Concurring Opinions' First Amendment News (see FAW Excerpt), and won the Critics' Choice Book Award from the American Education Studies Association. Professor Ross has been a co-author of Contemporary Family Law (Thomson/West) since the First Edition; the Fourth Edition was published in 2015.
Emma Gonzalez speaks at the March for Our Lives protest in Washington, DC on March 24, 2018.
The Marjory Stoneman Douglas (MSD) students who became overnight activists and the thousands of other K-12 students they inspired are all modelling the vision of active citizenship that animates my book Lessons in Censorship: How Schools and Courts Subvert Students' First Amendment Rights (Harvard University Press 2015). I argue there that what is at stake in teaching young people how to live liberty – particularly how to exercise their expressive rights – is nothing less than the future of our democracy. Like many, I am awed by the intelligence, articulateness and political savvy of the high school students who, without special preparation or any desire to lead a crusade, found themselves on the national stage after experiencing tragedy and proved themselves more than up to the task.
I write this on the weekend that hundreds of thousands of people — catalyzed by teenagers who survived the deadly massacre at MSD High School in Parkland Florida on February 14, 2018 – – at more than 800 locations around the world assembled to demand legal changes that would curtail rampant gun violence in the U.S.1 Those protesters were all exercising what even the White House — which rejects their substantive demands — recognized are their First Amendment rights.2 So too are the handful of counter-protesters who showed up at select locations.
The First Amendment fully protects such expressive assemblies and speeches outside of school hours and away from school campuses.
But what about the actions during the school day in schools across the country on March 14 to mourn those who perished at MSD, support the survivors, and demand action to prevent gun violence moving forward? Unfortunately, the answer to whether the First Amendment protected those protesters is less clear-cut. Bear in mind that First Amendment rights are strictly limited to those who attend public schools; independent schools are not bound by the First Amendment, which only applies to government entities.
National Walkout Day March 14 2018
The March 14 demonstrations took a variety of forms. At some schools, students left class with permission to hold a silent vigil that lasted 17 minutes—one minute for each person who died at MSD. In others, students left without permission and returned in 17 minutes. At still others, the students were absent for the much of the school day: they left campus to demonstrate at Congress or the state legislature. The national press reported that while many schools accommodated students who desired to participate in a day of remembrance and action ("Principals and superintendents seemed disinclined to stop them"), others proposed alternative official activities (a moment of silence or assembly) while still others "seemed divided and even flummoxed about how to handle their emptying classrooms."3
Special rules apply to the speech of K-12 students on campus during the school day. As a general matter, school officials may not silence or punish the expression of individual students unless the school can show that it reasonably anticipates the expression threatens to materially disrupt the school's essential functioning (that is, education), as the U.S. Supreme Court held in Tinker v. Des Moines Independent School District (1969). Nor can schools ever punish students for their viewpoints on any issue. That much is clear. But the line of cases in which the Supreme Court set out the special rules that govern student speech in public schools is difficult to understand and to apply.
Mary Beth Tinker holding her original detention slip after she wore a black armband to school to protest the Vietnam War (with a replica on her left arm) during a speech at Textor Hall, Ithaca College, 19 September 2017.
The Supreme Court has never considered a case involving students who walked out of class to engage in a demonstration, but it has strongly hinted that leaving class is not a protected form of expression: In Tinker, the court upheld students' right to wear a black armband as part of an antiwar protest, noting that the students had not engaged in any "group demonstration." At a minimum, Tinker means that students who restricted their expression on March 14 to wearing orange – a statement encouraged by some organizers of National School Walkout including Women's March Youth Empower – were engaging in precisely the kind of passive, silent and non-disruptive speech Tinker expressly protects. (One more wrinkle: unless a particular school can show it has a history of gang violence, including violence triggered by gang colors which might include orange).
Lower courts uniformly agree about walk-outs and demonstrations not being constitutionally protected in school, which makes sense. Students who are not in class are not learning; school is not functioning. Schools have the legal authority to punish students who absent themselves without permission, but that does not mean that officials need to exercise that authority when students are engaging in meaningful political activity, regardless of whether school officials agree with the students' goals.
Many important lessons may be learned outside of class and curriculum. Civic engagement is one of them. One student I saw on March 14 in Washington D.C. carried a sign bearing the picture of a girl who died at MSD, along with this eloquent statement: "I missed a day of school because she missed the rest of her life."
Similarly, schools that allowed students (or students who had parental permission) to leave class in order to participate in an orderly demonstration were seizing a teaching moment and helping students learn how to exercise their citizenship rights.
Sometimes, those who engage in civil disobedience must pay a price, whether in the world at large or in school. Needville High School in Needville, Texas used Facebook to warn students that there was no safety in numbers: "no matter if it is one, fifty, or five hundred students involved," any student who protests on March 14 will be "suspended for 3 days and parent notes will not alleviate the discipline."4 On the positive side, at least students who were thinking about protesting had advance notice of the penalty they would face.
With luck, the punishment will be proportionate to the offense. Schools that punished students who left class without permission did not violate students' rights, though you, I or a given federal judge may have made a different calculation. Some colleges made that different calculation. They announced they in considering candidates for admission, they would not weigh penalties for participating in an unauthorized demonstration on March 14 sending a clear message about citizenship and responsibility.
Some schools went further than disciplining students who missed class on March 14: they punished students for what they said while demonstrating.
One incident that received a lot of national attention requires precise legal analysis. Noah Christiansen, a student at McQueen High School in Reno, Nevada, was suspended for two days and barred from assuming the position as class secretary to which his peers had just elected him after he cursed at a congressional staffer during a telephone call in which he was lobbying for gun control. The protesters at McQueen had left class, and were marked "tardy" for the class that followed. They decided to use the walkout on March 14 to call their congressional representatives.
During a phone call to his Congressman's office, Christiansen told a staff member that lawmakers needed to "'get off their f-ing asses and do something about gun control.'"5 After the staffer complained to McQueen's principal, the school punished Christiansen for violating its rules about "defiance/disrespect/insubordination," telling Christiansen (who apparently had an unblemished disciplinary record up to that point) that his behavior was "very embarrassing" for the school. Institutional embarrassment — while frequently the actual motivation for censoring student speech — is not a constitutionally sufficient justification for suppressing protected expression. Christiansen admitted that he had shown poor judgment, and probably should have chosen different language, but asserts, "'if I do want to use words, and use them over and over again, it's my right to do so."6
Is he right? Many schools forbid and punish cursing on campus. Some courts have upheld such penalties as perhaps unwise but beyond the purview of the judiciary. Outside of school, the Constitution allows speakers to choose the manner of expression they find most effective: "it is often said that one man's vulgarity is another's lyric." Cohen v. California (1971). Many judges have accepted without questioning that Cohen's jacket (bearing the f-word) may be protected in a courthouse but has no place in a school. My scholarship, however, casts doubt on that abrogation of students' rights to choose the manner in which they express their ideas, a right that adults have long possessed.
The Constitution protects cursing, even in school, unless in context it has sexual connotations, in which case the school has almost unlimited discretion to punish it under yet another school speech case. Bethel v. Fraser (1986). So, the first question is whether the f-word is always sexual. Arguably, it was not used that way in Christiansen's conversation.
If it fell within the school's discretion to punish Christiansen's choice of language, it would matter whether he spoke during the school day from the school campus, or whether, as some observers claim and as Christiansen himself reportedly views it, he "had not made the phone call from class, or a school event; he was already marked tardy."7 Does that mean that his expression took place outside the school day and from off-campus? If so, different rules should apply — the rules that apply in the world at large, not the special rules that offer students in public schools a diminished form of First Amendment protection. The outer parameters of where speech takes place in school and out of school can be murky as the Supreme Court noted in Frederick v. Morse (2007). In that case, the Court held that an 18-year-old senior who had not shown up at school that day but joined his friends for an school-sanctioned event across the street from the school under faculty supervision was in school for purposes of discipline resulting from his display of a banner that proclaimed "Bong Hits 4 Jesus."
To figure out where Christiansen's speech took place from a constitutional perspective, we'd need to know a lot more details, including: where was Christiansen located – outside but still on the campus or across the street on a public sidewalk? Were there any teachers watching the protesters to ensure order and safety? Had there been any public indications that the school was tacitly allowing the protest?
One thing, however, is crystal clear. If Christiansen was punished for his political views, in an act of "retribution," as the ACLU asserted, the penalty violated his First Amendment rights and would cast an impermissible chill over other students who "'are considering engaging in the political process,'" as the ACLU put it in a letter to school district officials.8
That is exactly the wrong lesson to send to America's invigorated students.
The young people "marching for our lives" today are following our best patriotic traditions.
As we approach the fiftieth anniversary of the assassination of Dr. Martin Luther King, Jr. these outspoken students channel their African-American peers who jumped out of windows and trampled the fence surrounding their segregated Birmingham high school to demand civil rights, in an action that captured the nation's heart and became the Children's Crusade;9 the African-American students in Mississippi whose activism for voting rights following Freedom Summer gave rise to the court cases that provided the model for the test the Supreme Court applied to student speech in Tinker;10 and the students in some 10,000 high schools across the nation who in 1969 walked out to protest the war in Viet Nam, reportedly causing President Nixon to reassess the political costs of escalating military action.11
[1] Ashley Collins,'Welcome to the revolution': Parkland students lead emotional March for Our Lives rally, USA Today, March 24, 2018.
[2] Avery Arapol, White House applauds gun violence protesters for 'exercising their First Amendment rights, The Hill, March 24, 2018.
[3] Vivian Yee & Alan Blinder, National School Walkout: Thousands Protest Against Gun Violence Across the U.S., New York Times, March 14, 2018.
[4] Sarah Gray, Thousands of Students Walked Out of School Today in Nationwide Protests. Here's Why, Time, March 13, 2018.
[5] Avi Seik, A student called his congressman to ask for gun control—and was suspended for cursing, Washington Post, March 20, 2018.
[9] Catherine J. Ross, Lessons in Censorship, pp. 151-152.
[10] Catherine J. Ross, Lessons in Censorship, pp. 152-154.
[11] James Hohman with Breanne Deppisch and Janie Greer, The Daily 202: How the marches for gun control are like the protests against Vietnam, Washington Post, March 26, 2018.
Counter Protests First Amendment Parkland School Campuses Students
Government Corruption, Public Employees' Speech, and the First Amendment
Law Professor Helen Norton explains how a case currently pending for Supreme Court review could potentially expand First Amendment protection for public employees who report on government corruption and or speak as a public "citizen."
Should Supreme Court Opinions Be Televised?
While most sitting Justices have opposed arguments in favor of televising Supreme Court oral arguments, little has been said about broadcasting the announcement of opinions. In their newest essay, First Amendment experts Floyd Abrams and Ronald Collins explore this possibility and the benefits it could offer the public.
Ballard Spahr: Sixth Circuit Sides with 'The New York Times' in Defamation Suit
Reprinted with Permission from Ballard Spahr An article in The New York Times about controversy surrounding an Ohio State University cancer researcher was […]
Ballard Spahr: Second Circuit Affirms That President Trump's Blocking of Opponents on His Twitter Account Violates First Amendment
Reprinted with Permission from Ballard Spahr The U.S. Court of Appeals for the Second Circuit yesterday became the third federal […]


Start your career on the right foot and help sustain our country's natural resources for future generations. Learn more about what it means to work for nature, including information about wages, benefits, and our organization's commitment to diversity. Working for the U.S. Forest Service is a rewarding adventure. Imagine what a job with us could mean for you!
Start the journey to your new career today. View available resources, helpful tips, and a list of required materials you'll need to apply to the U.S. Forest Service.
If you are or have been a temp worker for a land management agency, you can also find more information here about the Land Management Workforce Flexibility Act or check out our Frequently Asked Questions.
Put your skills to work with the U.S. Forest Service. We host hiring and recruitment events for a variety of entry-level and experienced positions.
Please direct questions about career opportunities and applications to Human Resources Management at 1-877-372-7248 (select Option 2 and follow prompts). The Contact Center is open from 7 a.m. to 5 p.m. (MST) Monday through Friday and closed on all federal holidays.


I bet you (or your people) have been on many training courses in the past that, whilst good on the day, failed to make a lasting impression or change. Many of us still have the handouts and workbooks stashed away in our drawers from long forgotten training sessions that have never seen the light of day since. So why didn't the training stick? Why didn't you or your people come bursting back into work making tangible changes and improvements? It's because you need the following essential elements in order to make training really stick.
It's not just about attending the training, anyone can do that and it's just a box ticking exercise. I mean, that the learner knows what improvement is expected of them following the training. Results driven training companies will provide a tool for you to evaluate performance so you know your money was well spent and you have evidence of results.
We know there is little point in JUST giving your people tools for how to give a great sales and service experience. They know what 'great' does and doesn't look like, they see it every day as customers themselves. It has to go deeper than that. They need to understand WHY they WANT to do it. The training should start with this.
I recommend asking when the trainer last sold/negotiated/closed a deal/handled a difficult situation with a customer. I often find when I'm doing my competitor analysis that some trainers haven't been in a sales or service situation for years and find it difficult to relate to the modern customer. They lack credibility with experienced sales and service people as they don't have any recent personal experiences to draw on and struggle with off the cuff questions and situations.
Improved performance in respect of sales and service cannot be measured effectively during training. This happens after when they get back to work. The learner needs to be supported and guided following the training while the learning is embedded. Otherwise fear and reluctance sets in and the changes never happen.
Training, if delivered properly, can always be mapped to results and will provide evidence that is has worked. Anyone can give you a great day in training but that's not enough. Your time and money is valuable so you need to know you have got something in return for your investment.


text:
#include <aws/medialive/model/HlsClientCache.h>
#include <aws/core/utils/HashingUtils.h>
#include <aws/core/Globals.h>
#include <aws/core/utils/EnumParseOverflowContainer.h>

using namespace Aws::Utils;

namespace Aws
{
  namespace MediaLive
  {
    namespace Model
    {
      namespace HlsClientCacheMapper
      {

        static const int DISABLED_HASH = HashingUtils::HashString("DISABLED");
        static const int ENABLED_HASH = HashingUtils::HashString("ENABLED");

        HlsClientCache GetHlsClientCacheForName(const Aws::String& name)
        {
          int hashCode = HashingUtils::HashString(name.c_str());
          if (hashCode == DISABLED_HASH)
          {
            return HlsClientCache::DISABLED;
          }
          else if (hashCode == ENABLED_HASH)
          {
            return HlsClientCache::ENABLED;
          }
          EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
          if(overflowContainer)
          {
            overflowContainer->StoreOverflow(hashCode, name);
            return static_cast<HlsClientCache>(hashCode);
          }

          return HlsClientCache::NOT_SET;
        }

        Aws::String GetNameForHlsClientCache(HlsClientCache enumValue)
        {
          switch(enumValue)
          {
          case HlsClientCache::DISABLED:
            return "DISABLED";
          case HlsClientCache::ENABLED:
            return "ENABLED";
          default:
            EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
            if(overflowContainer)
            {
              return overflowContainer->RetrieveOverflow(static_cast<int>(enumValue));
            }

            return "";
          }
        }

      } // namespace HlsClientCacheMapper
    } // namespace Model
  } // namespace MediaLive
} // namespace Aws


1. T2 is a high voltage flyback transformer salvaged from an old TV, or ordered from Fair Radio Sales (see Where To Get Parts). Look for the biggest, most intimidating transformer you can find. Old tube TV's are a good place to look. The transformer should not have a rectifier built in.
2. You will need to rewind the transformer's primary. First, remove the old primary, being careful not to damage the high voltage secondary. If the transformer is wound with all windings incased in plastic, use another transformer. Second, wind on 5 turns of 18 AWG wire, twist a loop (center tap), and then wind on 5 more turns. This becomes winding C-D. Now, wind on 2 turns of 22 AWG wire, twist a loop, and wind on 2 more turns. This becomes winding A-B.
3. Q1 and Q2 will run HOT if not used with a large heatsink. After the circuit has been running for a minute or two, you should still be able to put your finger on the transistors without being burnt. Also, R1 and R2 will run hot.
4. If you experience arcing on the exposed transformer leads, select a lower voltage for T1. If you are powering the circuit with a power supply (see Power Supply), just crank down the voltage.
5. For a real high voltage output, connect a voltage multiplier (from an old TV or computer monitor) to the output of T2.
6. If the circuit does not work, reverse connections A and B.
7. I finally got around to taking some pictures of the circuit in operation.


We certainly love being creative and taking things a step further in our pictures. With this attitude we started some personal projects that's a pinch self-ironic, these latest images were shot in July 2016.
Florian found a small spot behind our studio in Basel, Switzerland that looked more like a jungle than the typical chocolate alp mountains or sound of music hills you find in Switzerland. A photo sent over to Emil and the idea to make a picture from it was born.
We wanted to do something funny that also could be used as advertising to send out to our current and future clients. So we came up with the story of us loosing our selves in the Jungle in south america and that the photo that would be sent out as a post card from the jungle.
We wanted to do something special this summer so we headed to the jungle for a trip.
The Weather was really good and the food really, lets say, special.
Unfortunately we lost our guide on the second day so we had to share a cave with a gorilla for the rest of the trip. What a nice guy!
Finally back home, hope you had a great vacation. Cant wait to hear what you did.