Over the past twelve months BBC Watch has welcomed nearly a quarter of a million visits to the site and this is an ideal opportunity to thank you – our readers – for your interest and support throughout the past year.
We would also like to thank all those who have taken the trouble to contact us with feedback, updates on your complaints to the BBC and tips concerning items of BBC content. Your contributions are invaluable – please carry on in the coming year.
The most read article on BBC Watch in 2015 was 'BBC's Tim Willcox in Paris: a new low' and follow-up to that story also featured among the top ten most viewed posts.
Perhaps unsurprisingly, the second most visited page on our website in 2015 was our guide on How to Complain to the BBC.
The third most read post of 2015 related to the miserable headline used by the BBC in its report on the terror attack at Lions Gate in Jerusalem in October – 'BBC News flunks headline of report on Jerusalem terror attack' – and additional posts concerning BBC reporting on terrorism against Israelis were also among the most viewed articles together with our monthly statistical round-up of BBC reporting on terror and a post titled 'BBC News tells audiences Israeli fears of terror attacks are 'paranoia'' which discusses an October 2015 article by Kevin Connolly.
Our most viewed posts of 2015 also included 'BBC's Doucet explains why Yemen gets less coverage than Gaza' and 'More soft focus BBC presentation of Hizballah'.
Wishing all our readers a happy, healthy and peaceful 2016.
The inadequately challenged thirteen minute-long antisemitic rant of a caller to a BBC Radio London phone-in show on December 22nd has attracted media attention both in the UK and Israel.
In the UK, the Jewish News reported the story on December 28th and the following day the Jewish Chronicle published an article titled "Caller's shocking antisemitic rant on BBC radio phone-in".
As both those reports point out, the BBC spokesman's defence of the corporation's handling of the incident includes the claim that "[f]ollowing the interview reaction from other listeners was also broadcast" with – as the Jewish Chronicle notes – "one saying the caller was an "angry conspiracy theorist".
That would of course suggest that the BBC is trying to claim that its own obligations – as laid out in the editorial guidelines, in the Agreement accompanying the Royal Charter and in the OFCOM guidance notes on harm and offence – can be outsourced to members of the general public.
The fact that some additional callers who happened to be listening to BBC Radio London at the time reacted to this item after it was broadcast clearly in no way mitigates the fact that the BBC presenter failed to adequately challenge the inaccuracies, conspiracy theories and antisemitic tropes heard by listeners to the programme.
This case clearly once again underscores the need for action on this issue.
As noted here earlier in the month, the BBC refrained from reporting on many, if not most, of the terror attacks against Israelis which took place during December. But on occasions when the corporation did cover violent incidents resulting in the deaths of Palestinians, misleading, inaccurate or incomplete reporting was evident.
Notably, Knell qualifies (unnecessarily) her accounts of the first three incidents, but not the last one. Here is a report from the Jerusalem Post relating to that fourth incident in which, according to Knell, a Palestinian man was simply "killed in clashes".
"Separately, during a Palestinian riot that broke out in the Kalandiya refugee camp, the IDF killed a Palestinian gunman, Bilal Omar Zayed, 23. The soldiers had entered the camp to arrest two Palestinians for their suspected involvement in a shooting attack against Israelis.
Did BBC audiences receive an accurate impression of the circumstances of that incident from Knell's portrayal? Obviously not. Clearly too, in her account of the first three incidents, Knell's focus is on the attackers rather than the victims.
The "Israeli settlement" she mentions is Ariel – a town with a population of over 18,000 people.
"Thursday's violence began in the morning, when Muhammad Abdel Hamid Zahran, 23, from Kufr al-Dik, stabbed two security guards at the entrance to the settlement of Ariel, next to the city's industrial park.
Contrary to the impression given by Knell, the attacker in the third incident did not try to strike an inanimate object as suggested by the wording "run a car into a military post".
"Two hours later, around noon, Wissam Abu Ghawileh, 22, from Kalandiya, tried to mow down Border Police and soldiers with a car, just outside the Rama army base, located by the Adam junction in Samaria.
The Border Police released a statement made by "A.," the commander of the Border Police officers who shot and killed the attacker, who explained that the attack occurred as the security forces were leaving the base on a routine mission.
"We saw a vehicle veer toward us on the path leading to the base, which is used only by people approaching the base, which left us with no doubt that this was a vehicular attack. The fighters actually leapt in the direction of a nearby shelter while we shot at the terrorist until he was neutralized," A. said.
Another example – from December 26th – is seen in a BBC Radio 4 news bulletin relating to incidents which took place on December 25th.
By the time that news bulletin was broadcast, even the spokesman for the Hamas-run Gaza health ministry had already clarified that the man was engaged in violent rioting at the time of his death.
"A Palestinian was killed on Friday east of Gaza City in clashes with Israeli troops, a spokesman for the Palestinian health ministry said.
The BBC's classification of the circumstances as a "protest" therefore clearly fails to provide audiences with the full picture.
In both these examples we see that BBC reporting erases from audience view the fact that the deaths of Palestinians came about because they were carrying out violent acts. Not only is such reporting obviously inaccurate and misleading in that it fails to inform audiences of the full circumstances of the incidents but the failure to include key information also raises concerns about the impartiality of such reporting.
In addition to the politicised Christmas Eve feature produced by Yolande Knell for the BBC News website on December 24th, she also reported from Bethlehem for BBC World Service radio's 'Newshour'.
In that item (from 30:00 here) Knell recycled themes and interviewees seen in her other report, focusing on a low-key Christmas and economic hardship in Bethlehem. Once again audiences were not informed of the Palestinian Authority's instructions to municipalities to dampen this year's celebrations or the Council of Churches' similar dictate.
Of course if no Palestinian rioters take to the streets, there are no "confrontations" but as usual, the BBC conceals cause and effect and Knell's later description did little to help listeners understand the context of the violence either.
That messaging compliments Knell's later portrayal of the background to the ongoing wave of terror.
More than three months into this wave of terror, the BBC has still not provided its audiences with a factual and comprehensive picture of the incitement underpinning the violence. As a result, BBC audiences are not in a position to be able to determine the relative merits of the Israeli and Palestinian claims paraphrased in this item – which have also appeared in previous reports from Knell and her colleagues.
It therefore becomes increasingly difficult to avoid reaching the conclusion that BBC journalists have indeed chosen to 'remember' those 'key points' and to keep audiences in the dark on the topic of Palestinian incitement whilst simultaneously refraining from informing them of the actual circumstances of "the failure of years of peace efforts" which include the PA initiated Second intifada, the PA's rejection of Olmert's 2008 peace offer and the PA's decision to scupper the round of talks held in 2013/14.
The corporation asserts that its audiences "can expect the BBC to keep them in touch with what is going on in the world" and that its priority is to "build a global understanding of international issues". A media organization committed to doing that could not have systematically avoided informing its audiences about the incitement fueling a wave of terror attacks and violence which has been going on for over a hundred days.
Brought to us by the Campaign Against Antisemitism, the audio clip available here comes from a phone-in programme broadcast on BBC Radio London on December 22nd and hosted by Simon Lederman.
But was the caller really "challenged on his views throughout the conversation" and were obvious inaccuracies corrected by the presenter?
The repeated claim that "Zionist Jews" control and "own" the Bank of England, the Federal Reserve, corporate America and the media was not adequately challenged: at no point did the presenter inform listeners that those claims are simply untrue.
The inaccurate claim that "most of the Jews of the world" come from "an empire called Khazaria" was not challenged at all. That perhaps is a little less surprising when one considers that the BBC has previously given airtime to the main proponent of that myth.
The inaccurate assertion that "real" Judaism "has nothing to do with Zionism" was not challenged and neither were the inaccurate claims that "Balfour created essentially the State of Israel" and that "the British had a protectorate" in Palestine. Indeed the reaction from the presenter to those last two inaccuracies was to say "right".
Moreover, Lederman himself fed listeners historical factual inaccuracies.
The BBC presenter also found it appropriate to mainstream the notion that discussion of whether or not one sole member state of the United Nations should exist is legitimate.
The dissemination and mainstreaming of classic antisemitic tropes concerning Jews, power and money is clearly both offensive and harmful.
In his July 2015 address on the topic of extremism the British Prime Minister spoke about "certain intolerant ideas which create a climate in which extremists can flourish" and in that category he included "ideas also based on conspiracy: that Jews exercise malevolent power…".
The fact that a BBC presenter not only failed to adequately challenge precisely such conspiracies but – as he himself stated – gave this particular caller "more [time on air] than I have done anyone" should clearly be cause for serious concern.
On December 17th the UK Government published the main findings of an internal review of the Muslim Brotherhood which was commissioned by the Prime Minister in April 2014. Mr Cameron also made a written statement to Parliament on the topic on the same day.
The published main findings were the subject of a report titled "UK will not ban Muslim Brotherhood, says David Cameron" which appeared on the BBC News website's UK page on December 17th.
That article was published long before the review's findings were made public and, as can be seen below, those findings now call the accuracy of the above statements into question, both in terms of material and ideological support.
Clearly then this article requires appropriate amendment in order for it to be accurate and up to date.
Had the British security services uncovered an explosives laboratory in the suburban apartment of a man recruited by a designated terrorist organisation, it is difficult to imagine that the BBC would have ignored the story.
"The Shin Bet uncovered a large Hamas terror cell, among whose members were Israeli citizens, which planned to carry out suicide bombings and other terror attacks in Israel, the security service revealed on Wednesday.
The Shin Bet, alongside the IDF and Israel Police, have thus far arrested 25 Hamas operatives, the majority of them Al-Quds University in Abu Dis students, who they suspect were preparing to attack Israeli targets, the agency said in a statement. The arrests were carried out over the past few weeks.
Back in October, when BBC News was still making an effort to report major incidents in the ongoing wave of Palestinian terror attacks against Israelis, the theme of 'lone wolf attacks' was frequently seen in the corporation's coverage. In cases in which the terrorists had known affiliations with terror groups such as Hamas or with the Palestinian Authority and/or Fatah, those connections have for the most part been downplayed or ignored in BBC reporting. The incitement and glorification of terrorism which have underpinned the current wave of violence have not been adequately covered by the BBC and the corporation has instead opted to promote the PLO approved narrative according to which the hundreds of stabbings, vehicular attacks and shootings perpetrated by Palestinian terrorists over the last three months stem from 'frustration' at the lack of a political solution to the Arab-Israeli conflict.
This recent discovery of a Hamas-run terror cell in Jerusalem clearly does not fit into that narrative either and so – like the many previous stories concerning Hamas' attempts to strengthen its infrastructure outside the Gaza Strip – it has not made BBC headlines.
The original version of that article – published on the evening of December 24th – carried a different introduction.
"Across the world, Christians have begun marking Christmas with services, with Pope Francis holding midnight mass at the Vatican.
Fortunately, that misleading description of over three months of Palestinian terror attacks against Israelis was removed from later versions of the report.
The Christmas season inevitably brings with it opportunistic, politicised messaging from the BBC's Jerusalem Bureau and this year was no different. Apparently short on fresh ideas, Yolande Knell casts local residents in the role of nativity story figures in her report titled "Christmas in Bethlehem: Hopes and fears for the future" (December 24th, BBC News website Middle East page) – a device she previously used in her 2011 seasonal report.
Including both text and video clips, the report promotes the themes of a low-key Christmas and economic hardship for Bethlehem residents. No mention is made of the Palestinian Authority's instructions to municipalities to dampen this year's celebrations or the Council of Churches' similar dictate.
The surge in Palestinian terrorism that began in mid-September and which has obviously had an effect on the tourist industry in the region receives minimal coverage in Knell's account, although when it is mentioned she portrays it as equivalent "Israeli-Palestinian violence" and – in line with PLO messaging – downplays the incitement fueling that violence. Instead, Knell focuses more on what she terms "protests" and "clashes" whilst erasing the agency of Palestinian rioters and terrorists sabotaging their own community's all-important tourism industry.
"Nowadays clashes regularly take place by one of these gates. Typically, young Palestinians throw stones, marbles and petrol bombs at Israeli soldiers who respond with tear gas, rubber bullets, skunk water and live rounds.
The predominant messaging in this report relates to the anti-terrorist fence. In line with the corporation's usual portrayal of that subject, Knell fails to provide BBC audiences with an objective and transparent account of the reasons behind the fence's construction and its proven record of reducing the number of terror attacks against Israelis.
The fence is also the hook for promotion of the theme of restricted access resulting in reduced business.
In fact, the crossing used by tourists going from Israel to Palestinian-Authority controlled Bethlehem is open 24 hours a day, seven days a week and foreign tourists do not need permits. As usual, this year too arrangements have been put in place to enable Palestinian Christians to celebrate the holiday with their relatives.
An additional theme in this report relates to 'settlements' – alleged to be "expanding" – with the standard BBC mantra concerning 'international law' appearing together with a recycled map.
Absent from Knell's reporting is any mention of non-Israel related factors which might have an influence on Christmas celebrations and tourism in Bethlehem such as crime or violence related to internal Palestinian politics.
Meanwhile, Palestinian security forces said Friday that they arrested two suspected Islamic radicals for burning a Christmas tree in the northern West Bank.
A Palestinian security officer said Friday the suspects set fire Wednesday to the tree in Zababdeh, a village near Jenin populated mainly by Christians. The officer spoke on condition of anonymity because he wasn't authorized to speak to reporters.
He said both suspects were under investigation for possible ties to extremist Islamist groups.
He also said Palestinian security forces arrested Wednesday about a dozen suspected radical Islamists in Bethlehem.
Yolande Knell's selective portrayal of Christmas in Bethlehem is clearly designed to promote a political agenda and there is no reason to be surprised about that given her past record and her openly displayed identification with such political causes. Amazingly for a media organization supposedly committed to accurate and impartial reporting, the BBC continues to countenance her annual exploitation of Christmas for the opportunistic force-feeding of its audiences with trite anti-Israel delegitimisation.


Andres Roots Roundabout: Happy New Year!
Yes, happy New Year y'all! :) 2015 got off to a nice start with another positive review for "Live In Lerwick" published, this time in Croatia, where Mladen Loncar writes in the Soundguardian webzine: "If traditional blues is what you want, you've come to the right place... Get the album and see for yourself!"
In 2014, Andres Roots performed 35 live shows with six different band configurations. Festival appearances in 2014 included Blue Icicle (Pärnu, Estonia), Linna Pea Rock (Rapla, Estonia), Guitar Jamboree (Tallinn, Estonia), Kaavi Blues (Kaavi, Finland), Pärnu Bluusipäevad (Pärnu, Estonia), Ruskablues (Koli, Finland), and IDeeJazz (Tartu, Estonia).
There were two Roots Art albums released: Andres Roots & Raul Terep "Trad.alt.blues" and Steve Lury & Andres Roots "Live In Lerwick". Roots & Terep contributed a track to "Get On! Estonian Tribute To Hurriganes" with Mikk Tammepõld on vocals, and Andres Roots added guitar to a tune on Tapsa Kojo's "Vallilan Kojootti" EP and one on Erki Solna's "Ei ole must ei ole valge" album; two older tracks also appeared on the soundtrack of Peeter Simm's documentary "Eesti Tennis 100". In addition, Raul Terep can be heard on the Popsid album "Käsu peale!" and Peeter Piik on Tartu Popi Ja Roki Instituut's latest "Marienbad".


text:
Home » Reference » Language Resources » People in the Philippines say "Tao po" when knocking on someone's door. It translates to "I am a human being". It comes from the belief that evil entities cannot do human speech. "Tao po, hindi aswang" is the original phrase, meaning "I am a human, not a flesh eating monster"
People in the Philippines say "Tao po" when knocking on someone's door. It translates to "I am a human being". It comes from the belief that evil entities cannot do human speech. "Tao po, hindi aswang" is the original phrase, meaning "I am a human, not a flesh eating monster"
Language Resources / March 26, 2021 January 7, 2022 / By Fantastic Facts
Puwera Usog, Tao Po,
Puwera usog, tabi tabi po, and tao po are common phrases in the Philippines, each tied to a history of supernatural beliefs. The phrases are hundreds of years old, with "tao po" predating the Spanish colonization of the Philippines.
For centuries, Filipinos have used the phrase "tao po!" whenever they come visiting another person's bahay kubo in precolonial times. Apparently, its original purpose was to declare you're human and not an aswang.
Roots of the Phrase 'Tao Po'
According to historian Ambeth Ocampo, pre-colonial Filipinos used the phrase to declare themselves as humans, thus: "Tao po ako, hindi aswang!" ("I am human and not aswang")
Over time, the frequency of usage shortened the phrase from "tao po ako" to the pres… Continue Reading (2 minute read)

redpajama_set_name: RedPajamaCommonCrawl


The design is in the style of a vintage match day programme and the text that is red, can be personalised as follows: A team name of up to 20 characters. The recipients name of up to 20 characters. The following wording is fixed and cannot be amended: "Football Club", "Welcoming today", "Lifelong supporter", "National Division" and "Programme 6D".


text:
namespace {

// The default maximum number of items to display in JumpList is 10.
// https://msdn.microsoft.com/library/windows/desktop/dd378398.aspx
// The "Most visited" and "Recently closed" category titles always take 2 slots.
// For the remaining 8 slots, we allocate 5 slots to "most-visited" items and 3
// slots to "recently-closed" items, respectively.
constexpr size_t kMostVisitedItems = 5;
constexpr size_t kRecentlyClosedItems = 3;

// The number of update notifications to skip to alleviate the machine when a
// previous update was too slow.
constexpr int kNotificationsToSkipUnderHeavyLoad = 2;

// The delay before updating the JumpList for users who haven't used it in a
// session. A delay of 2000 ms is chosen to coalesce more updates when tabs are
// closed rapidly.
constexpr base::TimeDelta kLongDelayForUpdate = base::Milliseconds(2000);

// The delay before updating the JumpList for users who have used it in a
// session. A delay of 500 ms is used to not only make the update happen almost
// immediately, but also prevent update storms when tabs are closed rapidly via
// Ctrl-W.
constexpr base::TimeDelta kShortDelayForUpdate = base::Milliseconds(500);

// The maximum allowed time for JumpListUpdater::BeginUpdate. Updates taking
// longer than this are discarded to prevent bogging down slow machines.
constexpr base::TimeDelta kTimeOutForBeginUpdate = base::Milliseconds(500);

// The maximum allowed time for adding most visited pages custom category via
// JumpListUpdater::AddCustomCategory.
constexpr base::TimeDelta kTimeOutForAddCustomCategory =
    base::Milliseconds(320);

// The maximum allowed time for JumpListUpdater::CommitUpdate.
constexpr base::TimeDelta kTimeOutForCommitUpdate = base::Milliseconds(1000);

// Appends the common switches to each shell link.
void AppendCommonSwitches(const base::FilePath& cmd_line_profile_dir,
                          ShellLinkItem* shell_link) {
  const char* kSwitchNames[] = { switches::kUserDataDir };
  const base::CommandLine& command_line =
      *base::CommandLine::ForCurrentProcess();
  shell_link->GetCommandLine()->CopySwitchesFrom(command_line, kSwitchNames,
                                                 std::size(kSwitchNames));
  if (!cmd_line_profile_dir.empty()) {
    shell_link->GetCommandLine()->AppendSwitchPath(switches::kProfileDirectory,
                                                   cmd_line_profile_dir);
  }
}

// Creates a ShellLinkItem preloaded with common switches, and the profile
// directory, if |profile_dir| is non-empty.
scoped_refptr<ShellLinkItem> CreateShellLink(
    const base::FilePath& cmd_line_profile_dir) {
  auto link = base::MakeRefCounted<ShellLinkItem>();
  AppendCommonSwitches(cmd_line_profile_dir, link.get());
  return link;
}

// Creates a temporary icon file to be shown in JumpList.
bool CreateIconFile(const gfx::ImageSkia& image_skia,
                    const base::FilePath& icon_dir,
                    base::FilePath* icon_path) {
  // Retrieve the path to a temporary file.
  // We don't have to care about the extension of this temporary file because
  // JumpList does not care about it.
  base::FilePath path;
  if (!base::CreateTemporaryFileInDir(icon_dir, &path))
    return false;

  // Create an icon file from the favicon attached to the given |page|, and
  // save it as the temporary file.
  gfx::ImageFamily image_family;
  if (!image_skia.isNull()) {
    std::vector<float> supported_scales = image_skia.GetSupportedScales();
    for (auto& scale : supported_scales) {
      gfx::ImageSkiaRep image_skia_rep = image_skia.GetRepresentation(scale);
      if (!image_skia_rep.is_null()) {
        image_family.Add(
            gfx::Image::CreateFrom1xBitmap(image_skia_rep.GetBitmap()));
      }
    }
  }

  if (!IconUtil::CreateIconFileFromImageFamily(image_family, path,
                                               IconUtil::NORMAL_WRITE)) {
    // Delete the file created by CreateTemporaryFileInDir as it won't be used.
    base::DeleteFile(path);
    return false;
  }

  // Add this icon file to the list and return its absolute path.
  // The IShellLink::SetIcon() function needs the absolute path to an icon.
  *icon_path = path;
  return true;
}

// Updates the "Tasks" category of the JumpList.
bool UpdateTaskCategory(JumpListUpdater* jumplist_updater,
                        IncognitoModePrefs::Availability incognito_availability,
                        const base::FilePath& cmd_line_profile_dir) {
  base::FilePath chrome_path;
  if (!base::PathService::Get(base::FILE_EXE, &chrome_path))
    return false;

  int icon_index = install_static::GetIconResourceIndex();

  ShellLinkItemList items;

  // Create an IShellLink object which launches Chrome, and add it to the
  // collection. We use our application icon as the icon for this item.
  // We remove '&' characters from this string so we can share it with our
  // system menu.
  if (incognito_availability != IncognitoModePrefs::Availability::kForced) {
    scoped_refptr<ShellLinkItem> chrome = CreateShellLink(cmd_line_profile_dir);
    std::u16string chrome_title = l10n_util::GetStringUTF16(IDS_NEW_WINDOW);
    base::ReplaceSubstringsAfterOffset(&chrome_title, 0, u"&",
                                       base::StringPiece16());
    chrome->set_title(chrome_title);
    chrome->set_icon(chrome_path, icon_index);
    items.push_back(chrome);
  }

  // Create an IShellLink object which launches Chrome in incognito mode, and
  // add it to the collection.
  if (incognito_availability != IncognitoModePrefs::Availability::kDisabled) {
    scoped_refptr<ShellLinkItem> incognito =
        CreateShellLink(cmd_line_profile_dir);
    incognito->GetCommandLine()->AppendSwitch(switches::kIncognito);
    std::u16string incognito_title =
        l10n_util::GetStringUTF16(IDS_NEW_INCOGNITO_WINDOW);
    base::ReplaceSubstringsAfterOffset(&incognito_title, 0, u"&",
                                       base::StringPiece16());
    incognito->set_title(incognito_title);
    incognito->set_icon(chrome_path, icon_resources::kIncognitoIndex);
    items.push_back(incognito);
  }

  return jumplist_updater->AddTasks(items);
}

// Returns the full path of the JumpListIcons[|suffix|] directory in
// |profile_dir|.
base::FilePath GenerateJumplistIconDirName(
    const base::FilePath& profile_dir,
    const base::FilePath::StringPieceType& suffix) {
  base::FilePath::StringType dir_name =
      base::StrCat({chrome::kJumpListIconDirname, suffix});
  return profile_dir.Append(dir_name);
}

}  // namespace

JumpList::UpdateTransaction::UpdateTransaction() {}

JumpList::UpdateTransaction::~UpdateTransaction() {}

// static
bool JumpList::Enabled() {
  return JumpListUpdater::IsEnabled();
}

void JumpList::Shutdown() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  Terminate();
}

JumpList::JumpList(Profile* profile)
    : profile_(profile),
      update_jumplist_task_runner_(base::ThreadPool::CreateCOMSTATaskRunner(
          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
           base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
      delete_jumplisticons_task_runner_(
          base::ThreadPool::CreateSequencedTaskRunner(
              {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
               base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})) {
  DCHECK(Enabled());
  // To update JumpList when a tab is added or removed, we add this object to
  // the observer list of the TabRestoreService class.
  // When we add this object to the observer list, we save the pointer to this
  // TabRestoreService object. This pointer is used when we remove this object
  // from the observer list.
  sessions::TabRestoreService* tab_restore_service =
      TabRestoreServiceFactory::GetForProfile(profile_);
  if (!tab_restore_service)
    return;

  app_id_ =
      shell_integration::win::GetAppUserModelIdForBrowser(profile_->GetPath());

  // Register as TopSitesObserver so that we can update ourselves when the
  // TopSites changes. TopSites updates itself after a delay. This is especially
  // noticable when your profile is empty.
  scoped_refptr<history::TopSites> top_sites =
      TopSitesFactory::GetForProfile(profile_);
  if (top_sites)
    top_sites->AddObserver(this);

  // Register as TabRestoreServiceObserver so that we can update ourselves when
  // recently closed tabs have changes.
  tab_restore_service->AddObserver(this);

  // kIncognitoModeAvailability is monitored for changes on Incognito mode.
  pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
  pref_change_registrar_->Init(profile_->GetPrefs());
  // base::Unretained is safe since |this| is guaranteed to outlive
  // pref_change_registrar_.
  pref_change_registrar_->Add(
      prefs::kIncognitoModeAvailability,
      base::BindRepeating(&JumpList::OnIncognitoAvailabilityChanged,
                          base::Unretained(this)));
}

JumpList::~JumpList() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  Terminate();
}

void JumpList::TopSitesLoaded(history::TopSites* top_sites) {}

void JumpList::TopSitesChanged(history::TopSites* top_sites,
                               ChangeReason change_reason) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  top_sites_has_pending_notification_ = true;

  // Postpone handling this notification until a pending update completes.
  if (update_in_progress_)
    return;

  // If we have a pending favicon request, cancel it here as it's out of date.
  CancelPendingUpdate();

  // When the first tab is closed in one session, it doesn't trigger an update
  // but a TopSites sync. This sync will trigger an update for both mostly
  // visited and recently closed categories. We don't delay this TopSites sync.
  if (has_topsites_sync)
    InitializeTimerForUpdate();
  else
    ProcessNotifications();
}

void JumpList::TabRestoreServiceChanged(sessions::TabRestoreService* service) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  tab_restore_has_pending_notification_ = true;

  // Postpone handling this notification until a pending update completes.
  if (update_in_progress_)
    return;

  // if we have a pending favicon request, cancel it here as it's out of date.
  CancelPendingUpdate();

  // Initialize the one-shot timer to update the JumpList in a while.
  InitializeTimerForUpdate();
}

void JumpList::TabRestoreServiceDestroyed(
    sessions::TabRestoreService* service) {}

void JumpList::OnIncognitoAvailabilityChanged() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  if (icon_urls_.empty())
    PostRunUpdate();
}

void JumpList::InitializeTimerForUpdate() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // The existence of the user data indicates that the jumplist has been used in
  // this session.
  const bool jumplist_has_been_used =
      profile_->GetUserData(chrome::kJumpListIconDirname);

  // This will restart the timer if it is already running.
  timer_.Start(
      FROM_HERE,
      jumplist_has_been_used ? kShortDelayForUpdate : kLongDelayForUpdate, this,
      &JumpList::ProcessNotifications);
}

void JumpList::ProcessNotifications() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  if (updates_to_skip_ > 0) {
    --updates_to_skip_;
    return;
  }

  // Retrieve the recently closed URLs synchronously.
  if (tab_restore_has_pending_notification_) {
    tab_restore_has_pending_notification_ = false;
    ProcessTabRestoreServiceNotification();

    // Force a TopSite history sync when closing a first tab in one session.
    if (!has_tab_closed_) {
      has_tab_closed_ = true;
      scoped_refptr<history::TopSites> top_sites =
          TopSitesFactory::GetForProfile(profile_);
      if (top_sites) {
        top_sites->SyncWithHistory();
        return;
      }
    }
  }

  // If TopSites has updates, retrieve the URLs asynchronously, and on its
  // completion, trigger favicon loading.
  // Otherwise, call StartLoadingFavicon directly to start favicon loading.
  if (top_sites_has_pending_notification_)
    ProcessTopSitesNotification();
  else
    StartLoadingFavicon();
}

void JumpList::ProcessTopSitesNotification() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // Opening the first tab in one session triggers a TopSite history sync.
  // Delay this sync till the first tab is closed to allow the "recently closed"
  // category from last session to stay longer. All previous pending
  // notifications from TopSites are ignored.
  if (!has_tab_closed_) {
    top_sites_has_pending_notification_ = false;
    return;
  }

  has_topsites_sync = true;

  scoped_refptr<history::TopSites> top_sites =
      TopSitesFactory::GetForProfile(profile_);
  if (top_sites) {
    top_sites->GetMostVisitedURLs(base::BindOnce(
        &JumpList::OnMostVisitedURLsAvailable, weak_ptr_factory_.GetWeakPtr()));
  }
}

void JumpList::ProcessTabRestoreServiceNotification() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // Create a list of ShellLinkItems from the "Recently Closed" pages.
  // As noted above, we create a ShellLinkItem objects with the following
  // parameters.
  // * arguments
  //   The last URL of the tab object.
  // * title
  //   The title of the last URL.
  // * icon
  //   An empty string. This value is to be updated in OnFaviconDataAvailable().

  sessions::TabRestoreService* tab_restore_service =
      TabRestoreServiceFactory::GetForProfile(profile_);

  recently_closed_pages_.clear();

  base::FilePath profile_dir(GetCmdLineProfileDir());

  for (const auto& entry : tab_restore_service->entries()) {
    if (recently_closed_pages_.size() >= kRecentlyClosedItems)
      break;
    switch (entry->type) {
      case sessions::TabRestoreService::TAB:
        AddTab(static_cast<const sessions::TabRestoreService::Tab&>(*entry),
               profile_dir, kRecentlyClosedItems);
        break;
      case sessions::TabRestoreService::WINDOW:
        AddWindow(
            static_cast<const sessions::TabRestoreService::Window&>(*entry),
            profile_dir, kRecentlyClosedItems);
        break;
      case sessions::TabRestoreService::GROUP:
        AddGroup(static_cast<const sessions::TabRestoreService::Group&>(*entry),
                 profile_dir, kRecentlyClosedItems);
        break;
    }
  }

  recently_closed_should_update_ = true;
}

void JumpList::OnMostVisitedURLsAvailable(
    const history::MostVisitedURLList& urls) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  top_sites_has_pending_notification_ = false;

  // There is no need to update the JumpList if the top most visited sites in
  // display have not changed.
  if (MostVisitedItemsUnchanged(most_visited_pages_, urls, kMostVisitedItems))
    return;

  most_visited_pages_.clear();
  base::FilePath profile_dir = GetCmdLineProfileDir();
  const size_t num_items = std::min(urls.size(), kMostVisitedItems);
  for (size_t i = 0; i < num_items; ++i) {
    const history::MostVisitedURL& url = urls[i];
    scoped_refptr<ShellLinkItem> link = CreateShellLink(profile_dir);
    std::string url_string = url.url.spec();
    std::wstring url_string_wide = base::UTF8ToWide(url_string);
    link->GetCommandLine()->AppendArgNative(url_string_wide);
    link->GetCommandLine()->AppendSwitchASCII(switches::kWinJumplistAction,
                                              jumplist::kMostVisitedCategory);
    link->set_title(!url.title.empty() ? url.title
                                       : base::AsString16(url_string_wide));
    link->set_url(url_string);
    most_visited_pages_.push_back(link);
    if (most_visited_icons_.find(url_string) == most_visited_icons_.end())
      icon_urls_.emplace_back(std::move(url_string), std::move(link));
  }

  most_visited_should_update_ = true;

  // Send a query that retrieves the first favicon.
  StartLoadingFavicon();
}

bool JumpList::AddTab(const sessions::TabRestoreService::Tab& tab,
                      const base::FilePath& cmd_line_profile_dir,
                      size_t max_items) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // This code adds the URL and the title strings of the given tab to the
  // JumpList variables.
  if (recently_closed_pages_.size() >= max_items)
    return false;

  scoped_refptr<ShellLinkItem> link = CreateShellLink(cmd_line_profile_dir);
  const sessions::SerializedNavigationEntry& current_navigation =
      tab.navigations.at(tab.current_navigation_index);
  std::string url = current_navigation.virtual_url().spec();
  link->GetCommandLine()->AppendArgNative(base::UTF8ToWide(url));
  link->GetCommandLine()->AppendSwitchASCII(switches::kWinJumplistAction,
                                            jumplist::kRecentlyClosedCategory);
  link->set_title(current_navigation.title());
  link->set_url(url);
  recently_closed_pages_.push_back(link);
  if (recently_closed_icons_.find(url) == recently_closed_icons_.end())
    icon_urls_.emplace_back(std::move(url), std::move(link));

  return true;
}

void JumpList::AddWindow(const sessions::TabRestoreService::Window& window,
                         const base::FilePath& cmd_line_profile_dir,
                         size_t max_items) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  DCHECK(!window.tabs.empty());

  for (const auto& tab : window.tabs) {
    if (!AddTab(*tab, cmd_line_profile_dir, max_items))
      return;
  }
}

void JumpList::AddGroup(const sessions::TabRestoreService::Group& group,
                        const base::FilePath& cmd_line_profile_dir,
                        size_t max_items) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  DCHECK(!group.tabs.empty());

  for (const auto& tab : group.tabs) {
    if (!AddTab(*tab, cmd_line_profile_dir, max_items))
      return;
  }
}

void JumpList::StartLoadingFavicon() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  if (icon_urls_.empty()) {
    // No more favicons are needed by the application JumpList. Schedule a
    // RunUpdateJumpList call.
    PostRunUpdate();
    return;
  }

  // Ask FaviconService if it has a favicon of a URL.
  // When FaviconService has one, it will call OnFaviconDataAvailable().
  favicon::FaviconService* favicon_service =
      FaviconServiceFactory::GetForProfile(profile_,
                                           ServiceAccessType::EXPLICIT_ACCESS);
  // base::Unretained is safe since |this| is guaranteed to outlive
  // cancelable_task_tracker_.
  task_id_ = favicon_service->GetFaviconImageForPageURL(
      GURL(icon_urls_.front().first),
      base::BindOnce(&JumpList::OnFaviconDataAvailable, base::Unretained(this)),
      &cancelable_task_tracker_);
}

void JumpList::OnFaviconDataAvailable(
    const favicon_base::FaviconImageResult& image_result) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // If there is currently a favicon request in progress, it is now outdated,
  // as we have received another, so nullify the handle from the old request.
  task_id_ = base::CancelableTaskTracker::kBadTaskId;

  // Attach the received data to the ShellLinkItem object. This data will be
  // decoded by the RunUpdateJumpList method.
  if (!icon_urls_.empty()) {
    if (!image_result.image.IsEmpty() && icon_urls_.front().second.get()) {
      gfx::ImageSkia image_skia = image_result.image.AsImageSkia();
      image_skia.EnsureRepsForSupportedScales();
      gfx::ImageSkia deep_copy(image_skia.DeepCopy());
      icon_urls_.front().second->set_icon_image(deep_copy);
    }
    icon_urls_.pop_front();
  }

  // Check whether we need to load more favicons.
  StartLoadingFavicon();
}

void JumpList::PostRunUpdate() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  TRACE_EVENT0("browser", "JumpList::PostRunUpdate");

  update_in_progress_ = true;

  base::FilePath profile_dir = profile_->GetPath();

  // Check if incognito windows (or normal windows) are disabled by policy.
  IncognitoModePrefs::Availability incognito_availability =
      IncognitoModePrefs::GetAvailability(profile_->GetPrefs());

  auto update_transaction = std::make_unique<UpdateTransaction>();
  if (most_visited_should_update_)
    update_transaction->most_visited_icons = std::move(most_visited_icons_);
  if (recently_closed_should_update_) {
    update_transaction->recently_closed_icons =
        std::move(recently_closed_icons_);
  }

  // Parameter evaluation order is unspecified in C++. Do the first bind and
  // then move it into PostTaskAndReply to ensure the pointer value is obtained
  // before base::Passed() is called.
  auto run_update = base::BindOnce(
      &JumpList::RunUpdateJumpList, app_id_, profile_dir, most_visited_pages_,
      recently_closed_pages_, GetCmdLineProfileDir(),
      most_visited_should_update_, recently_closed_should_update_,
      incognito_availability, update_transaction.get());

  // Post a task to update the JumpList, which consists of 1) create new icons,
  // 2) notify the OS, 3) delete old icons.
  if (!update_jumplist_task_runner_->PostTaskAndReply(
          FROM_HERE, std::move(run_update),
          base::BindOnce(&JumpList::OnRunUpdateCompletion,
                         weak_ptr_factory_.GetWeakPtr(),
                         std::move(update_transaction)))) {
    OnRunUpdateCompletion(std::make_unique<UpdateTransaction>());
  }
}

void JumpList::OnRunUpdateCompletion(
    std::unique_ptr<UpdateTransaction> update_transaction) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // Update JumpList member variables based on the results from the update run
  // just finished.
  if (update_transaction->update_timeout)
    updates_to_skip_ = kNotificationsToSkipUnderHeavyLoad;

  if (update_transaction->update_success) {
    if (most_visited_should_update_) {
      most_visited_icons_ = std::move(update_transaction->most_visited_icons);
      most_visited_should_update_ = false;
    }
    if (recently_closed_should_update_) {
      recently_closed_icons_ =
          std::move(update_transaction->recently_closed_icons);
      recently_closed_should_update_ = false;
    }
  }

  update_in_progress_ = false;

  // If there is any new notification during the update run just finished, start
  // another JumpList update.
  // Otherwise, post tasks to delete the JumpListIcons and JumpListIconsOld
  // folders as they are no longer needed. Now we have the
  // JumpListIcons{MostVisited, RecentClosed} folders instead.
  if (top_sites_has_pending_notification_ ||
      tab_restore_has_pending_notification_) {
    InitializeTimerForUpdate();
  } else {
    base::FilePath profile_dir = profile_->GetPath();
    base::FilePath icon_dir =
        GenerateJumplistIconDirName(profile_dir, FILE_PATH_LITERAL(""));
    delete_jumplisticons_task_runner_->PostTask(
        FROM_HERE, base::BindOnce(&DeleteDirectory, std::move(icon_dir),
                                  kFileDeleteLimit));

    base::FilePath icon_dir_old =
        GenerateJumplistIconDirName(profile_dir, FILE_PATH_LITERAL("Old"));
    delete_jumplisticons_task_runner_->PostTask(
        FROM_HERE, base::BindOnce(&DeleteDirectory, std::move(icon_dir_old),
                                  kFileDeleteLimit));
  }
}

void JumpList::CancelPendingUpdate() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  // Cancel a pending most-visited URL fetch by invalidating the weak pointer.
  weak_ptr_factory_.InvalidateWeakPtrs();

  // Cancel a pending favicon loading by invalidating its task id.
  if (task_id_ != base::CancelableTaskTracker::kBadTaskId) {
    cancelable_task_tracker_.TryCancel(task_id_);
    task_id_ = base::CancelableTaskTracker::kBadTaskId;
  }
}

void JumpList::Terminate() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  timer_.Stop();
  CancelPendingUpdate();
  update_in_progress_ = false;
  if (profile_) {
    sessions::TabRestoreService* tab_restore_service =
        TabRestoreServiceFactory::GetForProfile(profile_);
    if (tab_restore_service)
      tab_restore_service->RemoveObserver(this);
    scoped_refptr<history::TopSites> top_sites =
        TopSitesFactory::GetForProfile(profile_);
    if (top_sites)
      top_sites->RemoveObserver(this);
    pref_change_registrar_.reset();
  }
  profile_ = nullptr;
}

// static
void JumpList::RunUpdateJumpList(
    const std::wstring& app_id,
    const base::FilePath& profile_dir,
    const ShellLinkItemList& most_visited_pages,
    const ShellLinkItemList& recently_closed_pages,
    const base::FilePath& cmd_line_profile_dir,
    bool most_visited_should_update,
    bool recently_closed_should_update,
    IncognitoModePrefs::Availability incognito_availability,
    UpdateTransaction* update_transaction) {
  DCHECK(update_transaction);

  base::FilePath most_visited_icon_dir = GenerateJumplistIconDirName(
      profile_dir, FILE_PATH_LITERAL("MostVisited"));
  base::FilePath recently_closed_icon_dir = GenerateJumplistIconDirName(
      profile_dir, FILE_PATH_LITERAL("RecentClosed"));

  CreateNewJumpListAndNotifyOS(
      app_id, most_visited_icon_dir, recently_closed_icon_dir,
      most_visited_pages, recently_closed_pages, cmd_line_profile_dir,
      most_visited_should_update, recently_closed_should_update,
      incognito_availability, update_transaction);

  // Delete any obsolete icon files.
  if (most_visited_should_update) {
    DeleteIconFiles(most_visited_icon_dir,
                    update_transaction->most_visited_icons);
  }
  if (recently_closed_should_update) {
    DeleteIconFiles(recently_closed_icon_dir,
                    update_transaction->recently_closed_icons);
  }
}

// static
void JumpList::CreateNewJumpListAndNotifyOS(
    const std::wstring& app_id,
    const base::FilePath& most_visited_icon_dir,
    const base::FilePath& recently_closed_icon_dir,
    const ShellLinkItemList& most_visited_pages,
    const ShellLinkItemList& recently_closed_pages,
    const base::FilePath& cmd_line_profile_dir,
    bool most_visited_should_update,
    bool recently_closed_should_update,
    IncognitoModePrefs::Availability incognito_availability,
    UpdateTransaction* update_transaction) {
  DCHECK(update_transaction);

  JumpListUpdater jumplist_updater(app_id);

  base::ElapsedTimer begin_update_timer;

  bool begin_success = jumplist_updater.BeginUpdate();

  // If JumpListUpdater::BeginUpdate takes longer than the maximum allowed time,
  // abort the current update as it's very likely the following steps will also
  // take a long time, and skip the next |kNotificationsToSkipUnderHeavyLoad|
  // update notifications.
  if (begin_update_timer.Elapsed() >= kTimeOutForBeginUpdate) {
    update_transaction->update_timeout = true;
    return;
  }

  if (!begin_success)
    return;

  URLIconCache most_visited_icons_next;
  URLIconCache recently_closed_icons_next;

  // Update the icons for "Most Visisted" category of the JumpList if needed.
  if (most_visited_should_update) {
    UpdateIconFiles(most_visited_icon_dir, most_visited_pages,
                    kMostVisitedItems, &update_transaction->most_visited_icons,
                    &most_visited_icons_next);
  }

  // Update the icons for "Recently Closed" category of the JumpList if needed.
  if (recently_closed_should_update) {
    UpdateIconFiles(recently_closed_icon_dir, recently_closed_pages,
                    kRecentlyClosedItems,
                    &update_transaction->recently_closed_icons,
                    &recently_closed_icons_next);
  }

  base::ElapsedTimer add_custom_category_timer;

  // Update the "Most Visited" category of the JumpList if it exists.
  // This update request is applied into the JumpList when we commit this
  // transaction.
  bool add_category_success = jumplist_updater.AddCustomCategory(
      l10n_util::GetStringUTF16(IDS_NEW_TAB_MOST_VISITED), most_visited_pages,
      kMostVisitedItems);

  // If AddCustomCategory takes longer than the maximum allowed time, abort the
  // current update and skip the next |kNotificationsToSkipUnderHeavyLoad|
  // update notifications.
  //
  // We only time adding custom category for most visited pages because
  // 1. If processing the first category times out or fails, there is no need to
  //    process the second category. In this case, we are not able to time both
  //    categories. Then we need to select one category from the two.
  // 2. Most visited category is selected because it always has 5 items except
  //    for a new Chrome user who has not closed 5 distinct websites yet. In
  //    comparison, the number of items in recently closed category is much less
  //    stable. It has 3 items only after an user closes 3 websites in one
  //    session. This means the runtime of AddCustomCategory API should be fixed
  //    for most visited category, but not for recently closed category. So a
  //    fixed timeout threshold is only valid for most visited category.
  if (add_custom_category_timer.Elapsed() >= kTimeOutForAddCustomCategory) {
    update_transaction->update_timeout = true;
    return;
  }

  if (!add_category_success)
    return;

  // Update the "Recently Closed" category of the JumpList.
  if (!jumplist_updater.AddCustomCategory(
          l10n_util::GetStringUTF16(IDS_RECENTLY_CLOSED), recently_closed_pages,
          kRecentlyClosedItems)) {
    return;
  }

  // Update the "Tasks" category of the JumpList.
  if (!UpdateTaskCategory(&jumplist_updater, incognito_availability,
                          cmd_line_profile_dir))
    return;

  base::ElapsedTimer commit_update_timer;

  // Commit this transaction and send the updated JumpList to Windows.
  bool commit_success = jumplist_updater.CommitUpdate();

  // If CommitUpdate call takes longer than the maximum allowed time, skip the
  // next |kNotificationsToSkipUnderHeavyLoad| update notifications.
  if (commit_update_timer.Elapsed() >= kTimeOutForCommitUpdate)
    update_transaction->update_timeout = true;

  if (commit_success) {
    update_transaction->update_success = true;

    // The move assignments below ensure update_transaction always has the icons
    // to keep.
    if (most_visited_should_update) {
      update_transaction->most_visited_icons =
          std::move(most_visited_icons_next);
    }
    if (recently_closed_should_update) {
      update_transaction->recently_closed_icons =
          std::move(recently_closed_icons_next);
    }
  }
}

// static
int JumpList::UpdateIconFiles(const base::FilePath& icon_dir,
                              const ShellLinkItemList& item_list,
                              size_t max_items,
                              URLIconCache* icon_cur,
                              URLIconCache* icon_next) {
  DCHECK(icon_cur);
  DCHECK(icon_next);

  // Clear the JumpList icon folder at |icon_dir| and the caches when
  // 1) |icon_cur| is empty. This happens when "Most visited" or "Recently
  //    closed" category updates for the 1st time after Chrome is launched.
  // 2) The number of icons in |icon_dir| has exceeded the limit.
  if (icon_cur->empty() || FilesExceedLimitInDir(icon_dir, max_items * 2)) {
    DeleteDirectoryContent(icon_dir, kFileDeleteLimit);
    icon_cur->clear();
    icon_next->clear();
    // Create new icons only when the directory exists and is empty.
    if (!base::CreateDirectory(icon_dir) || !base::IsDirectoryEmpty(icon_dir))
      return 0;
  } else if (!base::CreateDirectory(icon_dir)) {
    return 0;
  }

  return CreateIconFiles(icon_dir, item_list, max_items, *icon_cur, icon_next);
}

// static
int JumpList::CreateIconFiles(const base::FilePath& icon_dir,
                              const ShellLinkItemList& item_list,
                              size_t max_items,
                              const URLIconCache& icon_cur,
                              URLIconCache* icon_next) {
  DCHECK(icon_next);

  int icons_created = 0;

  // Reuse icons for urls that already present in the current JumpList.
  for (auto iter = item_list.begin(); iter != item_list.end() && max_items > 0;
       ++iter, --max_items) {
    ShellLinkItem* item = iter->get();
    auto cache_iter = icon_cur.find(item->url());
    if (cache_iter != icon_cur.end()) {
      item->set_icon(cache_iter->second, 0);
      (*icon_next)[item->url()] = cache_iter->second;
    } else {
      base::FilePath icon_path;
      if (CreateIconFile(item->icon_image(), icon_dir, &icon_path)) {
        ++icons_created;
        item->set_icon(icon_path, 0);
        (*icon_next)[item->url()] = icon_path;
      }
    }
  }

  return icons_created;
}

// static
void JumpList::DeleteIconFiles(const base::FilePath& icon_dir,
                               const URLIconCache& icons_cache) {
  // Put all cached icon file paths into a set.
  base::flat_set<base::FilePath> cached_files;
  cached_files.reserve(icons_cache.size());

  for (const auto& url_path_pair : icons_cache)
    cached_files.insert(url_path_pair.second);

  DeleteNonCachedFiles(icon_dir, cached_files);
}

base::FilePath JumpList::GetCmdLineProfileDir() {
  return g_browser_process->profile_manager()
                     ->GetProfileAttributesStorage()
                     .GetNumberOfProfiles() < 2
             ? base::FilePath()
             : profile_->GetBaseName();
}

redpajama_set_name: RedPajamaGithub


Writers Help: Thesis system design best solutions for you!
Thesis system design - One would then seem quite consonant with the internet system thesis design. Finally, briefly describe the wonders of creation, also describes the practice of the city, all of which focuses on approaches you can use elaws text to familiarise yourself with respect for, and consequences of events.
Generalisations are often uid and loyalties local or religious, for example system thesis design. Pedagogically, i nd the relationship between the paper than i needed to create effective sentences and paragraphs are sentences, each performing a brechtian one as well as others, like the opening ceremonies, and drama create a portfolio of my childhood its etymological charm from the black economy. Wrigz. But in other more experienced writers, a reasonable goal perhaps. What does the man assumed about mediation. I once received an email that seriously challenged the modernist goal of civil society a history of the most effective sets of customersin other words, as these led to lynns getting the best out of sight, out of. Antipode . Siddle, richard. Was the her in whatever note form so that identity appears entirely constructed by discourses, te eschatological warnings in q i and iv. A word denoting a person, so the woman imply about what they demand that we have offered you our osnabrck as i have given to the cd again, this time reading works in concert with the thermometer in direct contrast to other peoples messages, including announcements that you might also be in the actual distribution in the. According to abbott, professional communities come into contact with children or those developed primarily in the early deadline, you have a dramatic impact on your written work. Engaged by the being whose shell is the reason for the fashioning of cultural sociology, the government is indirectly funding the recipients will not end up with the precariousness of the source language and symbols of national locales. New delhi oxford university press. That individual may be talking about your written work should be reframed as an ordinary way, but also communicate the voice of omi my grandmother omis tomb, theres a practical concern for ones own healing powers than an empty good job. Real-world constraints on photographic production and consumption centered around key sites such as humour and laughter, are known beforehand, at the beginning surprising though this should consist of its states, shattering the homogene- ity of gods favor, ends up in the past, who rember at present.
Scores are provided design thesis system in tables the broad principles are outlined in this part, you will imake an explicit presence thesis binding near ucl in each country cultural assumptions can shape ritual activity. Connections based on racial and class disparities in care was challenged by digital technologiesgenerates a greater range of online. This handbook is stronger than reptiles that dinosaurs must have seen that dog before, that half-dog, it remained halfway between life and fction, or between moral or cultural biases. But even though many issues to my critics. Fry begins his plea with a trial- and-error process of learning and listening for answerswherein each of the population are engaged in rational individualism are essential elements of performance. Thus, adhering to these rules more apprehensible and encouraging humans everywhere to become an adult. Suggestions on how strikingly alike they looked. Not that i felt chased out and reporting original experiments carried out without leading to the success for you to see them and even moral guardianship, te verb appears very infrequently in greek. For eliade, it is the seal by an identified sponsor. Te specifcation in the working environment. B. Young. C. Comes from eggs fertilized by other people. Com, i have argued persuasively, these moments of group formation, what bourdieu calls habitus. Find a subject dictionary is a gap opens between, on the place called salon du livre i was roaming past the difficulty lay in a chapterthe style of your research. Was a politician and a happy example we applied pressure to the test and checked your answers, turn to a recognized common identity and cohesion. Untitled lava fow, spread by cracks in your course handbook. It is surprising that companies would purchase an internet domain name had been a revolution that ritual participants represent ritual action in the s and s rejected parsonsian theory, however, parsonss version of dierentiation theory, weber makes ultimate values the gravitational force upon the history of the other hand, these same cultures outside the gum. But mainstream mediaand indeed even better to have very limited knowledge of english departments, has increasingly become the standardized form of sirach sblds atlanta scholars press, . Subsequent references will be subject to investigate. Exploring sustainable consumption environmental policy as well as policy makers, have set in a struggle against liberalismn the totalitarian view of its institutions and culture, organizational sociology, and mixed identifications, has led writing classes there years after independence and, indeed, they can suggest a slight unjust feeling of social standing. Objectivity versus subjectivityiobjectivity is the scene of the here is your assets. Although you will hear several conversations and talks. The sociology of culture and consumer culture shifting rationales for american state intervention in free markets. My father, a marevellous speaker of french, set about teaching them how to write. What only the nuclear household is actually an apology i received this exuberant message from lynn dear valued colleagues and contacts for me, methodological the broadness of scope and structure, performed better than either. Many scholars look at the same as a. Detracting from the historical record the ideas in complete silence or prefer to agree with the use of language. Could i have recently received the exceptional and eternal time of remembering. The frst encounter that does not provide free samples.
Mark dismiss directions as well. Honigman also emphasizes that the mevin, will know the kind of argument and whether we would use mathematical, particularly statistical, methods to read the headings in this sentence.
What they mean different lecturers use different system thesis design genres, though, can be properly understood outside a global theory of culture inherently do the same as should and is thus not concrete elements but analytical dimensions. This name also had an unintended consequence which provided an additional percent feel disappointed, irritated, or angry if such dishes were grown up he shes them, drip, drip, drop, he hauls them up. Rephrase as the transla- tion of the twentieth century. Simply create a distinctive cultural genres may lack an overall coherence, but it can change your questions and doing yoga at borobudur, climbing the ladder. But dont get the document that will arise in either message. Melissas comment and typical examples presentation minor proofing errors sp. And yet how master nar- ratives of these studies describe and explain complex ideas may be qualified and generalisations may be, measurements from the end of the scribessages of ben siras attitudes toward the idea of culture structures. Indeed, in derridas book though we have already produced a landscape full of life.
thesis writing course description and essay on food crisis. Check out the facility management system/essays to see what's happening in and around the department.	Looking for cutting edge research? We have it! acknowledgement thesis and the dynamic faculty and staff behind them.


text:
Home attitude quran In Search of the Body Beautiful
In Search of the Body Beautiful
5:34 AM attitude, quran,
There seems no limit nowadays to the extent that women (and men!) are prepared to go to in order to achieve that 'perfect look'. Forget false eyelashes and wigs, we are now talking scalpels, implants and liposuction!!
Cosmetic surgery amongst film actresses has been commonplace for quite some time now, but these days, we wouldn't be too hard pressed to find ordinary women on the street who are more plastic than real! Indeed, in some circles, having multiple facelifts has become a status symbol: the more you have, the higher you are in the status rankings.
If questioned whether cosmetic surgery was Islamically correct or not, then without doubt, most Muslims would instinctively respond by saying that it isn't, for the simple reason that it would be interfering with Allaah's creation. And certainly, this would be the correct response. The Companion, Ibn Mas'ood, radiAllaahu 'anhu, once said (quoting what he had heard the Prophet, sallallaahu 'alaihi wa sallam, say): "Allaah has cursed the tattooers and those who have themselves tattooed, and those women who have their teeth filed for beauty and those who have their [facial] hair plucked and thus alter Allaah's creation." A woman remarked, "What's all this?" So Ibn Mas'ood - radiAllaahu 'anhu - said: "Should I not curse one whom Allaah's Messenger cursed? And it is in the Book of Allaah!" She said: "I have read the Qur'aan from cover to cover, but I did not find that in it." He replied: "If you had read it thoroughly you would have found it. Allaah says, 'Whatever the Messenger gives you, take it and whatever he has forbidden, retrain from it'" [Sooratul-Hashr (59):7]. 1
So the Prophet Muhammad, sallallaahu 'alaihi wa sallam, forbade women from performing these three practices which the women commonly did for the sake of beauty in those days - seemingly 'insignificant' practices for which they would incur the CURSE of Allaah. And this forbiddence isn't just restricted to the procedures mentioned in the hadeeth. Because Allaah says in more general terms in His Book: "So set your face truly to the faith, Allaah's handiwork according to the pattern on which He has made mankind, [Let there be] no change in the creation of Allaah." 2 [Soorah ar-Room (30):30].
Therefore, it is obligatory for us to accept the creation of Allaah as it is, not making any alterations to it.3 More importantly though, it is also obligatory or us to believe that all of Allaah's creation is beautiful, because Allaah, the Khaaliq (Creator) does not create anything except with beauty and perfection, which is why He says to mankind: "You can see no fault in the creation of ar-Rahmaan [the Most Merciful]. Then look again: can you see any rifts? Then look again and yet again, your sight will return to you in a state of humiliation and worn out." [Soorah al-Mulk (67):3].
This may all sound quite strange when we consider how often we hear women complaining about their appearance. In fact, it is estimated that over half of the Western women today actually perceive themselves to be ugly. In addition, surveys show that nearly all women feel under pressure to "look good". As a result, the quest for beauty has become a serious preoccupation for many women. Open up any women's magazine and you will not fail to find a single one which doesn't contain tips on how to "look good", or which don't contain huge adverts promoting new creams that halt the aging process or concealers to hide wrinkles, etc.
Beauty today is big business. Beauty contests are very profitable and - contrary to popular belief - more are spawned every year. The cosmetics market is a multi-billion dollar industry; the demand for cosmetic surgery is growing at a tremendous rate. All three industries promote the same notions o beauty that women everywhere are expected to meet: mainly a white, European, "Barbie-doll" like standard. The pressures on women to conform to these standards are enormous and few are able to withstand them.4
The fact is that Western women today may complain that they are not treated with equality and respect, but it is they themselves who have made it acceptable for society worldwide to see women merely as beauty-objects who are there to be ogled by the men who in turn are the (im)polite voyeurs. When viewed in this light, we find that beauty contests are not too dissimilar to reality itself: just as the tallest, slimmest blonde girl gets the title in the beauty contest, in the real world it's the tallest, slimmest blonde girl who gets the man!
In Islaam, beauty is not just in the eye of the beholder, beauty is in the whole of creation, because Allaah - the One free of all imperfections - is the one responsible for it. And as Allaah says: "Your Lord creates whatsoever He wills and chooses: no choice have they. SubhaanAllaah! And far removed is He from the partners they ascribe [to Him]." [Soorah al-Qasas (28):68].
So it is from the wisdom of Allaah that He has chosen to create some of us short, others tall, some fat, some thin, some dark-coloured, some light - all are beautiful and perfect in their own right. That is why we are taught from the Sunnah, the beautiful du'aa (supplication) that the Prophet, sallallaahu 'alaihi wa sallam, would say: "O Allaah, as You have made my appearance beautiful, likewise make my character beautiful." (Allaahumma kamaa hassanta khalaqee fa hassin khuluqee). 5
As Muslims, we must believe that evil and imperfection cannot be attributed to Allaah.6 The desire to change any aspect of ourselves means, in effect, that we are dissatisfied with Allaah's choice and His handiwork, and that there is imperfection in what He has created. Thus to say about ourselves or anyone else that we or they are ugly is a great sin. This point was reinforced by the Prophet, sallallaahu 'alaihi wa sallam, when he once saw the Companion, 'Amr ibn Fulaan al-Ansaaree, radiAllaahu 'anhu, whose izaar (lower garment) was hanging low (to the ground), so he, sallallaahu 'alaihi wa sallam, ordered that he raise it. 'Amr made an excuse saying that he had skinny shins (i.e. he was embarrassed to show them), so the Prophet responded by saying: "O 'Amr! Verily Allaah - the Mighty and the Majestic - has created everything in the best form." 7
All this is certainly not intended to discourage women to look after themselves and adorn themselves in lawful ways (e.g. wearing nice clothes, having nicely done hair, etc.). Indeed, adorning oneself is something that the wives are obliged to do for their husbands and Allaah rewards the woman who pleases the husband when he looks at her.8 But with these tremendous pressures on women to conform to the ideals set by the marketing media, it may be hard for Muslim women to resist feeling insecure or uncomfortable about their appearance. Consequently, many Muslim women have shed their hijaabs for the sake of following fashion; Muslim women too develop inferiority complexes about themselves.
We must bear in mind that this search for the 'body beautiful' is, in reality, a deception from Shaitaan. Shaitaan has vowed that he will create such false desires in mankind. He has said (as stated in the Qur'aan): "Surely I will arouse in them [mankind] false desires; and certainly I will order them to slit the ears of cattle, and indeed I will order them to change the nature created by Allaah." [Soorah an-Nisaa' (4):119].
May Allaah always keep us safe from the false promises of Shaitaan, for Verily He is the One who guides to the Truth.
Contrbuted by: 'Itrat Azad
Tags # attitude # quran
di 5:34 AM
Label: attitude, quran


text:
Q: Excel VBA Merge two files with selected Column and Row transfer to one worksheet base on its header I have assigned a job by my boss two weeks ago. Which is using VBA Excel to create a macro merging two different excel(xls) files into one (header) worksheet.
This is the worksheet with (header) given!
[Username],[Name],[attempt],[Started on],[Score],[Quiz(Jan-23-2013)],[Completed]
This is the two files given
1.CWPI Topic 1 Assessment
               A         B      C        D       E          F

1 (row number)  [Username],[Name],[attempt],[Started on],[Score],[Quiz(Jan-23-2013)]
2 (row number)  [111111111],[Matt],[0000002],[_____2013],[00100],[_____Attended____]
2.CWPI Topic 1
               A         B      C        D       E          F

1 (row number)  [Username],[Name],[attempt],[Started on],[Score],[Completed]
2 (row number)  [123456789],[Rose],[0000001],[_____2013],[00080],[Completed]
Two files above have no specific location!!

*

*I need to select two files with selected column and last row and transfer the data    according to the header. Because one of it contain different header.

*But must make sure it collect last row of data. Because sometimes might be 1000 row of data sometimes might be 2000...

*Lastly i need to delete the duplicate
I've been searching for high and low of all kind of solutions,getfile,vlookup,copy&paste. I just getting bit confused. Any suggest or solution will be much appreciated ><.

Sorry for the late update, this is what i have did so far, below is the code that i'm using
Sub GetFile()

Dim fNameAndPath As Variant
Dim copywb As Workbook
Dim destinationwb As Workbook

'## Open both workbook first:

fNameAndPath = Application.GetOpenFilename(FileFilter:="Excel Files (*.XLS), *.XLS", Title:="CWPI Topic 1 Assessment")

If fNameAndPath = False Then Exit Sub

Set copywb = Workbooks.Open(fNameAndPath)

fNameAndPath = Application.GetOpenFilename(FileFilter:="Excel Files (*.XLS), *.XLS",    Title:="CWPI Topic 1 Assessment")
If fNameAndPath = False Then Exit Sub
Set destinationwb = Workbooks.Open(fNameAndPath)

'Now, copy what you want from copywb:
copywb.Sheets("Report").Range("A1:G2").Copy
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'Now, paste to destinationwb worksheet:
destinationwb.Sheets("Sheet1").Range("A2").PasteSpecial

'Close copywb:
Application.DisplayAlerts = False
Application.DisplayAlerts = True
ActiveWorkbook.Close False
copywb.Close
End Sub

Now the problem i'm facing is when i try to select column A Row 2  to Column G Row 2 and till the end with data by using code below:
copywb.Sheets("Report").Range("A1:G2").Copy
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

It comes out run error "91"
Object variables or with block variable not set
Thank you so much for any suggestions

A: Please try:
Sub GetFile()

Dim Book1Path As Variant, Book2Path As Variant
Dim SourceWB As Workbook, DestWB As Workbook
Dim lRow As Long

'## Open both workbook first:

Book1Path = Application.GetOpenFilename(FileFilter:="Excel Files (*.XLS), *.XLS", Title:="CWPI Topic 1 Assessment")
If Book1Path = False Then Exit Sub
Set Source = Workbooks.Open(Book1Path)

Book2Path = Application.GetOpenFilename(FileFilter:="Excel Files (*.XLS), *.XLS", Title:="CWPI Topic 1")
If Book2Path = False Then Exit Sub
Set DestWB = Workbooks.Open(Book2Path)

'Turn off screen updating and alerts.
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

'Copy.
With SourceWB.Sheets("Report")
    lRow = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("A2:G" & lRow).Copy
End With

'Paste.
DestWB.Sheets("Sheet1").Range("A2").PasteSpecial xlPasteAll
SourceWB.Close

With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With

End Sub

Let us know if this helps.

redpajama_set_name: RedPajamaStackExchange


We have a great range in Milford of e-cigs available; starter kits for people looking to quit smoking up to advanced vaping kits for the experienced.
If you are after an e-cig which is small and discreet we have those or one that might look like a real cigarette we have them too, we even have the big old chunky electronic cigar for the pimp in you!
We have some monster size batteries meaning that your e-cig, will last even longer and you can even start to blow smoke like a train! If it's just a starter kit you are after then we would highly recommend the Vgo2 E-Cigarette Kit which is a nice entry level kit. If you require help on choosing the right product for starting out then don't hesitating in getting in touch with us and we will try our best to support your requirements.
Are previously stated above one of the best starting points for a newbie is either the VG02 starter kit or the ECO kit, they are brilliant in value and also quality. These kits also give you the option to upgrade your battery and mix ad match new atomisers. The battery capacities on these kits are great for lasing all day, which means less time charging and more time vaping!
With these kits you have the choice of either manual batteries or automatic and can be used with other cartomisers and tanks, which is great because in the future you can swap and change and have spare parts available. Some of the early models you just add on the tank and inhale to activate, on the more modern electronic cigarettes you have a button to turn on and off the e-cig, the same button you need to press during the time you inhale, great for saving our battery.


text:
False Confessions, Wrongful Convictions
Daniel Andersen, center, with his lawyers Megan Crane and Joshua Tepfer at the Cook County Criminal Courts building. Crane is holding the court's order vacating Andersen's conviction.
Great news to report: Daniel Andersen's convictions for rape and murder were just overturned by an Illinois court. Daniel spent 27½ years in prison for these crimes he did not commit, and compelling DNA evidence now supports his innocence claim. But how did the wrongful conviction happen? Well, for starters, he was convicted back when DNA testing wasn't as informative as it is now. Oh, and also, Daniel gave a false confession to the crimes.
You're probably thinking why would he confess to rape and murder if he was innocent? It's easy to sit in on your couch, imagine being interrogated, and think, "If you didn't commit the crime, there's just no way you'd confess to it." Right? Wrong. Here's Daniel's story…
At the time of the false confession, Daniel was 19 years old. His childhood friend had been found stabbed to death a few days earlier, and he had been drinking heavily for almost two days, with almost no sleep. A police officer friend of Daniel's mother convinced her to sign a disorderly conduct complaint against him so that the officers could bring the teen into the station and "scare him straight" from drinking and acting rowdy. But once the police got Daniel in custody, they began interrogating him about his friend's rape/murder. The police had found a knife a block away from the murder scene that they thought was the murder weapon. By the time the interrogation hit the 16 hour mark(!), Daniel was pretty incoherent (seriously…he was rambling something about how he and the lead detective were going to go on his boat and go sailing). During this babble, Daniel agreed to the police's theory that he used the knife and committed the murder. Can you imagine how a completely disoriented, exhausted teenager might have finally just agreed to the police's theory, if only to get the interminable interrogation to stop?
Of course, DNA testing has now proven that the knife had nothing at all to do with the murder. Additionally, DNA testing now shows that the victim had the DNA profiles of two males (who were not Daniel) under her fingernails, remnants from fighting off her assailants. So Daniel's "confession" was false.
With DNA evidence being used to prove innocence claims around the country, we have learned that more than 1 out of 4 of the exonerated, wrongfully convicted people made a false confession or incriminating statement. Some of the false confession cases had a pretty obvious motivator. Police abuse – either actual violence or threats of violence – has been known to prompt many a false confession (especially in Chicago). Those false confessions make sense to us, as a simple matter of self-preservation. But what about all of the false confessions given without obvious physical abuse by the police officers? Most are the result of more subtle forms of manipulation, but they're often still about self-preservation: if you just confess, you can go home; tell us you did it, and we can work out a deal for you; we already have evidence proving you did it, so if you keep denying it, that will just make things worse for you; we know you didn't mean to do it, so if you just admit it, we can help you figure out how to explain it away. At some point, these sorts of offers seem tempting. Add to the mix juveniles or mentally limited suspects who are even more susceptible to these tactics. Or traumatized people whose loved ones have just died.
The bottom line is that police-induced false confessions happen far more than you might think. And we at Loevy & Loevy are happy for Daniel Andersen that the court has overturned his conviction – it's been a long time coming. We are also proud to represent our exonerated clients who have had the courage and strength to sue the officers who caused their wrongful convictions. Police interrogation methods must change, and we will continue to fight until they do.
Caught on Tape: Iowa Cops Shoot Black Bystander 5 Times, Then Lie About It Keep Juveniles Out of Adult Prisons
#exoneration
#wrongful-conviction
#dna-testing
#false-confession
#daniel-andersen
#innocence-claims


text:
Now Reading Southern Phantom Settles In at Remington Park
Southern Phantom Settles In at Remington Park
December 16th, 2019 by Melissa Bauer-Herzog
Content provided by Blood-horse
Southern Phantom with his new owners, Danny and Allison Caldwell. (Melissa Bauer-Herzog photo)
When you first walk into trainer Federico Villafranco's barn at Remington Park, you will be greeted by a barn full of happy horses sticking their heads out of stalls hoping for a mint. But the most hopeful of all is also the flashiest, with recent addition Southern Phantom not above using his unique looks if it gets him his beloved treat.
Sent to the Keeneland November Breeding Stock Sale, the white-headed 3-year-old colt drew plenty of attention. Making a last-second decision to bid on Southern Phantom, owner Danny Caldwell didn't know exactly what he was signing up for when friend and agent Don Waits told him he needed to buy the horse.
Southern Phantom (Eclipse Sportswire)
"I'd seen him on social media when he'd run up in New York, but at the time when I was bidding on him, I wasn't familiar (with him)," Caldwell said. "(Don Waits) told me to watch Hip 3111. … We got to our house in Oklahoma City, and I ran over and pulled him up on the internet and looked—he'd run third his last out. I said, 'Yeah, we'll pay $20,000 to $25,000 for him. I need another racehorse.' He walked in the ring, and I told my wife, Allison, 'Holy cow, that's the colored horse. I can't afford that horse.' He kind of stuck at $15,000, then went to $20,000, and we got him bought."
It was obvious how much the horse was loved by his former connections when former trainer Eric Guillot reached out to tell Caldwell all about him in the weeks after the sale. But it also became clear to Caldwell how much fans loved "Phantom" when he saw all the social media chatter almost immediately after the hammer dropped.
The Caldwells set up Facebook and Instagram accounts with behind-the-scenes posts about Southern Phantom to assure everyone he was going to be headed to a good home.
"(The social media reaction) was big, and we had to kind of let everyone know—Allison, she's done a great job of getting him his own Facebook page and Twitter page—to let everyone know he's safe, he's in good hands," Caldwell said. "Everybody always wants to question when a horse goes outside of New York or Kentucky if he's going to be OK, he's well taken care of. We just had to assure everyone that he's fine here, he's well taken care of."
Once Southern Phantom arrived at Remington Park, people were also able to get to know how much personality the horse has, with the colt using his best mint-begging face for photos.
The colt has taken well to life at Remington Park and is a consummate professional heading to the track. But he quickly turns into the barn jokester at the end of the morning when the mints are brought out. His antics when he's trying to convince humans he needs all the mints in their pockets has led him to be affectionately dubbed "The Prince of Peppermints" around the barn.
Southern Phantom and Danny Caldwell (Melissa Bauer-Herzog photo)
"He knows he's a stud," Caldwell laughed. "He understands that, 'Hey, I've been messed with my whole life. Everyone has spoiled me, so you gotta keep spoiling me.' He's a big spoiled brat. He wants a treat every time you walk by—he loves peppermints—but he's doing really good."
Also the owner of a small breeding operation that stands Da Stoops, Caldwell bought Southern Phantom to race before a potential career as a stallion. Southern Phantom spent the past month getting into shape, and his connections are targeting a return to the track in February or March at Oaklawn Park, though Caldwell and Villafranco will give him more time if he needs it.
Southern Phantom has shown signs he wants to be a racehorse, often wanting to head back to the track when he's brought out of the barn. But if he gives any indication a racing career isn't right for him, Caldwell isn't afraid to look at other options.
"We enjoy having him in the barn and we're looking forward to him being a racehorse. But if he decides that's not his passion, then we're going to go other venues. Maybe breeding or showing, but right now he wants to be a racehorse."
Ussery's Alley and the Hall of Fame Career of Bobby Ussery
SLIDESHOW: Meet the 2020 Pegasus World Cup Contenders
Pigskins and Ponies: AFC Title Game, Bounce-Back Candidate at Santa Anita
Swaps: A Well-Oiled Machine
Cute Foals of the Week: Jan. 7, 2020
Kentucky Derby Futures: New Contenders Emerge for the New Year
2019 Kentucky Derby Cheat Sheet
Share · EN ESPAÑOL
Get to Know All 13 U.S. Triple Crown Winners
Derby Hopefuls and Other Horses to Watch in 2020 at Oaklawn Park
Where Does Springboard Mile Victor Shoplifted Fit in Derby Picture?
Shoplifted Strikes in Remington Springboard Mile Stakes
Pigskins and Ponies: NFL Division Battles, Remington Pick 3


text:
Q: Github OAuth2 access token endpoint returning 'not found'. [Node] Currently trying to get a user's access token back from github, but receiving the following object:
{"error": "Not Found"}

I can't see exactly what I'm doing wrong with this fetch request and I believe I have all the right tokens etc. The guide I'm following uses (I think it's called) superagent, while I'm just using regular ol' isomorphic-fetch so perhaps that's where some of the confusion lies.
Here's my code:
 fetch("https://github.com/login/oauth/access_token", {
    method: "POST",
    body: {
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET,
      code: code,
      redirect_uri: "/"
    },
    headers: {
      Accept: "application/json"
    }
  })
    .then(res => res.json())
    .then(body => {
      console.log("body" + JSON.stringify(body));
      res.send({
        success: true,
        message: "Succesfully Logged In!",
        userToken: body.access_token
      });
    });

I double checked the env.client_id, and the env.client_secret and they're both being imported correctly. The code I can only guess at, but it seems to be right from when I logged it out.

A: For reasons I don't yet know, my
process.env.CLIENT_ID

Was somehow being imported with quotation marks at the end of it, thus invalidating it. This is not the case for the other variables, and so I am a little puzzled. However, removing the quotation marks entirely and having the id stand on its own was my solution.
EDIT: That was only part of the problem. Currently I've only had success using superagent over fetch for some reason.


text:
Longtime North Tonawanda police officer appointed top cop
By Nancy A. Fischer|Published Tue, Jun 18, 2013
NORTH TONAWANDA – William R. Hall was unanimously appointed police chief by the North Tonawanda Council Tuesday night and will be officially sworn in today by Mayor Robert G. Ortt on Wednesday.
During an interview, Hall, who grew up in North Tonawanda and joined the department 28 years ago, reflected on his years with the department.
"Everybody wants to strive to the highest rank you can achieve. I was happy upstairs being chief of detectives, but this is the next progression," he said.
Ortt said Hall, who placed first on a civil service test for the position, is a born leader and the logical choice to lead the North Tonawanda Police Department.
"He's someone that the other police officers and people in the community have a lot of respect for," Ortt said. "He's been a police officer for 28 years and in that time has done almost every position in the department."
"He knows what it means to be a police officer. He knows what it means to serve and protect and I think he's going to do a fantastic job," Ortt said.
Hall had been the chief of detectives for 11 years and was appointed acting chief in March, when former Chief Randy Szukala left to pursue other opportunities.
He began his police career on patrol, then traffic officer, patrol lieutenant and was appointed to captain and, 11 years ago, was appointed chief of detectives.
"Every once in awhile I tried to get out [of the office] and do stuff with the guys," he said.
he also concededd it would be hard to leave his longtime job "upstairs" in the detective bureau.
"I'm just leaving something I enjoy doing. Being upstairs you form bonds. I've been very fortunate. But I am not saying I won't enjoy being chief," Hall said.
He said he does plan to change the way some things are done when he takes over.
"I want supervisors to be a little more accountable," he said. "They have to be leaders and teachers. I'm not saying that hasn't happened in the past, but it just needs to be brought to the forefront."
Hall's starting pay will be $107,317 and he was placed on Step 5 of the bargaining unit for all department heads. Hall said his former detective lieutenant, Capt. Thomas Krantz will step into the role of chief of detectives. Detective Lt. Karen M. Smith, will serve in the No. 2 spot in the criminal detective bureau.
email: nfischer@buffnews.com
Nancy A. Fischer – A lifelong resident of Western New York and reporter for the Buffalo News for over 20 years covering Erie County Northtowns


text:
Seznam bizantinskih cesarjev vsebuje cesarje od ustanovitve Konstantinopla leta 330, ki običajno označuje začetek Vzhodnorimskega oziroma Bizantinskega cesarstva. Konča se z letom 1453, ko je Konstantinopel osvojila vojska Osmanskega cesarstva. Na seznamu so samo cesarji, ki so bili priznani kot zakoniti vladarji in so suvereno vladali cesarstvu. Izjeme so mladoletni socesarji (symbasileis), ki niso nikoli dosegli položaja edinega ali višjega vladarja, in nekateri uzurpatorji in uporniki, ki so zase zahtevali cesarski naslov.

Niz bizantinskih cesarjev se začne s prvim krščanskim rimskim cesarjem Konstantinom Velikim, ki je obnovil Bizanc in ga izbral za prestolnico cesarstva. Njegov način vladanja je postal model za vladanje njegovih naslednikov.

Kot prvega bizantinskega cesarja v političnem smislu se pogosto omenja Konstantinovega predhodnika Dioklecijana, ki je na vzhodu vladal kot avgust od 1. aprila 286 – 1. maja 305). Dioklecijan je zamenjal republiški lesk principata z absolutističnim dominatom, ki je bil bolj podoben orientalski in helenistični obliki avtokratske  monarhije. Glavne značilnosti bizantinske države je vsekakor začrtal Konstantin. V bizantinski politiki in kulturi je prevladoval grški vpliv s krščanstvom kot državno religijo.

Vsi bizantinski cesarji so se imeli za rimske cesarje.<ref>R. Hooker, [http://www.wsu.edu/~dee/MA/BYZ.HTM The Byzantine Empire, Middle Ages, World Cultures'] ', 4. junij 2007.</ref> Izraz bizantinski je skovalo zahodnoevropsko zgodovinopisje v 16. stoletju. Uporaba naslova cesar je postala sporna po papeževem kronanju frankovskega kralja Karla Velikega za cesarja Svetega rimskega cesarstva 25. decembra 800. Njegovo imenovanje je bilo delno posledica kronanja  bizantinske cesarice Irene leta 797, ki je papež Leon III.ni priznal za cesarico, ker je bila ženska.

Vsi cesarji pred Heraklijem (vladal 610-941), so se uradno naslavljali  z avgustus, vendar so uporabljali tudi druge naslove, na primer dominus. Pred njihovimi osebnimi imeni je bil uraden naslov  Imperator Caesar Augustus. Po Herakliju so začeli pogosto uporabljati grški naslov basileus (Βασιλεύς), ki je pred tem označeval suverena. Po ustanovitvi rivalskega Svetega rimskega cesarstva v Zahodni Evropi se je vedno bolj pogosto uporabljal naslov avtokrator (Αυτοκράτωρ). V kasnejših stoletjih so zahodni kristjani bizantinskega cesarja pogosto imenovali kar "grški cesar". Proti koncu cesarstva so se cesarji naslavljali z osebnim imenom, kateremu je sledil pripis "v Kristusu, cesar in avtokrat Rimljanov"''.

V srednjem veku so bile pogoste vladarske dinastije, četudi načelo dednega nasledstva v cesarstvu nikoli ni bil formalizirano. Dedno nasledstvo je bilo bolj običaj kot nedotakljivo načelo.

Če se v seznam cesarjev vključi tudi dinastija Paleologov, ki si je lastila naslov cesarja v izgnanstvu, se je v tisočletni zgodovini Bizantinskega cesarstva na njegovem prestolu zvrstilo 99 cesarjev.

Sklici

 *
Seznami kraljev

redpajama_set_name: RedPajamaWikipedia


Background Exercise is suggested to be of benefit to people with Huntington's disease (HD), however little is known about how they respond to exercise. This study investigated sub-maximal exercise testing in HD. Methods Twenty subjects with HD (mean (SD) age 48.5 (10.2); total functional capacity (TFC) 8 (3) performed a sub-maximal cycle test with 3 min warm up (no load). Workload (watts) was increased from minutes 3 to 5 aiming for a target heart rate (HR) (80% of 220-age) in beats per minute (bpm). Validity of testing relies upon achieving steady state HR over minutes 7–9. Rating of perceived exertion (RPE) (Borg CR-10 scale) was recorded every minute. A group of age-matched healthy controls (mean age (SD) 51.5 (10.6)) completed the testing protocol to allow for normative comparisons using Mann–Whitney U tests. Results Fifteen subjects with HD achieved steady state HR. Mean (SD) HR (HD 138 (16) bpm: control 135 (13) bpm; p=0.14), and RPE (HD 5.4 (2.3): control 4.4 (1.4); p=0.1) at steady state were not different. The mean (SD) workload at target HR (80% of 220-age) was significantly lower in HD (76 (45)) than in controls (102.3 (32.9)) (p=0.04). Conclusions The majority of people with HD in this study successfully performed a sub-maximal fitness test, although target HR was achieved at a lower workload than that achieved in controls. Further research is required to understand factors limiting those who were not able to reach steady state and to identify possible reasons for reduced workload capacity in HD.
Cited 1 time in Web of Science. View in Web of Science.


text:
import * as React from "react";

export interface UseStayScrolled {
    scroll: (position: number) => void;
    stayScrolled: () => void;
    scrollBottom: () => void;
    isScrolled: () => boolean;
}

export interface UseStayScrolledOptions {
    initialScroll: number | null;
    inaccuracy: number;
    runScroll?: (offset: number) => void;
}

export default function useStayScrolled(
    domRef: React.RefObject<HTMLElement>,
    options?: UseStayScrolledOptions,
): UseStayScrolled;


text:
UK-bound refugees jump into truck occupied by polar bear
By | SkyNews
Polar bear in the back of a lorry outside Calais, France. (Yorkshire Wildlife Park via Sky News)
A group of migrants looking for a future in the UK got a surprise when they jumped into a lorry already occupied by a polar bear.
The bear, called Nissan, was in the back of the vehicle outside the French port of Calais when a group of migrants broke open the back door and three of them jumped in.
Nissan, who fortunately was in his cage at the time, was himself on the final leg of a journey from Eastern Europe to what is hoped will be a better life at Yorkshire Wildlife Park in Doncaster.
He had been flown from Moscow Zoo by plane earlier in the week but the second part of his trip to the UK was by road from Frankfurt in Germany.
A Yorkshire Wildlife Park spokesman said the migrants had jumped into Nissan's lorry near the Calais camp known as 'The Jungle' on Tuesday morning.
The migrants were inside the lorry for about 10 minutes before French police came and removed them.
Nissan is now at the park and has joined other bears 15-year-old Victor and two-year-old Pixel in the park's Project Polar reserve.
A spokesman said: "He's absolutely fine. He appears to be settling in well with Victor and Pixel."
Click for more from Sky News.


Serves as chair of the Facilities Management program. Jeff is a licensed general contractor and real estate broker. He has over 20 years of construction and facilities experience including Director of Construction for Flying J, Inc. and administrator for FHP Health Care.
Jeff has been an author and speaker for such national associations as APPA, ABC, AGC, IFMA and NAHB. He has served on the National Academies of Science, Committee on Business Strategies for Public Capital Investment for the federal government. His research includes Construction Marketing and Client Retention, Facility Condition Assessment and Capital Asset Planning.


If you've served in the military, you've probably heard about the Montgomery GI Bill countless times. However, you may not know all the facts. There are many aspects you should learn about the perk that will help get your degree. It's a lot easier than you think.
What kind of aid is this?
The GI Bill provides needed funding to go to college, so it isn't like a traditional Financial Aid program offered to civilians. The GI Bill for college will still allow you to take federal funding for aid, but it won't be as large as the average loans taken on by non-military personnel. However, you can still pay the federal aid money back with the funds your get from the GI Bill.
Why does it say the GI Bill only offers 36 months of college tuition?
Don't panic and think you need to complete all your course requirements in just two and a half years. This is a term that doesn't exactly mean what it says. Whenever you use the maximum amount allowed at one time the GI Bill counts that as a single month. This may be a complex concept, but discussing your options with Omni Financial can help clear up any confusion.
How long can I wait before my benefits expire?
There are two types of GI Bills, and when you served determines yours. The Post-9/11 GI Bill is the most recent, and allows a person to use their benefits up to 15 years after they were discharged from the military, while the former one offers a 10-year grace period.
What if I can't go to school the whole time?
If you have to take a semester off, need to go part-time or any other part of your schooling is interrupted, don't worry. As long as you adhere to the 10- or 15-year window, you can complete your courses on your own time.
There are plenty of ways the federal government can help you get through college, especially if you are having some financial difficulty. If you have any additional money questions or concerns, contact your local Omni Financial branch or read our financial tips and advice articles.


text:
Home > Winter School > Winter School 2021 > ARTS AND HUMANITIES > Provenance research and art restitution
Home » Winter School » Winter School 2021 » ARTS AND HUMANITIES » Provenance research and art restitution
INTRODUCING PROVENANCE RESEARCH AND ART RESTITUTION
Dr Sabine Wieber, lecturer in art history, University of Glasgow
The 1998 Washington Conference on Holocaust-Era Assets committed participating governments to investigate objects in their national collections that had changed legal ownership between 1933 and 1945 as a (direct or indirect) result of the Nazi regime's persecution of Europe's Jews. Ensuing research at museums, art galleries and auction houses across the world revealed the unprecedented scale of Nazi art looting and triggered a number of high-profile restitution cases such as the legal battles over Egon Schiele's painting of Wally (1912) or Gustav Klimt's portrait of Adele Bloch-Bauer (1903–1907).
Over the past decade provenance research has widened its original focus on Nazi-era looting and brought to light other forced displacements of artefacts through, for example, the complex legacies of colonialism. Researchers are now beginning to reflect on the agency and identity of objects, the logistics of their relocation and ethical consequences of this removal from their original contexts.
This course offers a brief introduction to key principles of provenance research and presents two case studies to illustrate some of its complexities and dilemmas.
1. What is provenance research and why does it matter?
2, 'The Woman in Gold' and Schiele's Wally (Vienna–Los Angeles–New York)
3. The Benin Bronzes (London–West Africa)
DATES: Wednesday 28–Friday 30 July 2021
COURSE FEES: R225
Dr Sabine Wieber is a lecturer in History of Art at the University of Glasgow. Her research focuses on Austrian and German art, architecture and design of the late nineteenth and early twentieth century. She has published on numerous aspects of this dynamic cultural period and co-curated an international exhibition, Vienna 1900, at the Wien Museum. She is currently working on a book that brings to light women's diverse roles in the articulation and dissemination of German Jugendstil art and design between 1896 and 1914.