text:
La Transformada de Hough és un algorisme emprat en reconeixement de patrons en imatges que permet trobar certes formes dins d'una imatge. És una tècnica utilitzada per aïllar característiques de forma particular dins d'una imatge, per tant, és una eina útil pel processament digital d'imatges, en l'anàlisi d'imatges i per a la visió artificial. Es basa a transformar punts de la imatge en un espai de paràmetres amb la idea bàsica de trobar corbes que puguin ser parametritzades com a rectes, polinomis i circumferències. Aquest espai paramètric es representa per una estructura rectangular de cel·les, anomenada arranjament acumulador, on els seus elements són cel·les acumuladores A(ρi,θi), les quals són els rangs esperats de (ρ,θ). Aquestes cel·les acumuladores amb una magnitud superior a un cert llindar poden ser considerades com a línies possibles.

El propòsit de la transformada de Hough és fer front a un problema que sorgeix en l'anàlisi automatitzada d'imatges digitals. El fet de detectar les vores d'una imatge per a obtenir punts o píxels d'aquesta pot causar imperfeccions, ja que poden faltar punts o píxels, poden existir desviacions espacials entre la línia ideal i els punts d'avantatge sorollós, etc.

Algorisme
Existeixen diverses aplicacions de la transformada de Hough, tot i que l'aplicació més simple es correspon a la de rectes.

Detecció de cercles
La transformada de Hough, en principi, està pensada per a la detecció de rectes, però també és aplicable a qualsevol funció de la forma f(v,c) =0, on v és un vector de coordenades i c és un vector de coeficients. L'equació del cercle té tres paràmetres, que són les coordenades del centre de la circumferència (xo,yo) i el radi de la circumferència(r^2); per tant, l'espai de paràmetres és de dimensió tres. Això dificulta l'algorisme, ja que donarà lloc a un espai de paràmetres de tres dimensions, amb cel·les en forma de cub i acumuladors (que són subdivisions de l'espai paramètric - de la forma f(r,x,y)).

El procediment en aquest cas és per a cada punt del pla format pels eixos (x,y), per a cada xo i yo, calcular el valor del radi i actualitzar l'acumulador corresponent a (xo,yo,r). La complexitat de la transformada de Hough depèn de la mida de l'espai de paràmetres.

Per percebre de millor manera el concepte de transformada, en l'exemple de la figura es mostren dues imatges que tenen un conjunt de cercles. A la imatge de l'esquerra hi ha tres cercles amb tres radis diferents. En aquest exemple es passa el paràmetre radi a la transformada de Hough perquè busqui cercles de radi 35. A la imatge de la dreta s'observa que en el cercle 2 totes les corbes passen per un mateix punt indicant que el cercle 2 té un radi de 35 píxels.

Detecció de rectes
La transformada de Hough per a la detecció de rectes és una tècnica per a detectar segments rectes en imatges. Utilitza la descripció paramètrica de formes geomètriques, és a dir, la representació d'una recta en coordenades polars.

A l'espai de la imatge, la línia recta es pot descriure com:

i pot ser gràficament representada per cada parell de punts d'imatge (x, y). La idea principal és tenir en compte les característiques de la línia recta i no com a punts d'una imatge (x1, y1), (x2, y2), etc. És a dir, en termes del paràmetre del pendent  i la intersecció del paràmetre . Basant-se en aquest fet, la línia recta es pot representar com un punt  en l'espai de paràmetres.

En el següent exemple gràfic s'observa com la transformada de Hough de la recta ρj (recta a distància de l'origen) i amb orientació θi es representa com un punt del pla (ρ,θ).

L'avantatge d'aquest mètode és que evita singulars, com ara rectes de pendent infinita. Si es representa  i  en un pla cartesià, una recta queda determinada mitjançant un punt amb coordenades (phi (recta), ro (recta)), mentre que un punt es representa com una funció sinusoidal. Si per 'exemple' tenim dos punts, tindrem dues senoides desfasades alfa graus depenent de les coordenades dels punts. Aquestes senoides s'aniran creuant cada 180°. La interpretació geomètrica d'aquest fet és que, si cada punt de la funció representa les infinites rectes que passen per cada punt, quan dos punts comparteixen la mateixa recta (les seves representacions sinusoidals es creuen) s'obté un punt. Cada vegada que es fa mitja volta ( = 180°) es torna a repetir la mateixa recta, de manera que tornem a obtenir un altre punt, que de fet és la mateixa recta.

Implementació

En el cas discret, el domini de Hough és un array bidimensional que representa valors discrets de θ i ρ. Abans d'aplicar la transformada és necessari seleccionar una resolució del domini de Hough. Quan es treballa amb una imatge binaria es segueixen els següents pasos:

 Inicialitzem la matriu acumuladora a zeros
 Per a cada pixel de la imatge amb nivell diferent de zero:
 Es determina el valor de ρ per a cada valor de θ
 S'incrementa la posició (θ,ρ) de la matriu en 1
 En finalitzar, cada cel·la indicarà el nombre de píxels que formen una recta en aquests paràmetres

Matriu acumuladora: Quantificació del pla de paràmetres en cel·les acumuladores. En la transformada de Hough d'una imatge binaria cada cel·la indica el nombre de pixels que componen el segment recte; però si la imatge no és binària, el recompte de píxels s'ha de ponderar pel nivell d'intensitat.

La precisió en la linealitat d'aquests punts s'estableix pel nombre de subdivisions en el pla (θ,ρ). Si es subdivideix l'eix en k parts, llavors per a cada punt (xo,yo) s'obté k valors de θ que corresponen als k possibles valors de ρ.

Problema
El problema que ens trobem per representar una línia amb l'equació de la recta és que la pendent i l'ordenada a l'origen poden arribar a ser infinit. Una forma de resoldre aquest problema consisteix a utilitzar la representació normal de la recta. Així, ara a cada punt del pla xy correspon una sinusoïde al pla ρθ en lloc d'una recta.

La següent imatge és un exemple que mostra els resultats d'una transformada de Hough en una imatge de mapa de bits que conté dues línies gruixudes.

Detecció de punts
La transformada de Hough per a la detecció de punts consisteix que per a cada punt (xk,yl) es correspon amb una corba al pla (ρj,θi). Per tant, calculant les corbes per a molts punts, els punts de creuament defineixen les rectes que els uneixen. Totes les corbes corresponents a les components colineals intersequen en el mateix punt (θ,ρ), on θ i ρ especifiquen els paràmetres de la línia. S'ha de tenir en compte que una recta horitzontal correspon a un valor θ=0° i un valor de ρ és igual a l'ordenada a l'origen, mentre que una recta vertical correspon a un valor de θ=90° i un valor de ρ és igual a l'abcissa a l'origen.

La següent imatge mostra com quatre punts corresponents a les cantonades d'un quadrat donen lloc a quatre sinusoïdes a l'espai ρθ. Les quatre sinusoïdes es tallen per sis punts, tot i que el resultat final són vuit punts, ja que cal recordar que els dos punts per a θ=90° són els mateixos que els punts per a θ=-90°.

Exemples
La primera imatge mostra el primer pas de la transformada de Hough, de tres punts i 6 grups d'angles possibles.

 Les línies de diferents angles es tracen, tot va a través del primer punt. Aquestes es mostren com a línies contínues.
 Per a cada línia contínua, la perpendicular que divideix l'origen també es troba. Aquestes es mostren com a línies discontínues.
 La longitud i l'angle de la línia de punts després es troben.
 Els valors es mostren a la taula de continuació de cada diagrama.
 Això es repeteix per a cada un dels tres punts que es vol transformar.
 Els resultats es representen en un gràfic

La imatge següent correspon a fer la transformada de Hough per a punts al·lineats, on la brillantor de la transformada és proporcional al nombre de punts que la contribueixen.

Història
La Transformada de Hough va ser inventada inicialment per a l'anàlisi de la Càmera de bombolles(Hough, 1959).

Hough, el 1962, va inventar la transformació per a una aplicació en la detecció de les rutes de partícules subatòmiques passant per un camp de visió. Aquesta fou patentada dels Estats Units d'Amèrica (EUA) el 1962 i assignada a la Comissió d'Energia Atòmica dels EUA amb el nom de "Mètode i mitjans pel reconeixement de patrons complexos". Aquesta patent utilitza una parametrització pendent-intersecció de línies rectes, quelcom condueix a un espai transformat no fitat, ja que el pendent pot anar fins a l'infinit.

La transformada original de Hough va ser dissenyada per detectar línies rectes i corbes, aquest mètode s'utilitza només si es coneixen les equacions analítiques de les línies o corbes de vores de l'objecte. Més tard, es va descriure la transformada generalitzada de Hough (Generalised Hough Transform) que pot trobar objectes encara que no es conegui l'equació analítica de la vora.

La parametrització de la rho-theta universal que s'utilitza en l'actualitat va ser descrita per primera vegada a:

 Duda, R.O. i Hart P.E.," Use of the Hough Transformation to Detect Lines and Curves in Pictures," Comm. ACM, Vol. 15, pp. 11–15 (January, 1972), encara que ja era estàndard per a la transformació de radó com a mínim des de 1930.

La variació O'Gorman i Clowes es descriu a:
 Frank O'Gorman, MB Clowes: Finding Picture Edges Through Collinearity of Feature Points. IEEE Trans. Computers 25(4): 449-456 (1976)

La història de com la forma moderna de la transformada de Hough va ser inventada es dona a:
 Hart, P. E., "How the Hough Transform was Invented", IEEE Signal Processing Magazine, Vol 26, Issue 6, pp 18 - 22 (November, 2009).

Codi Matlab
El següent codi matlab correspon en realitzar la transformada de Hough per a la imatge de la dreta.

RGB = imread('gantrycrane.png');
 I = rgb2gray(RGB); % convert to intensity
 BW = edge(I,'canny'); % extract edges
 [H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

 % display the original image
 subplot(2,1,1);
 imshow(RGB);
 title('gantrycrane.png');

 % display the hough matrix
 subplot(2,1,2);
 imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...
 'InitialMagnification','fit');
 title('Hough transform of gantrycrane.png');
 xlabel('\theta'), ylabel('\rho');
 axis on, axis normal, hold on;
 colormap(hot);

Vegeu també
 Reconeixement d'objectes
 Reconeixement de patrons
 Matlab

Referències

Enllaços externs
 Detección de circulos
 Segmentación Transformada de Hough
 Transformada de Hough
 Tesis sobre Transformada de Hough

Algorismes
Visió artificial


text:
BEST AND WORST NEW TRACKS OF THE WEEK 05/06/2020: Terrace Martin, Rosalia &Travis Scott, Tones and I and more...
It's weekly roundup time! Can you believe that we're now halfway through 2020?
THE BEST:
'Pig Feet' – Terrace Martin ft. Denzel Curry, Kamasi Washington, G Perico and Daylyt
A number of songs have already been released in response to the death of George Floyd. This might be the most powerful of the songs released so far. It features two fiery rap verses – one from Florida rapper Denzel Curry and one from California rapper Daylyt – over a frantic instrumental made up of tumultuous live drumming and squealing sax. The video closes with a seemingly endless list of names - each one a victim of police brutality. It's pretty chilling stuff.
'Raven' – Night Hikes
I featured Night Hikes' shoegazey single 'Belltown' last year. The Seattle dream pop band has now dropped a new equally hypnotic single 'Raven', which lyrically centres around confronting climate change. Wind-like reverby vocals and oceanic washes of guitar and synth are propelled along by a stomping semi-tribal beat. It's got a mighty weight to it as it drifts along like the Earth in orbit. The track is set to appear on an upcoming EP.
'Trophy Wife' - Marie-Clo
This single from Quebec-based artist Marie-Clo draws on real life experiences of being a trophy wife to a hockey player. It features an enchanting instrumental made up of melancholy guitars and dreamy synth arpeggios. The whole track then shifts into a euphoric chorus accompanied by some upbeat choppy percussion. The vocals are hypnotic and I love the metaphor 'your heart is a turnstile'.
'I Like To Wait' – Japan, Man
Japan, Man is neither Japanese or a man (kind of like how Portugal. The Man aren't from Portugal – although they are all men). The artist is in fact a 16 year old girl from Beirut. Her charming bedroom pop sound comprises of soft vocals over a backdrop of bouncy guitars and twinkling synths (the production reminds me slightly of Mac DeMarco). The single is the title track of her new EP I Like To Wait.
'TKN' – Rosalia & Travis Scott
I'm not the biggest fan of reggaeton or Travis Scott, but this track is off-kilter enough to compensate. The abrasive snares and pitched bass make for a badass beat and I wasn't expecting Travis Scott to sing in Spanish. The bilingual banger also features some energetic vocals from Latin pop artist Rosalia.
THE WORST:
'You're So F**king Cool' – Tones and I
'Everybody's talkin' bout sex/ Everybody's talking 'bout ex/ Like no-one really wants to find a genuine connect'. Those forced rhymes are horrible, although I have to say this isn't as grating as 'Dance Monkey'.
BEST AND WORST NEW TRACKS OF THE WEEK 26/06/2020:...
Review of 'Kiss My Super Bowl Ring' by The Garden
Review of 'I'm Your Empress Of' by Empress Of
Review of 'Fetch the Bolt Cutters' by Fiona Apple
INTRODUCING: Katie Rush

redpajama_set_name: RedPajamaCommonCrawl


text:
Conference/Seminar
Honours & Awards
Mandatory Bodies
statistics@cusat.ac.in
Chief Statistician Officer, Dr. G. P. Samantha visits the department
The Chief Statistician Officer of India, Dr. G. P. Samantha, visited the department at the conclusion of the 17th National Seminar on the results of NSS 76th and 77th round of Surveys held at the Seminar Complex, Cochin University of Science and Technology, on September 1 and 2, 2022. An interaction session was conducted with him by the research scholars of the department.
CUSAT Library
Dspace CUSAT
CUSAT Alumni
Department Of Statistics,
Cochin University of Science and Technology, Cochin University P.O,
Copyrights © 2023 Department Of Statistics -CUSAT | All rights reserved | Disclaimer | Powered by CIRM


Working with a Camera Guide when you are wanting for the great camera is very important. You wish to locate a digital camera which includes all of the characteristics, functions and selections that you simply will need to go ahead and take very best shots. The guideline will help you end up picking a camera which includes the megapixels that you want also given that the zoom qualities. Keep in mind which the greater the megapixels, the higher quality your pictures might be. The best megapixels you could have right now is 12.2 on find products. When looking through the guide, you could seem for cameras by megapixels after which you can search for other available choices or options you will need.
A different matter the electronic digicam guidebook will convey to you is regarding the shooting modes plus the concentrating capabilities. Both of these characteristics are important when picking a camera. You wish to contain the ability to guide aim or depart the camera on auto concentrate. The various taking pictures modes also are essential if you decide to do different kinds of imaging together with the digital digital camera. The guideline will even convey to you about the distinctive software package that arrives with all the digicam and what working techniques the digicam will function with in terms of your laptop or computer is concerned.
Getting the electronic camera manual handy once you locate a digicam will help you with the digital digital camera checklist. It is possible to glance for the unique cameras and write the knowledge down for a comparison between all the cameras. The camera guide will notify you all the details you would like to determine which camera will operate the best for what your preferences may very well be. The one detail the guidebook can't do is notify you which digicam to get. You'll have to look at and judge which digicam has the capabilities, software package and abilities that you need to take the excellent photographs.
This entry was posted in Category and tagged camera, camera guide, digital camera on April 2, 2019 by admin.


text:
Transplantation open access articlesNeurorehabilitation Scholarly Peer-review JournalNursing Informatics Peer-review Journalsinternational-telecommunications-journalsArticles on Echocardiographynext generation automobiles applicationsopen access astrophysicsGenome videos JournalsCancer Immunotherapy Top JournalsMaxillofacial FracturesReputed Biological Engineering JournalsFood AdditivesWater PurificationLaproscopy innovationsbioanalysis peer review journals
Open Access Articles- Top Results for Ray Hill (American football)
Ray Hill (American football)
(1975-08-07) August 7, 1975 (age 44)
Position(s):
As player:

Playing stats at DatabaseFootball.com

Raymond Millous Hill (born August 7, 1975 in Detroit, Michigan) is a former college and professional American football player. He was a defensive back at Michigan State, and played four seasons in the NFL, splitting three seasons between the Miami Dolphins and the Buffalo Bills. He was signed by the New England Patriots as a free agent in 2001, and was part of their Super Bowl XXXVI championship season. He suffered a leg injury during the 2001 preseason, and was placed on injured reserve for the entire season. He has a younger brother, Renaldo Hill, who is currently a free agent.[1]
1 Early years
2 College career
3 Professional career
3.1 Buffalo Bills
3.2 Miami Dolphins
3.4 New England Patriots
Hill attended Chadsey High School in Detroit, Michigan, where he was a three-year starter at defensive back.
College career
Hill was a three-year starter (1995–1997) for the Michigan State Spartans; all three years of which he played under former head coach Nick Saban. Hill finished his Spartan career with 115 solo tackles, six interceptions, and four forced fumbles.
A second-team All-Big Ten Conference selection in 1997, Hill recorded 68 tackles (two for losses, including a sack), intercepted four passes, and led the team in fumbles caused with three. Hill set a Spartan single-season record for most passes broken up in a season with 16.
He originally signed with the Buffalo Bills as an undrafted rookie free agent on April 24, 1998. Hill saw action in four games, all as a reserve, where he totaled three special teams tackles.
Was awarded to Miami Dolphins off waivers from the Buffalo Bills on November 19, 1998. Hill played in two regular season games and the first two postseason games of his career with the Dolphins.
In 1999 Hill appeared in all 16 regular season games. Recording one tackle and a pass defense on defense. Hill finished sixth on the team with 14 tackles on special teams, where he also forced a fumble. Hill appeared in both playoff games following the 1999 season in a reserve role.
Hill re-signed with the Miami Dolphins as an exclusive rights free agent on May 5, 2000. During the 2000 season, Hill recorded seven special teams tackles ( 5 solos, 2 assists), and one pass defense on defense, before being released by the Miami Dolphins on October 25, 2000.
On November 22, 2000, Hill return to the Buffalo Bills as a free agent and saw action on special teams during the final five weeks of the season, recording four special teams tackles.
Granted free agency on March 1, 2001, Hill re-sgined with the Buffalo Bills and was waived on June 1, 2001.
On June 11, 2001, Hill was claimed of waivers by the New England Patriots from the Buffalo Bills. Hill suffered a leg injury on August 18, 2001, during a preseason game against the Carolina Panthers. On August 28, 2001, Hill was placed on injured reserve.
^ "Renaldo Hill, SS at NFL.com". Nfl.com. Retrieved 2011-09-08.
New England Patriots Super Bowl XXXVI Champions
4 Adam Vinatieri
11 Drew Bledsoe
12 Tom Brady (MVP)
13 Ken Walter
14 Walter Williams
15 Jimmy Farris
16 Scott McCready
19 Damon Huard
21 J. R. Redmond
22 Terrance Shaw
23 Antwan Harris
24 Ty Law
25 Leonard Myers
26 Matt Stevens
27 Terrell Buckley
28 Brock Williams
29 Hakim Akbar
30 Jerod Cherry
31 Ben Kelly
32 Antowain Smith
33 Kevin Faulk
34 Tebucky Jones
35 Patrick Pass
36 Lawyer Milloy
38 Ray Hill
44 Marc Edwards
45 Otis Smith
48 Arther Love
49 Jabari Holloway
50 Mike Vrabel
51 Bryan Cox
52 Ted Johnson
53 Larry Izzo
54 Tedy Bruschi
55 Willie McGinest
58 Matt Chatham
59 Andy Katzenmoyer
60 Drew Inzer
61 Stephen Neal
62 Setema Gali
63 Joe Andruzzi
64 Greg Randall
65 Damien Woody
66 Lonie Paxton
67 Grey Ruegamer
68 Tom Ashworth
70 Adrian Klemm
71 Chris Sullivan
72 Matt Light
74 Kenyatta Jones
75 Maurice Anderson
76 Grant Williams
77 Mike Compton
80 Troy Brown
81 Charles Johnson
82 Curtis Jackson
83 Rod Rutledge
84 Fred Coleman
85 Jermaine Wiggins
86 David Patten
88 Terry Glenn
90 Marty Moore
91 Bobby Hamilton
92 David Nugent
93 Richard Seymour
94 Jace Sayler
95 Roman Phifer
96 Brandon Mitchell
97 Riddick Parker
98 Anthony Pleasant
99 Kole Ayi
Head Coach: Bill Belichick
Coaches: Ned Burke
Romeo Crennel
Brian Daboll
Jeff Davidson
Ivan Fears
Pepper Johnson
Eric Mangini
Randy Melvin
Markus Paul
Dante Scarnecchia
Brad Seely
Charlie Weis
Mike Woicik
Name Hill, Ray
Short description American football player
Date of birth August 7, 1975
Place of birth Detroit, MI
This page is based on the copyrighted Wikipedia article Ray Hill (American football); it is used under the Creative Commons Attribution-ShareAlike 3.0 Unported License (CC-BY-SA). You may redistribute it, verbatim or modified, providing that you comply with the terms of the CC-BY-SA


I used Debian "unstable" with Mozilla and Gcombust to download and burn a netinstall CD ISO image; I burned the image to CD-R media.
I swapped out the CD-ROM with another CD-ROM drive (known to be good), but this did not solve the problem.
The machine boots properly from the official Debian 3.0 CD and from a Windows-98 Second Edition CD.
Prev by Date: in russian?
Previous by thread: in russian?


The average Highway Safety & Motor Vehicle Grants Specialist Supervisor Ii - Ses salary is $61,000.08. Average Other Personal Services (OPS) Hourly Rate is -. This estimate is based upon 1 employees salary information.


Abercrombie fitch uk clothing. Blue abercrombie and fitch co. abercrombie and fitch school bag. abercrombie & fitch tshits for men.
Check out these interesting ads related to "abercrombie fitch shirts"
Edt spray 1.7 oz abercrombie & fitch first instinct by abercrombie & fitch. We offer a 2 ABERCROMBIE AND FITCH T made of international standard materials for the price of 830.11 !! Delivery available !
Edt spray 3.4 oz abercrombie & fitch first instinct by abercrombie & fitch. PRICE 12918.51 ...PRICE NEVER BEFORE asked for such high quality abercrombie fitch shirts ! this is your chance to grab it!
Nwt abercrombie & fitch a&f 2015 men muscle fit. Abercrombie & fitch first instinct by abercrombie & fitch edt spray 1.7 oz.


class="post-template-default single single-post postid-1559279 single-format-standard wpb-js-composer js-comp-ver-5.7 vc_responsive"
FALLS CITY – Steve Hoffman made a plea Monday before the Falls City council in favor of residential burning.
Hoffman called the current ordinance that allows burning two days per week reasonable and contested the idea that no one is complying with the law.
In the last two years, police have received 158 complaints related to burning.
Statistically, Hoffman said, there has been fewer than one complaint for each day burning is allowed and said that indicates that many hundred Falls City residents comply with the current ordinance.
In 2012, citizens voted to permit residential burning on a vote of 892 to 781.
Hoffman asked the council not to overturn the voice of the people.
The city council advanced the burn ban on second reading, but adopted language that would allow the Krumme Memorial Arboretum to burn off natural grass stands.
The proposed ordinance would require the fire department to keep an inventory of "special use" sites that may apply for a burn permit.


text:
TV REVIEW: 'Doctor Who: The Doctor's Wife'
by Jonathan Weilbaecher, May 17 2011
"Borrowing implies the eventual intention to return the thing that was taken. What makes you think I would ever give you back?"
-Idris
Doctor Who is a quintessential piece of British culture, and it has been for nearly a half century. A more recent contributor to that lexicon is Neil Gaiman, the mastermind behind Sandman, Stardust and Coraline. Well last year the 'Grand Moff' worked his magic again and secured Gaiman to write a season six episode of Doctor Who. Uniting two of the giants in British fantasy into one perfect, condensed episode of TV. Or is it?
Of course it is, I won't even try to fool you. 'The Doctor's Wife' is one of, if not the, best episode of Moffat and Smith's run up to this point The tone is fabulous, the writing is perfect, the acting is spectacular and the monster is every bit as threatening as he should be considering the stakes. As far as stand alone stories go, I predict this will be at or near the top of many Whovian's top lists for years to come.
So we have reached the spoiler warning portion of my review, I cannot implore you enough to see the episode first. You do yourself a disservice by not heeding that warning! More after the jump.
First things first, there is no wife. The Doctor doesn't get married and this isn't some alternate universe thing. The title is in reference to the Doctor's oldest and most loyal companion, his TARDIS. What makes this episode so profound and unique in the Who mythos is that the TARDIS is given physical (and female) form. The living matrix inside the TARDIS is transferred into the body of Idris, a helpless but willing servant of the planet house. But I fear I am getting ahead of myself.
The episode concerns itself with a TARDIS eating planet named House who lures Time Lords into a tiny bubble dimension and feasts on their ships. House has been able to trap the Time Lords by stealing their emergency beacons and storing them somewhere on the planet. Time Lord emergency beacons are essentially psychic imprints of a message stored in a tiny box and shoot into space. Of course when the Doctor receives a beacon from a fellow Time Lord, The Corsair, he gets his hopes raised unreasonably high. It is particularly difficult for The Doctor to contain himself in this case because he knows The Corsair and he is "one of the good ones." The Doctor has healthy, and fair, distrust of many Time Lords from back when they weren't all dead, so he is extra excited at the prospect of re-discovering some of his brothers who he knew to be trustworthy.
This is the where the roller coaster of emotions begins for The Doctor. So much happens in this episode that requires an exceptional range of emotion to play, and what makes this whole thing work is Matt Smith's ability as an actor. Smith owns this role and firmly establishes his grip as one of the most complex and interesting Doctors ever. It is very important that Smith is at his best here, because his version of the Doctor is given an incredibly rare honor. The chance to talk face to face with his TARDIS is so profound that it can move even the Doctor to tears, and their are tears.
For an episode as dark in style and tone as this, it also maintains a wondrous since playfulness. This is where Neil Gaiman's expertise comes into play, he has the ability to straddle the line between pitch black Gothic horror and captivating fantasy that appeals to all ages. The marriage between the eleventh Doctor and Gaiman couldn't be more perfect, because it is eleven who has taken on the darker worlds of Moffat while maintaining that strong tie to the imagination of youth that has always been a core value of the Doctor.
Gushing for Smith, Moffat and Gaiman aside, there is some one else in this episode who I want to shine a special light one. The disembodied voice of the planet known as House is played by non other than Micheal Sheen. Yes the guy who can't stop playing Tony Blair himself lends his vocals to a role that must have been difficult to fathom. Usually faceless, formless voices fail to connect from an audience perspective, they lack a certain gravitas that draws the audience in. Which all makes sense when an actor is only aloud to fall back on h is voice and nothing else. Well, one of the biggest surprises of the episode was how well House's voice was pulled off.
I give a ton of credit to Sheen first and foremost, he is clearly doing a voice that is heavily modified. But even through all the masking, he is able to convey such a sense of smug superiority that just works. He was so convincing in the role I didn't even recognize him at all during my first watch. Having that extra layer of ability placed on top of an already superbly crafted episode is the perfect icing on the cake.
"The Doctor's Wife" is destined to be one of the best episodes of the NuWho era, and honestly it probably is among the very finest stories that the show has ever produced. The perfect blend of everything anyone could ever want to see in a Doctor Who story.
Posted in: Action · BBC · Comedy · News · Reviews · Sci-Fi · TV
Tagged: BBC, BBC America, Doctor Who, Matt Smith, Micheal Sheen, Neil Gaiman, review, Sci-Fi, Steven Moffat, The Doctor's Wife, TV
One Response to "TV REVIEW: 'Doctor Who: The Doctor's Wife'"
Reaction to Series 6 Episode The Doctor's Wife, by Neil Gaiman | Kasterborous Doctor Who News says:
[…] it would have had a cast reunion at the end to bow to the audience, who on their feet would be applauding and throwing flowers. 'The Doctor's Wife' is one of, if not the, best episode of Moffat and Smith's run up to […]


text:
IMMERSIONS IN ROME
ROME VLOGS
Radio Reports from Rome
Gorgeous! This Song means so much
Amazing! These are the people usually behind the scenes. Here, a group of super talented Nashville studio singers sing, "It is Well with my Soul."
I find this song to be so moving, not only because of the message, but because of the story behind it.
Horatio Spafford wrote this song after he endured one tragedy after the next. First, was the death of his precious son. From wikipedia: "[Next was] the Great Chicago Fire of 1871, which ruined him financially (he had been a successful lawyer and had invested significantly in property in the area of Chicago that was extensively damaged by the great fire). His business interests were further hit by the economic downturn of 1873, at which time he had planned to travel to Europe with his family on the SS Ville du Havre. In a late change of plan, he sent the family ahead while he was delayed on business concerning zoning problems following the Great Chicago Fire. While crossing the Atlantic Ocean, the ship sank rapidly after a collision with a sea vessel, the Loch Earn, and all four of Spafford's daughters died. His wife Anna survived and sent him the now famous telegram, "Saved alone …". Shortly afterward, as Spafford traveled to meet his grieving wife, he was inspired to write these words as his ship passed near where his daughters had died."
This song inspires me to remember the importance of staying at peace despite ripples in the sea.
Be sure to sign up to never miss an Our Crazy Rome Life blog update from bella Roma!
#coronavirus #Italy #Rome
Pizza in a cone?
RR - Palermo floods, Italy & COVID
Poor Proculus lost his head here; lost saints of Italy


Highlights from the video-game retailer's latest earnings call.
There isn't much certainty around GameStop's (NYSE:GME) business right now. The specialty retailer lacks a permanent CEO and is exploring a sale that might (or might not) result in its removal from public markets. Meanwhile, sales and profit margins are declining as the company struggles with unfavorable shifts in the video-game market and spotty performances by its newer business lines.
Against that risky backdrop, interim CEO Shane Kim held a conference call with investors to discuss GameStop's latest operating trends and its plans for the back half of the year. Below are three key highlights from that presentation.
GameStop met executives' high-level targets as sales at existing locations were roughly flat to mark a solid improvement over the prior quarter's 5% slump. Yet, digging a bit deeper, its results described a business that's still struggling with uneven demand.
The new and pre-owned software segments both declined, and that shift combined with an increase in low-margin hardware sales to send profitability lower for the video-game unit and the broader business.
GME Operating Margin (TTM) data by YCharts.
The collectibles business endured weaker traffic and lower gross margins, but it posted steady sales growth. GameStop's consumer tech segment had mixed results, too, with sales falling 10% but earnings improving significantly.
GameStop affirmed its full-year outlook that calls for sales to range from flat to a decline of 5% as adjusted earnings come in between $3 per share and $3.35 per share. The profit total through the first half of the year amounts to just $0.43 per share, though, which means nearly 90% of earnings will come over the next six months.
The retailer pointed investors toward a stacked pipeline of video-game releases in franchises like Call of Duty, Battlefield, Super Mario Party, and NBA 2K as support for that aggressive outlook. Their optimism extends to the collectibles division, too, and to an accessories segment that's being lifted right now by the popularity of Fortnite.
Executives didn't have any concrete updates to share about the ongoing talks with potential buyers of the business. Instead, the management team is asking for patience from investors as they go through a process that might not result in any transaction. If those talks break down, other key questions going forward start with the retailer's choice of a new chief executive.
GameStop tried to assure shareholders that whatever path the company lands on will have healthy returns as its guiding force. "We have a long track record of being a shareholder-friendly company, and we'll continue to be," Lloyd said. "We appreciate the support of our long-term shareholders as we navigate the changes in our organization and our ongoing strategic review."


Welcome to my intro video on AJNA, the THIRD EYE Chakra which governs your Mental energy and Thought Patterns. The Third Eye chakra influences your Pituary gland, the master gland for your whole ENDOCRINE System and thus how effective your hormonal function is. It also influences your Cerebrum, the thinking aspect of your brain.
As Ajana chakra is situated between the Left and Right lobes of your brain, it helps to ensure more balance in your thought processes by expanding right brain function. This enhances Visual Perception, Imagery, Imagination, Intuition, Insight as well as Dream recall among other more psychic senses.
In Chakra Yoga classes we use visual concentration and guided meditation techniques to activate the Third Eye among other techniques. Check out the video to learn more, join the Chakra Yoga course or on-going classes in Penang, Malaysia.
Welcome to my mini series introducing Chakra Yoga and the respective chakras. The THROAT Chakra or VISHUDDHA in Sankrit, is a very interesting, yet complex chakra, as it is the purview of d VERBAL MIND n sound.
At the physiological level, the Throat chakra influences the Thyroid and Parathyroid glands governing one's metabolism, body temperature, rate of vibration of organs n cells, as well as the efficient movement of calcium in and out of one's blood stream.
At the mental emotional level d Throat Chakra governs the energy of your Words, quality of your Voice, energy of your Verbal Thoughts and everything to do with your verbal mind and Manifestation. Chakra yoga practices use Sound such as toning, humming, Affirmations, mantras and a variety of concentration techniques to shift your mental energy and thus your overall frequency from a lower state to a higher vibrational state. It also teaches how your can change your life by changing your thoughts n words… As u learn about the Throat Chakra you enter more deeply into the realm of body-mind connections and the higher chakras. Namaste!
Presenting the HEART CHAKRA in this mini series of Chakra Yoga videos. ANAHATA, in Sankrit is the centre chakra connected to your physical heart, lungs and skin. It is also the energy centre for your Social Identity and allows you to live life from a Heart-based centre. Heart chakra movements involve heart openers, back bends and flowing arm movements that are in sync with your breath. The Heart Chakra is connected to the AIR element and does best with deep breathing into the mid chest or rib cage area.
Come join me to learn more about the Heart chakra and other chakras to live life with more balance. Check out my website www.transformwithsarahjoy.com and facebook Chakra Yoga & Energy Healing for more details. Namaste!
Welcome to d SOLAR PLEXUS or Manipura Chakra connected to your Digestive system and your Ego Personality Self. Having a strong solar plexus chakra ensures a healthy digestive function as well as energy, confidence and vitality to carry out your daily activities and plans. Here's some ideas on how to work with your solar plexus chakra via Chakra Yoga by Sarah-Joy Amin.
Introducing the Sacral Chakra and how you can activate your sacral chakra and embrace the water element in your body. What better way to work with your SACRAL CHAKRA than to be in the cool, flowing reinvigorating energy of Water. Water is the element of the Sacral Chakra inviting you to flow with life, to be flexible, move, dance, breathe n enjoy a balance sense of pleasure. It's your Emotional Identity. This is the second of a 7 part series of mini videos on Chakra Yoga.
For more info check out my Chakra Yoga & Energy Healing fb n website: TransforwithSarahJoy.com. Namaste!
A brief introduction to how Chakra Yoga practices can activate the Root Chakra through asana and connection with the Earth element. Video by Sarah-Joy Amin, Chakra Yoga instructor and Energy and Sound Healer.
Introduction to Chakra Yoga and classes by Sarah-Joy Amin based in Penang, Malaysia. My classes are based on the teachings of my master David Goulet, founder of Pyramid Yoga centre, Thailand.


text: Q: Is it possible to show custom dialog on top of Chrome Custom Tabs? I would like to show a custom dialog for network connectivity issue on top of Chrome Custom Tabs, which is already launched and loaded my login content.

redpajama_set_name: RedPajamaStackExchange


It's been 26 years since the Edmonton Oilers and Calgary Flames faced each other in the playoffs. The Battle of Alberta is still fierce in the eyes of the fans, but it's cooled substantially in terms of relevance on the ice.
This year, with both teams in a playoff spot, we are staring down the possibility of a first round match-up between these cross-provincial rivals. There is some jockeying still to go, because the Flames would have to overtake the Anaheim Ducks in the standings, and stay there. But there's a chance. And it would be glorious.
At this point, making the playoffs is the goal, and the opponent doesn't matter. The players especially would tell us that. But it's hard to ignore the possibilities. The Oilers are in second place in the Pacific Division with 78 points. The Flames are fourth with 76 points. They're tied with the Ducks, but have one more game played. They've also been red-hot as of late, winning their last seven in a row.
The crazy thing is that there are no guarantees either team makes the playoffs. The Los Angeles Kings, St. Louis Blues and Winnipeg Jets all have their sights set on making the postseason, meaning both the Oilers and Flames have to keep pace to hold their spots. And although it's looking good, it's far too soon to celebrate.
I want the #Flames in the playoffs, nothing better than a playoff BOA! Don't care if they finish ahead or behind us. As long as we make it..
The Flames remaining schedule includes three games against the Kings, and two against the Ducks. Those will be huge in terms of positioning. They also appear to be trending upwards, while the Ducks have been faltering, going 5-5 in their last 10 contests. The Oilers and Flames don't face each other again in the regular season.
At this point I'm actively cheering for the Flames to play the Oilers in the playoffs so that we can all watch Western Canada burn.
For the Oilers, just being in the playoffs would mean everything. The last time they played postseason hockey was in 2006. Many of the core guys on the roster have never played in a playoff game. It's huge for the franchise, fans and the players alike. Obviously you don't want to count your chickens before they hatch, but with the season starting to wind down, looking at possible playoff match-ups is finally realistic.
Oilers now with 78 points. Seven more wins will do it. Maybe six. But goal should be opening at home in the playoffs. That might take 10-11.
The Flames and Oilers have faced each other five times in the playoffs, with the Oilers winning four of those series. The lone Flames win came on the heels of Steve Smith's infamous "own goal" in 1986, so you could argue that Edmonton has had the upper hand over their bitter rivals. The regular season edge, however, would go to Calgary. They have a 107-90-18 record over the Oilers.
Many young fans of the current Flames and Oilers would have little recollection of the last time these teams faced each other in a playoff series. But there is clearly no love lost between them, despite neither team having a lot of overall success as of late. Calgary has made the playoffs five times since the lock-out season of 2005, and the Oilers have qualified just once in that same time frame.
We are moving towards a possible Oilers vs Flames playoff battle. Sign me up!!!
Despite the venom from the fans, the intensity of the rivalry on the ice hasn't been the same. A playoff series can change that very quickly, and there's nothing like a postseason bout to re-ignite one of the best rivalries in sports. Fans of both teams will tell you that they don't care who the opponent is, as long as their team is in the playoffs. But you can bet that they'll be fired up if this series does happen.
A lot has to go right for this match-up to happen, and it appears as though the hockey world is chomping at the bit to see it come to fruition. The next month will start to bring the playoff picture in a clearer view. Until then, we can only hope.


text:
SAMUELI
Samueli Mechanical and Aerospace Engineering 101
Department Mission and Goals
SCHEDULE IT conference room booking
FACULTY AND POST-DOCTORAL POSITIONS
Paid Summer Research Programs | NSF, NASA, NIH, etc. — 600+ programs
Support Our Mission (Giving)
MAE Fall 2022 Newsletter
MAExMSE Career Fair
Department Announcements
Annual Reports Archives 2005-2017
ABET — Undergraduate Objectives and Outcomes
Graduate Programs and Preliminary Exams
MS Graduation Checklist
PhD Graduation Checklist
Outstanding Degree Awards
APL/SA Branch College Recruitment Opportunities
Vishal Parikh Scholarship
Bill Klug Scholarship
Professional Society Fellows
Alumni NAE Members
Comments from alumni on their Student Group Experiences
Companies hiring MAE alumni
PROPOSAL PI Questionnaire
UCLA-Led Research Unearths Obscure Heat Transfer Behaviors
Discovery shows heat movement slowing down under extreme pressure instead of speeding up.
UCLA researchers and their colleagues have discovered a new physics principle governing how heat transfers through materials, and the finding contradicts the conventional wisdom that heat always moves faster as pressure increases.
Up until now, the common belief has held true in recorded observations and scientific experiments involving different materials such as gases, liquids and solids.
The researchers detailed their discovery in a study published last week by Nature. They have found that boron arsenide, which has already been viewed as a highly promising material for heat management and advanced electronics, also has a unique property. After reaching an extremely high pressure that is hundreds of times greater than the pressure found at the bottom of the ocean, boron arsenide's thermal conductivity actually begins to decrease.
The results suggest that there might be other materials experiencing the same phenomenon under extreme conditions. The advance may also lead to novel materials that could be developed for smart energy systems with built-in "pressure windows" so that the system only switches on within a certain pressure range before shutting off automatically after reaching a maximum pressure point.
"This fundamental research finding shows that the general rule of pressure dependence starts to fail under extreme conditions," said study leader Yongjie Hu, an associate professor of mechanical and aerospace engineering at the UCLA Samueli School of Engineering. "We expect that this study will not only provide a benchmark for potentially revising current understanding of heat movement, but it could also impact established modeling predictions for extreme conditions, such as those found in the Earth's interior, where direct measurements are not possible."
According to Hu, the research breakthrough may also lead to retooling of standard techniques used in shock wave studies.
Similar to how a sound wave travels through a rung bell, heat travels through most materials by way of atomic vibrations. As pressure squeezes atoms inside a material closer together, it enables heat to move through the material faster, atom by atom, until its structure breaks down or transforms to another phase.
Thermal conductivity measured from in-situ spectroscopy experiment showing the activity slowing down under high pressure.
The H-Lab/UCLA.
That is not the case, however, with boron arsenide. The research team observed that heat started to move slower under extreme pressure, suggesting a possible interference caused by different ways the heat vibrates through the structure as pressure mounts, similar to overlapping waves cancelling out each other. Such interference involves higher-order interactions that cannot be explained by textbook physics.
The results also suggest that the thermal conductivity of minerals can reach a maximum after a certain pressure range. "If applicable to planetary interiors, this may suggest a mechanism for an internal "thermal window" — an internal layer within the planet where the mechanisms of heat flow are different from those below and above it," says co-author Abby Kavner, a professor of earth, planetary and space sciences at UCLA. "A layer like this may generate interesting dynamic behavior in the interiors of large planets."
To achieve the extremely high-pressure environment for their heat-transfer demonstrations, the researchers placed and compressed a boron arsenide crystal between two diamonds in a controlled chamber. They then utilized quantum theory and several advanced imaging techniques, including ultrafast optics and inelastic X-ray scattering measurements, to observe and validate the previously unknown phenomenon.
Mechanical engineering graduate students Suixuan Li, Zihao Qin, Huan Wu and Man Li from Hu's research group are the study's co-lead authors. Other authors are Kavner, Martin Kunz of Lawrence Berkeley National Laboratory and Ahmet Alatas of Argonne National Laboratory.
The study was funded by the National Science Foundation, the Alfred P. Sloan Foundation and a V.M. Watanabe Excellence in Research Award from UCLA Samueli. Some experiments were conducted at two U.S. Department of Energy facilities — the Advanced Photon Source at Argonne National Laboratory and the Advanced Light Source at Lawrence Berkeley National Laboratory. Computational services were provided by UCLA Institute for Digital Research and Education and the National Science Foundation. The authors also received support from the Nanoelectronics Research Facility and California NanoSystems Institute (CNSI) at UCLA. Both Hu and Kavner are members of CNSI.
© Copyright 2023 UCLA Samueli School Of Engineering


text:
using ::testing::_;
using ::testing::DoAll;
using ::testing::Invoke;
using ::testing::Return;
using ::testing::WithoutArgs;

namespace device {

namespace {

using TestMakeCredentialRequestCallback = test::StatusAndValuesCallbackReceiver<
    MakeCredentialStatus,
    absl::optional<AuthenticatorMakeCredentialResponse>,
    const FidoAuthenticator*>;

}  // namespace

class FidoMakeCredentialHandlerTest : public ::testing::Test {
 public:
  FidoMakeCredentialHandlerTest() {
    mock_adapter_ =
        base::MakeRefCounted<::testing::NiceMock<MockBluetoothAdapter>>();
    BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter_);
  }

  void ForgeDiscoveries() {
    discovery_ = fake_discovery_factory_->ForgeNextHidDiscovery();
    nfc_discovery_ = fake_discovery_factory_->ForgeNextNfcDiscovery();
    platform_discovery_ = fake_discovery_factory_->ForgeNextPlatformDiscovery();
  }

  std::unique_ptr<MakeCredentialRequestHandler> CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria authenticator_selection_criteria = {}) {
    ForgeDiscoveries();
    PublicKeyCredentialRpEntity rp(test_data::kRelyingPartyId);
    PublicKeyCredentialUserEntity user(
        fido_parsing_utils::Materialize(test_data::kUserId));
    PublicKeyCredentialParams credential_params(
        std::vector<PublicKeyCredentialParams::CredentialInfo>(1));

    auto request_parameter = CtapMakeCredentialRequest(
        test_data::kClientDataJson, std::move(rp), std::move(user),
        std::move(credential_params));

    MakeCredentialOptions options(authenticator_selection_criteria);
    options.allow_skipping_pin_touch = true;

    auto handler = std::make_unique<MakeCredentialRequestHandler>(
        fake_discovery_factory_.get(), supported_transports_,
        std::move(request_parameter), std::move(options), cb_.callback());
    if (pending_mock_platform_device_) {
      platform_discovery_->AddDevice(std::move(pending_mock_platform_device_));
      platform_discovery_->WaitForCallToStartAndSimulateSuccess();
    }
    return handler;
  }

  void ExpectAllowedTransportsForRequestAre(
      MakeCredentialRequestHandler* request_handler,
      base::flat_set<FidoTransportProtocol> transports) {
    using Transport = FidoTransportProtocol;
    if (base::Contains(transports, Transport::kUsbHumanInterfaceDevice))
      discovery()->WaitForCallToStartAndSimulateSuccess();
    if (base::Contains(transports, Transport::kNearFieldCommunication))
      nfc_discovery()->WaitForCallToStartAndSimulateSuccess();

    task_environment_.FastForwardUntilNoTasksRemain();
    EXPECT_FALSE(callback().was_called());

    if (!base::Contains(transports, Transport::kUsbHumanInterfaceDevice))
      EXPECT_FALSE(discovery()->is_start_requested());
    if (!base::Contains(transports, Transport::kNearFieldCommunication))
      EXPECT_FALSE(nfc_discovery()->is_start_requested());

    EXPECT_THAT(
        request_handler->transport_availability_info().available_transports,
        ::testing::UnorderedElementsAreArray(transports));
  }

  test::FakeFidoDiscovery* discovery() const { return discovery_; }
  test::FakeFidoDiscovery* nfc_discovery() const { return nfc_discovery_; }
  TestMakeCredentialRequestCallback& callback() { return cb_; }

  void set_mock_platform_device(std::unique_ptr<MockFidoDevice> device) {
    pending_mock_platform_device_ = std::move(device);
  }

  void set_supported_transports(
      base::flat_set<FidoTransportProtocol> transports) {
    supported_transports_ = std::move(transports);
  }

 protected:
  base::test::TaskEnvironment task_environment_{
      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
  std::unique_ptr<test::FakeFidoDiscoveryFactory> fake_discovery_factory_ =
      std::make_unique<test::FakeFidoDiscoveryFactory>();
  raw_ptr<test::FakeFidoDiscovery> discovery_;
  raw_ptr<test::FakeFidoDiscovery> nfc_discovery_;
  raw_ptr<test::FakeFidoDiscovery> platform_discovery_;
  scoped_refptr<::testing::NiceMock<MockBluetoothAdapter>> mock_adapter_;
  std::unique_ptr<MockFidoDevice> pending_mock_platform_device_;
  TestMakeCredentialRequestCallback cb_;
  base::flat_set<FidoTransportProtocol> supported_transports_ = {
      FidoTransportProtocol::kUsbHumanInterfaceDevice,
      FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy,
      FidoTransportProtocol::kNearFieldCommunication,
      FidoTransportProtocol::kInternal,
  };
};

TEST_F(FidoMakeCredentialHandlerTest, TransportAvailabilityInfo) {
  auto request_handler = CreateMakeCredentialHandler();

  EXPECT_EQ(request_handler->transport_availability_info().request_type,
            FidoRequestType::kMakeCredential);
}

TEST_F(FidoMakeCredentialHandlerTest, TransportAvailabilityInfoRk) {
  for (const auto rk : {ResidentKeyRequirement::kDiscouraged,
                        ResidentKeyRequirement::kPreferred,
                        ResidentKeyRequirement::kRequired}) {
    auto request_handler =
        CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
            AuthenticatorAttachment::kAny, rk,
            UserVerificationRequirement::kPreferred));
    EXPECT_EQ(
        request_handler->transport_availability_info().resident_key_requirement,
        rk);
  }
}

TEST_F(FidoMakeCredentialHandlerTest, TestCtap2MakeCredential) {
  auto request_handler = CreateMakeCredentialHandler();
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      test_data::kTestMakeCredentialResponse);
  discovery()->AddDevice(std::move(device));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

// Test a scenario where the connected authenticator is a U2F device.
TEST_F(FidoMakeCredentialHandlerTest, TestU2fRegister) {
  auto request_handler = CreateMakeCredentialHandler();
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeU2fWithGetInfoExpectation();
  device->ExpectRequestAndRespondWith(
      test_data::kU2fRegisterCommandApdu,
      test_data::kApduEncodedNoErrorRegisterResponse);
  discovery()->AddDevice(std::move(device));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, U2fRegisterWithUserVerificationRequired) {
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kRequired));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeU2fWithGetInfoExpectation();
  device->ExpectRequestAndRespondWith(
      test_data::kU2fBogusRegisterCommandApdu,
      test_data::kApduEncodedNoErrorRegisterResponse);
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_EQ(MakeCredentialStatus::kAuthenticatorMissingUserVerification,
            callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, U2fRegisterWithResidentKeyRequirement) {
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kPreferred));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeU2fWithGetInfoExpectation();
  device->ExpectRequestAndRespondWith(
      test_data::kU2fBogusRegisterCommandApdu,
      test_data::kApduEncodedNoErrorRegisterResponse);
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_EQ(MakeCredentialStatus::kAuthenticatorMissingResidentKeys,
            callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, UserVerificationRequirementNotMet) {
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kRequired));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation(
      test_data::kTestGetInfoResponseWithoutUvSupport);
  device->ExpectRequestAndRespondWith(
      MockFidoDevice::EncodeCBORRequest(AsCTAPRequestValuePair(
          MakeCredentialTask::GetTouchRequest(device.get()))),
      test_data::kTestMakeCredentialResponse);
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_EQ(MakeCredentialStatus::kAuthenticatorMissingUserVerification,
            callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, CrossPlatformAttachment) {
  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kCrossPlatform,
                                     ResidentKeyRequirement::kDiscouraged,
                                     UserVerificationRequirement::kPreferred));

  // kCloudAssistedBluetoothLowEnergy not yet supported for MakeCredential.
  ExpectAllowedTransportsForRequestAre(request_handler.get(), {
    FidoTransportProtocol::kNearFieldCommunication,
#if BUILDFLAG(IS_CHROMEOS_ASH)
        // CrOS tries to instantiate a platform authenticator for cross-platform
        // requests if enabled via enterprise policy.
        FidoTransportProtocol::kInternal,
#endif
        FidoTransportProtocol::kUsbHumanInterfaceDevice
  });
}

TEST_F(FidoMakeCredentialHandlerTest, PlatformAttachment) {
  // Add a platform device to trigger the transport actually becoming available.
  // We don't care about the result of the request.
  auto platform_device = MockFidoDevice::MakeCtapWithGetInfoExpectation(
      test_data::kTestGetInfoResponsePlatformDevice);
  platform_device->SetDeviceTransport(FidoTransportProtocol::kInternal);
  platform_device->ExpectCtap2CommandAndDoNotRespond(
      CtapRequestCommand::kAuthenticatorMakeCredential);
  EXPECT_CALL(*platform_device, Cancel(_));
  set_mock_platform_device(std::move(platform_device));

  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kPlatform,
                                     ResidentKeyRequirement::kDiscouraged,
                                     UserVerificationRequirement::kRequired));

  ExpectAllowedTransportsForRequestAre(request_handler.get(),
                                       {FidoTransportProtocol::kInternal});
}

TEST_F(FidoMakeCredentialHandlerTest, ResidentKeyRequirementNotMet) {
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kPreferred));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation(
      test_data::kTestGetInfoResponseWithoutResidentKeySupport);
  device->ExpectRequestAndRespondWith(
      MockFidoDevice::EncodeCBORRequest(AsCTAPRequestValuePair(
          MakeCredentialTask::GetTouchRequest(device.get()))),
      test_data::kTestMakeCredentialResponse);

  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_EQ(MakeCredentialStatus::kAuthenticatorMissingResidentKeys,
            callback().status());
}

MATCHER(IsResidentKeyRequest, "") {
  if (arg.empty() ||
      arg[0] != base::strict_cast<uint8_t>(
                    CtapRequestCommand::kAuthenticatorMakeCredential)) {
    return false;
  }

  base::span<const uint8_t> param_bytes(arg);
  param_bytes = param_bytes.subspan(1);
  const auto maybe_map = cbor::Reader::Read(param_bytes);
  if (!maybe_map || !maybe_map->is_map()) {
    return false;
  }
  const auto& map = maybe_map->GetMap();

  const auto options_it = map.find(cbor::Value(7));
  if (options_it == map.end() || !options_it->second.is_map()) {
    LOG(ERROR) << "options missing or not a map";
    return false;
  }
  const auto& options = options_it->second.GetMap();

  const auto rk_it = options.find(cbor::Value("rk"));
  if (rk_it == options.end() || !rk_it->second.is_bool() ||
      !rk_it->second.GetBool()) {
    LOG(ERROR) << "rk option missing, wrong type, or false";
    return false;
  }

  return true;
}

// Matches a CTAP command that is:
// * A valid make credential request,
// * if |is_uv| is true,
//   * with an options map present,
//   * and options.uv present and true.
// * if |is_uv_| is false,
//   * with an options map not present,
//   * or options.uv not present or false.
MATCHER_P(IsUvRequest, is_uv, "") {
  if (arg.empty() ||
      arg[0] != base::strict_cast<uint8_t>(
                    CtapRequestCommand::kAuthenticatorMakeCredential)) {
    *result_listener << "not make credential";
    return false;
  }

  base::span<const uint8_t> param_bytes(arg);
  param_bytes = param_bytes.subspan(1);
  const auto maybe_map = cbor::Reader::Read(param_bytes);
  if (!maybe_map || !maybe_map->is_map()) {
    *result_listener << "not a map";
    return false;
  }
  const auto& map = maybe_map->GetMap();

  const auto options_it = map.find(cbor::Value(7));
  if (options_it == map.end() || !options_it->second.is_map()) {
    return is_uv == false;
  }
  const auto& options = options_it->second.GetMap();

  const auto uv_it = options.find(cbor::Value("uv"));
  if (uv_it == options.end()) {
    return is_uv == false;
  }

  if (!uv_it->second.is_bool()) {
    *result_listener << "'uv' is not a boolean";
    return false;
  }

  return uv_it->second.GetBool() == is_uv;
}

ACTION_P(Reply, reply) {
  base::ThreadTaskRunnerHandle::Get()->PostTask(
      FROM_HERE,
      base::BindOnce(
          [](base::OnceCallback<void(absl::optional<std::vector<uint8_t>>)>
                 callback,
             std::vector<uint8_t> reply_bytes) {
            std::move(callback).Run(std::move(reply_bytes));
          },
          std::move(arg1), std::vector<uint8_t>(reply.begin(), reply.end())));
}

TEST_F(FidoMakeCredentialHandlerTest, ResidentKeyCancelOtherAuthenticator) {
  // Create two internal-UV authenticators and trigger a resident-key
  // MakeCredential request which will go to both of them. Ensure that the other
  // is canceled when one completes. This is the scenario when cancelation is
  // most important: we don't want a stray touch to create a resident credential
  // on a second authenticator.
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kRequired));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device1 = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  auto device2 = MockFidoDevice::MakeCtapWithGetInfoExpectation();

  const FidoDevice::CancelToken token = 10;
  EXPECT_CALL(*device1, DeviceTransactPtr(IsResidentKeyRequest(), _))
      .WillOnce(Return(token));
  // The Cancel call should have the same CancelToken as was returned in the
  // previous line.
  EXPECT_CALL(*device1, Cancel(token));

  EXPECT_CALL(*device2, DeviceTransactPtr(IsResidentKeyRequest(), _))
      .WillOnce(DoAll(Reply(base::span<const uint8_t>(
                          test_data::kTestMakeCredentialResponse)),
                      Return(token + 1)));

  discovery()->AddDevice(std::move(device1));
  discovery()->AddDevice(std::move(device2));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, ResidentKeyCancel) {
  // Create an internal-UV authenticator and trigger a resident-key
  // MakeCredential request. Ensure that a cancelation is received if the
  // request handler is deleted. When a user cancels, we don't want a stray
  // touch creating a resident key.
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kRequired));

  auto delete_request_handler = [&request_handler]() {
    base::ThreadTaskRunnerHandle::Get()->PostTask(
        FROM_HERE,
        base::BindOnce(
            [](std::unique_ptr<MakeCredentialRequestHandler>* unique_ptr) {
              unique_ptr->reset();
            },
            &request_handler));
  };

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  const FidoDevice::CancelToken token = 10;
  EXPECT_CALL(*device, DeviceTransactPtr(IsResidentKeyRequest(), _))
      .WillOnce(
          DoAll(WithoutArgs(Invoke(delete_request_handler)), Return(token)));
  EXPECT_CALL(*device, Cancel(token));

  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::move(device));
  base::RunLoop().RunUntilIdle();
  EXPECT_FALSE(request_handler);
}

TEST_F(FidoMakeCredentialHandlerTest,
       AuthenticatorSelectionCriteriaSatisfiedByCrossPlatformDevice) {
  set_supported_transports({FidoTransportProtocol::kUsbHumanInterfaceDevice});
  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kCrossPlatform,
                                     ResidentKeyRequirement::kRequired,
                                     UserVerificationRequirement::kRequired));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      test_data::kTestMakeCredentialResponse);
  discovery()->AddDevice(std::move(device));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());

  EXPECT_THAT(
      request_handler->transport_availability_info().available_transports,
      ::testing::UnorderedElementsAre(
          FidoTransportProtocol::kUsbHumanInterfaceDevice));
}

TEST_F(FidoMakeCredentialHandlerTest,
       AuthenticatorSelectionCriteriaSatisfiedByPlatformDevice) {
  set_supported_transports({FidoTransportProtocol::kInternal});
  auto platform_device = MockFidoDevice::MakeCtap(
      ReadCTAPGetInfoResponse(test_data::kTestGetInfoResponsePlatformDevice));
  platform_device->SetDeviceTransport(FidoTransportProtocol::kInternal);
  EXPECT_CALL(*platform_device, GetId())
      .WillRepeatedly(testing::Return("device0"));
  platform_device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorGetInfo,
      test_data::kTestGetInfoResponsePlatformDevice);
  platform_device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      test_data::kTestMakeCredentialResponse);
  set_mock_platform_device(std::move(platform_device));

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kPlatform, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kRequired));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());

  EXPECT_THAT(
      request_handler->transport_availability_info().available_transports,
      ::testing::UnorderedElementsAre(FidoTransportProtocol::kInternal));
}

// A platform authenticator is ignored for cross-platform requests.
TEST_F(FidoMakeCredentialHandlerTest,
       CrossPlatformAuthenticatorPretendingToBePlatform) {
  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kCrossPlatform,
                                     ResidentKeyRequirement::kDiscouraged,
                                     UserVerificationRequirement::kPreferred));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation(
      test_data::kTestGetInfoResponsePlatformDevice);
#if BUILDFLAG(IS_CHROMEOS_ASH)
  // CrOS will dispatch to a platform authenticator and one can be
  // instantiated in such cases if enabled via enterprise policy.
  device->ExpectCtap2CommandAndRespondWithError(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      CtapDeviceResponseCode::kCtap2ErrOperationDenied);
#endif
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
#if BUILDFLAG(IS_CHROMEOS_ASH)
  EXPECT_TRUE(callback().was_called());
#else
  EXPECT_FALSE(callback().was_called());
#endif
}

// A platform authenticator claiming to be a cross-platform authenticator as per
// its GetInfo response is rejected.
TEST_F(FidoMakeCredentialHandlerTest,
       PlatformAuthenticatorPretendingToBeCrossPlatform) {
  auto platform_device = MockFidoDevice::MakeCtap(
      ReadCTAPGetInfoResponse(test_data::kTestAuthenticatorGetInfoResponse));
  platform_device->SetDeviceTransport(FidoTransportProtocol::kInternal);
  EXPECT_CALL(*platform_device, GetId())
      .WillRepeatedly(testing::Return("device0"));
  platform_device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorGetInfo,
      test_data::kTestAuthenticatorGetInfoResponse);
  set_mock_platform_device(std::move(platform_device));

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kPlatform, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kRequired));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_FALSE(callback().was_called());
}

TEST_F(FidoMakeCredentialHandlerTest, SupportedTransportsAreOnlyNfc) {
  const base::flat_set<FidoTransportProtocol> kNfc = {
      FidoTransportProtocol::kNearFieldCommunication,
  };

  set_supported_transports(kNfc);
  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kCrossPlatform,
                                     ResidentKeyRequirement::kDiscouraged,
                                     UserVerificationRequirement::kPreferred));

  ExpectAllowedTransportsForRequestAre(request_handler.get(), kNfc);
}

TEST_F(FidoMakeCredentialHandlerTest, IncorrectRpIdHash) {
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kPreferred));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      test_data::kTestMakeCredentialResponseWithIncorrectRpIdHash);
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_FALSE(callback().was_called());
}

// Tests that only authenticators with resident key support will successfully
// process MakeCredential request when the relying party requires using resident
// keys in AuthenicatorSelectionCriteria.
TEST_F(FidoMakeCredentialHandlerTest,
       SuccessfulMakeCredentialWithResidentKeyOption) {
  VirtualCtap2Device::Config config;
  config.resident_key_support = true;
  config.internal_uv_support = true;
  auto state = base::MakeRefCounted<VirtualFidoDevice::State>();
  state->fingerprints_enrolled = true;

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kPreferred));

  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::make_unique<VirtualCtap2Device>(
      std::move(state), std::move(config)));

  task_environment_.FastForwardUntilNoTasksRemain();
  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

// Tests that MakeCredential request fails when asking to use resident keys with
// authenticators that do not support resident key.
TEST_F(FidoMakeCredentialHandlerTest,
       MakeCredentialFailsForIncompatibleResidentKeyOption) {
  auto device = std::make_unique<VirtualCtap2Device>();
  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kRequired,
          UserVerificationRequirement::kPreferred));

  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_EQ(MakeCredentialStatus::kAuthenticatorMissingResidentKeys,
            callback().status());
}

// If a device with transport type kInternal returns a
// CTAP2_ERR_OPERATION_DENIED error, the request should complete with
// MakeCredentialStatus::kUserConsentDenied.
TEST_F(FidoMakeCredentialHandlerTest,
       TestRequestWithOperationDeniedErrorPlatform) {
  auto platform_device = MockFidoDevice::MakeCtapWithGetInfoExpectation(
      test_data::kTestGetInfoResponsePlatformDevice);
  platform_device->SetDeviceTransport(FidoTransportProtocol::kInternal);
  platform_device->ExpectCtap2CommandAndRespondWithError(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      CtapDeviceResponseCode::kCtap2ErrOperationDenied);
  set_mock_platform_device(std::move(platform_device));

  auto request_handler = CreateMakeCredentialHandler(
      AuthenticatorSelectionCriteria(AuthenticatorAttachment::kPlatform,
                                     ResidentKeyRequirement::kDiscouraged,
                                     UserVerificationRequirement::kPreferred));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_TRUE(callback().was_called());
  EXPECT_EQ(MakeCredentialStatus::kUserConsentDenied, callback().status());
}

// Like |TestRequestWithOperationDeniedErrorPlatform|, but with a
// cross-platform device.
TEST_F(FidoMakeCredentialHandlerTest,
       TestRequestWithOperationDeniedErrorCrossPlatform) {
  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  device->ExpectCtap2CommandAndRespondWithError(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      CtapDeviceResponseCode::kCtap2ErrOperationDenied);

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kPreferred));

  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_TRUE(callback().was_called());
  EXPECT_EQ(MakeCredentialStatus::kUserConsentDenied, callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest,
       TestCrossPlatformAuthenticatorsForceUVWhenSupported) {
  const auto& test_info_response = test_data::kTestAuthenticatorGetInfoResponse;
  ASSERT_EQ(ReadCTAPGetInfoResponse(test_info_response)
                ->options.user_verification_availability,
            AuthenticatorSupportedOptions::UserVerificationAvailability::
                kSupportedAndConfigured);

  auto device =
      MockFidoDevice::MakeCtapWithGetInfoExpectation(test_info_response);
  device->SetDeviceTransport(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  device->ExpectCtap2CommandAndRespondWith(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      test_data::kTestMakeCredentialResponse, base::TimeDelta(),
      IsUvRequest(true));

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kDiscouraged));
  discovery()->AddDevice(std::move(device));
  discovery()->WaitForCallToStartAndSimulateSuccess();

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

// If a device returns CTAP2_ERR_PIN_AUTH_INVALID, the request should complete
// with MakeCredentialStatus::kUserConsentDenied.
TEST_F(FidoMakeCredentialHandlerTest, TestRequestWithPinAuthInvalid) {
  auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  device->ExpectCtap2CommandAndRespondWithError(
      CtapRequestCommand::kAuthenticatorMakeCredential,
      CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid);

  auto request_handler =
      CreateMakeCredentialHandler(AuthenticatorSelectionCriteria(
          AuthenticatorAttachment::kAny, ResidentKeyRequirement::kDiscouraged,
          UserVerificationRequirement::kPreferred));

  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::move(device));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_TRUE(callback().was_called());
  EXPECT_EQ(MakeCredentialStatus::kUserConsentDenied, callback().status());
}

MATCHER_P(IsCtap2Command, expected_command, "") {
  return !arg.empty() && arg[0] == base::strict_cast<uint8_t>(expected_command);
}

TEST_F(FidoMakeCredentialHandlerTest, DeviceFailsImmediately) {
  // Test that, when a device immediately returns an unexpected error, the
  // request continues and waits for another device.

  auto broken_device = MockFidoDevice::MakeCtapWithGetInfoExpectation();
  EXPECT_CALL(
      *broken_device,
      DeviceTransactPtr(
          IsCtap2Command(CtapRequestCommand::kAuthenticatorMakeCredential), _))
      .WillOnce(::testing::DoAll(
          ::testing::WithArg<1>(
              ::testing::Invoke([this](FidoDevice::DeviceCallback& callback) {
                std::vector<uint8_t> response = {static_cast<uint8_t>(
                    CtapDeviceResponseCode::kCtap2ErrInvalidCBOR)};
                base::ThreadTaskRunnerHandle::Get()->PostTask(
                    FROM_HERE,
                    base::BindOnce(std::move(callback), std::move(response)));

                auto working_device =
                    MockFidoDevice::MakeCtapWithGetInfoExpectation();
                working_device->ExpectCtap2CommandAndRespondWith(
                    CtapRequestCommand::kAuthenticatorMakeCredential,
                    test_data::kTestMakeCredentialResponse);
                discovery()->AddDevice(std::move(working_device));
              })),
          ::testing::Return(0)));

  auto request_handler = CreateMakeCredentialHandler();
  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::move(broken_device));

  callback().WaitForCallback();
  EXPECT_EQ(MakeCredentialStatus::kSuccess, callback().status());
}

TEST_F(FidoMakeCredentialHandlerTest, PinUvAuthTokenPreTouchFailure) {
  VirtualCtap2Device::Config config;
  config.ctap2_versions = {Ctap2Version::kCtap2_1};
  config.pin_uv_auth_token_support = true;
  config.internal_uv_support = true;
  config.override_response_map[CtapRequestCommand::kAuthenticatorClientPin] =
      CtapDeviceResponseCode::kCtap2ErrOther;
  auto state = base::MakeRefCounted<VirtualFidoDevice::State>();
  state->fingerprints_enrolled = true;

  auto request_handler = CreateMakeCredentialHandler();
  discovery()->WaitForCallToStartAndSimulateSuccess();
  discovery()->AddDevice(std::make_unique<VirtualCtap2Device>(
      std::move(state), std::move(config)));

  task_environment_.FastForwardUntilNoTasksRemain();
  EXPECT_FALSE(callback().was_called());
}

}  // namespace device

redpajama_set_name: RedPajamaGithub


text:
Q: Structure of simple modules of $U_q(\mathfrak{sl}_2)$ at a root of unity. This is Theorem VI.5.5 in Kassel's Quantum Groups:

Let $q$ be a root of unity. Prove: Any simple $U_q$-module of dimension $e$ is isomorphic to a module of the following list:

*

*$V(\lambda, a, b)$ with $b\neq 0$,

*$V(\lambda,a,0)$ where $\lambda\neq \pm q^{j-1}$, $1\leq j\leq e-1$

*$\widetilde{V}(\pm q^{1-j},c)$ with $c\neq 0$ and $1\leq j\leq e-1$

Here $e$ is the smallest integer s.t. $q^e=\pm 1$. The $U_q$-module structures are defined on an $e$-dimensional vector space $V$ with basis $\{v_0,\ldots,v_{e-1}\}$ like so.

*

*$V(\lambda\neq0,a,b)$:
$Ev_0=av_{e-1}$, $\,Fv_{e-1}=bv_0$, $Kv_p = \lambda q^{-2p}v_p$, $Fv_p=v_{p+1}$, and $$ Ev_{p+1}=\left([p+1]\frac{q^{-p}\lambda - q^p\lambda^{-1}}{q-q^{-1}}+ab\right)v_p$$

*$\widetilde{V}(\mu\neq0,c)$:
$Fv_0=0$, $Ev_{e-1}=cv_0$, $Kv_p = \mu q^{2p}v_p$, $Ev_p=v_{p+1}$, and
  $$Fv_{p+1}=[p+1]\frac{q^{-p}\mu^{-1} - q^p\mu}{q-q^{-1}} v_p $$

My approach to the proof is the following: Take an arbitrary simple $e$-dimensional $U_q$-module $W$. This module has a nonzero element $w$ s.t. $Kw=\alpha w$ for some $\alpha\in\mathbb{C}^x$. Then see if you can find the relations from above in there under some additional assumptions.
I found that if $Fw\neq 0$ and $F^e\neq 0$, then $W\cong V(\lambda, a, b)$ with $b\neq0$.
Next I wanted to look at a module with $Fw\neq0$ but $F^e = 0$, but I cannot see why $Ew_0=aw_{e-1}$ should be true --- here, $w_p \equiv Fw_{p-1}$ with $w_0\equiv w$. In the first case, I proved it using
$$Ew_0 = \frac{1}{b}EFw_{e-1}$$
and then plugging in the Casimir element, but now that first step doesn't work anymore. Is the following possible?
\begin{align*}
Ew_0 \propto E^2 w_1 \propto \ldots\propto E^e w_{e-1},
\end{align*}
 but $E^e$ is in the center so acts by multiplication by a scalar. Thus, $Ew_0 = aw_{e-1}$. [Problem: what if $Ew_i$ vanishes somewhere?]
 Furthermore, assuming that $\alpha=\pm q^{j-1}$ leads to a contradiction: If $j=p+1$, then the form of $\alpha$ implies $$0=Ew_{p+1} = (FE + [E,F])w_p,$$ which is only possible if $\alpha =\pm q^{\frac{3}{2}}$.
For the last one I simply assume $Fw=0$, which implies $Ew\neq 0$, otherwise span of $w$ would be a 1-d submodule. Here we define $w_p = Ew_{p-1}$. It is easy to verify $Fw_{p+1}$, but again I am stuck with $Ew_{e-1}=cw_0$, and in particular I don't see why $c$ is nonzero.
Now, I would greatly appreciate any hint towards solving this. Thanks!

EDIT: To make it clear, my questions are basically:

*

*Where does $Ew_0 = a w_{e-1}$ come from in the second part?

*Where does $Ew_{e-1} = c w_0$ come from in the third part?

*Why does $c$ have to be nonzero?

*Why is the eigenvalue $\alpha$ of the form $\pm q^{j-1}$ in the last part?
These are the things that need to be accounted for, then the proof is finished.

EDIT #2:
I think the answer to  question 1 is as follows. This derivation:
\begin{align*}
Ew_0 \propto E^2 w_1 \propto \ldots\propto E^e w_{e-1},
\end{align*}
of $Ew_0=aw_{e-1}$ is valid iff not $\exists p$ s.t. $Ew_p=0$. And $Ew_p=0$ is equivalent to
\begin{align*}
q^{-(p-1)}\lambda - q^{p-1}\lambda^{-1} = 0.
\end{align*}
The existence of such a $p$ would also violate simplicity, btw.

EDIT #3:
Answers to the other questions: $KEw_{e-1}=\alpha Ew_{e-1}$ implies $Ew_{e-1}=cEw_0$, like before. If $\alpha=\pm q^{1-j}$, then $Fw_{p+1}=0$ for some $p$. The vectors $\{w_{p+1},..., w_{e-1}\}$ then span a $U_q$-submodule unless $c\neq 0$.
The only open question is now: Why is $\alpha$ of that form? Or rather: Is it true that, if $\alpha$ is not of that form, then the submodule is isomorphic to one of the first two?

A: I will summarize my results in this answer.

If we assume $Fw\neq0$ and $F^e=0$, then the derivation of our module being isomorphic to $V(\lambda, a,0)$ is almost the same as the first one, but we need to derive $Ew_0=aw_{e-1}$ differently, since now $Fw_{e-1}=0$. We know
\begin{align*}
Ew_0 \propto E^2w_1\propto\ldots\propto E^ew_{e-1},
\end{align*}
and since $E^e$ is in the center, this means $Ew_0 = aw_{e-1}$ for some (possibly zero) scalar $a$. Here it is important to note that we cannot have $Ew_p=0$ for some $w_p$, since then the subspace spanned by $\{w_p,...,w_{e-1}\}$ would be closed under $U_q$-action, contradicting simplicity.
But $Ew_p=0$ is equivalent to $\lambda = \pm q^{p-1}$ -- you should convince yourself of this if you don't see it. Thus we're done for this part.
For the last part, we of course assume the only possible case left: $Fw=0$. Necessarily, $Ew\neq 0$, otherwise $W$ would not be simple. And now I leave it as an easy exercise to verify that
\begin{align*}
\widetilde{V}(\pm q^{1-j},c) \cong V(\pm q^{j-1},0,c)
\end{align*} via the Cartan automorphism, that is, the map
\begin{align*}uv\mapsto \omega(u)v
\end{align*}
where $u\in U_q$, $v\in W$, and
\begin{align*}
\omega(E) = F, \quad \omega(F) = E \quad \omega(K) = K^{-1},
\end{align*}
is an isomorphism of $U_q$-modules. Simplicity then implies $c\neq 0$


Why Are Conservatives So Eager to Call Elizabeth Warren "Liz"?
The Lizzes of America weigh in.
Photo illustration by Slate. Photo by Scott Eisen/Getty Images.
It is fair to assume there was no warm, friendly "Please, call me Liz" moment between Warren and Trump. He seems to have intended "Liz" dismissively, and conservative media has taken his cue. What initially reads as a harmless nickname actually brings up more than a few questions: Can it be a dig to call someone her own name? Does "Liz" lack the gravitas of "Elizabeth"? Is it a nickname Warren herself ever uses? And if it was intended as a slight, what does that mean for the many adult women who do prefer "Liz"?
Not to cry "fake news," but some of that can be blamed on the press: Journalists make a sport of inserting puns and playful language into their headlines and prose—New York Post headlines are a genre unto themselves, and Hollywood trade publications have whole dictionaries for their slang terms—so of course they would claim "Liz" privileges. And as nicknames go, "Liz" seems pretty neutral. (My friend Liz Davis, of New York, deemed it "the least polarizing" of the Elizabeth nicknames.) It's maybe a hair less automatic as calling a Timothy "Tim" or a Jennifer "Jen," but on the whole uncontroversial, right?
If "Liz" isn't necessarily a sneer, why do some outlets and figures treat it like one? Why is a nickname a dirty secret? The tone is reminiscent of the glee conservatives took in dressing down Alexandra Ocasio-Cortez as "Sandy" earlier this year. Using a diminutive can be a way of talking down to someone, and when that someone is a woman, the gender component can't be set aside. "Sandy" and "Liz" become code for "little girl" and all the immaturity and frivolity that implies. "Are they using it to make her seem less … serious? Accomplished?" asked Liz B., comparing "Liz" use to the way "honey" and "sweetie" are employed to condescend.


text:
African Parks
Ugandan Parks
Eco Africa Travel Responsible Travel Guide
Taza National Park
The national park of Taza is one of the smaller national parks of Algeria. It is located in Jijel Province in the region of the Tell Atlas Mountains and is named after Taza, a town near this park.
Its total area is 3,807 hectares (9,410 acres) and it includes parts of the forested area of the Guerrouch massif. The lower parts of the park seldom experience frost and are relatively warm and dry, while the peaks may have a covering of snow in winter.
The annual precipitation in the park ranges from 1,000 to 1,400 millimetres (39 to 55 in) and the annual mean temperature is around 18 °C (64 °F).
Taza National Park was established in 1923 by the French colonial administrators in Algeria. Its aim was to protect the coastline and towering forested heights and provide protection for the Barbary macaque.
The park adjoins the Mediterranean Sea, and includes cliffs that rise from sea level to over 1,100 m (3,600 ft). The largest forest in Algeria of cork oaks (Quercus suber) and gall oaks (Quercus faginea) is found here.
The park is located 30 kilometres north-east of Jijel. The park includes the caves of Jijel, in addition to sand beaches and many cliffs and grottoes. It is a UNESCO-recognized biosphere reserve with a varied flora and fauna.
The Taza Biosphere Reserve comprises the whole of Taza National Park. It aims to combine conservation of the environment with the sustainable use of natural resources, allowing the local economy to flourish.
Some of the habitats, plants and wildlife are important or unique in North Africa and internationally. About 5,600 people, mostly of Berber origin, live inside the reserve, largely sustaining themselves on small agricultural holdings, cultivating vegetables, fodder crops and tree fruits.
Tourism is also important to the local economy. Management of the reserve includes eco-development projects, with beehives and fruit tree seed being distributed to villagers, and forest tracks and electricity supplies being improved for remote communities.
At lower altitudes, the Guerrouch forest is largely dominated by cork oaks, but higher up Algerian chestnut-leaved oak (Quercus afares) and Algerian oak (Quercus canariensis) are also present and there is a plentiful understorey of bird cherry (Prunus avium), Mediterranean willow (Salix pedicellata), European alder (Alnus glutinosa), Montpellier maple (Acer monspessulanum) and narrow-leaved ash (Fraxinus angustifolia).
The Barbary ape is an endangered primate with a narrowly restricted present distribution and is present in the park.
The endangered Algerian nuthatch is also present, with an estimated population of 364 individuals in a 1989 survey. The park is also known for its birds of prey.
Gorilla Trek in Rwanda and Lake Kivu Holiday
Top 5 Luxury Lodges and Camps, Rwanda
Rwanda Gorilla and Golden Monkey Trekking
Mount Karisimbi Hiking in Rwanda
Best Time to Visit Mikeno Lodge
Best Driving Tips in Uganda – Pearl of Africa
Self Driving Across Uganda
4 Fantastic Tips for 4×4 Rooftop Tent Car Hire Safari
Best Travel Destinations in Kenya 2019
Best Time to Go Gorilla Safaris in Congo
Best Gorilla Safari Lodges in Congo
5 Best Tourist Places to Go Self Drive in Kampala
Premium Wildlife & Primate Safaris in Rwanda
Visit the African Big5 in Uganda and Rwanda
Self Drive Car Rental Terms & Conditions in Uganda
Self Drive Uganda – Become Travel Writer
Best Eco Tourist Sites in Rwanda
Eastern Lowland Gorillas in Kahuzi Biega, Congo
Car Rental6
Gorilla Safaris5
Uganda Tours4
Rwanda Tours3
Kenya Safaris2
Kampala1
Congo Gorilla Tours1
Adventures1


text:
Home Latest Features Circle of Friends Coffeehouse features live music in Franklin
Circle of Friends Coffeehouse features live music in Franklin
By Jane Keller Gordon, Assistant Editor
Jake Jacobson
Photo/Dan Tappan
Franklin – Thirty years ago – in rented space in the Franklin's Masonic Hall – Circle of Friends (COF) Coffeehouse was launched by members of the First Universalist Society in Franklin (FUSF). Now, up to 300 people enjoy a variety of live folk, Celtic and Blues on Saturday nights at 8 p.m. from September to May, every two to three weeks at the FUSF Meetinghouse.
Jake Jacobson, the group's executive director, never expected to take on that role.
"I've only been involved for 28 years. When you volunteer you take on more and more. That's what happened to me, and now I have a title, which I've given myself," he said.
Growing up in Brooklyn, Jacobson said that music was not a big part of his life. An electrical engineering graduate of Columbia University, he moved from New York to Massachusetts for his first job with Raytheon.
"I've had a dozen jobs over my storied electrical engineering career," he said. Forty-two years ago, Jacobson married his wife Ann Willever, and that's part of his connection to the COF Coffeehouse.
Jacobson and Willever joined the FUSF when their children were young. Willever, a teacher, eventually became director of religious education there. She went to theological school and became an ordained minister. Willever, who was the FUSF associate minister, is now retired, as is Jacobson.
When the FUSF Meetinghouse was built in 2001, the members had the COF Coffeehouse in mind. Concerts are held in the sanctuary, where the seats are moveable, allowing for different configurations.
"The space is great, with wiring under the floor and in the walls. We have an excellent sound system and decent stage lighting, which performers really like," said Jacobson.
The COF Coffeehouse is affiliated with the church, to which it pays rent and makes an annual donation.
"This year we expect to donate $6,000," said Jacobson.
Jacobson and his group of 20 active volunteers have recruiting acts down to a science.
"Performers contact us, and our volunteers go to festivals and conferences. We're always looking for new talent… We have popular performers every two years, but try shake things up otherwise," Jacobson commented.
Past well-known performers have included Janis Ian, Richie Havens, Tom Rush, Peter Yarrow, and Livingston Taylor. This year's holiday concert on Saturday, Dec. 7, will feature Winterbloom, a four-member talented group of singer/songwriters from the Boston area.
"Since we have launched online booking, we have a better sense of how many people will show up," Jacobson said.
"The COF Coffeehouse audiences are appreciative and the performers love it." The volunteers are happy too," he added.
MaryAnn O'Connor is one of those volunteers.
"Volunteering at the COF Coffeehouse this past year has been great for me! I moved into the area, not knowing a soul, not having been to a coffeehouse for at least 20 years," she said. "Helping out at the coffeehouse brought me back to my younger days and I've enjoyed it just as much as I did back then."
Michelle Kelly, who is both a performer and volunteer, added, "The COF volunteers are a loyal, fun-loving, and talented group of people. Most of the performers recognize the professional quality of the sound and lights we provide, not to mention the gourmet desserts that COF has become known for in the coffeehouse circuit. I'm proud to be part of the team and hope that we can continue to bring quality musical acts to Franklin for years to come."
Tickets are from $20 to $35 per show. For more information, visit www.circlefolk.org or email circlefolk@gmail.com
Circle of Friends Coffeehouse is located at 262 Chestnut St., Franklin.
Celtic band RUNA
Tom Rush
Joe Crookston
Circle of Friends Coffeehouse
First Universalist Society in Franklin
Jane Keller Gordon
Previous articleHouse passes Westborough Representatives legislation
Next articleAn update on the AARP Massachusetts Secure Choice bill
Seniors embrace company's virtual reality experience
Be prepared for cold weather health challenges
State's discrimination commission can be a valuable resource for older adults


text:
The Whole Bolivian Army
SIGN UP FOR TWBA'S NEWSLETTER!
Enter your email address below to receive monthly updates on upcoming shows, new releases, and the latest news.
SO LONG AND FAREWELL (FOR NOW) | Can you believe it's been 30 years? We played our first live show in March 1993 at the fabled Romper Room in Seattle. Since then, we've met so many extraordinary people and made so many lifelong friends and memories. We've truly been blessed by the rock and roll gods.
Although we might hit the stage again for a reunion show or whatnot, we've decided to hang up our show shoes so we can focus on writing and recording. We've got several plans in the offing, including recording new material and releasing a collection of ancient songs from way, way back.
In the meantime, if you'd like to see us play live, we've still got two shows left on the calendar. Go HERE for more info.
© 2021 Gargantuan Records. All rights reserved.
Scream 3:25
The Smile Beside You 3:12
Dime Eyes 2:53
The Monster That Ate Her 3:51
Doom Is a Flower 2:27
Sick with Love 3:56
Kairos 3:00
Love Falls Like Snow 5:41
Love What You Made 3:14
Siren 4:39
Acolyte 4:55


Certain people leave an indelible mark and make us want to live, laugh, and love better. Such was the case for Mrs. Ora. L. Jones. Ora Lee Jones was a native of Montevallo, Al where she positively impacted and influenced countless individuals. Throughout her life she demonstrated sacrificial service as a devoted wife, loving mother and grandmother, and faithful servant of God. An alumnus of Prentice High School in Montevallo class of 1958, Mrs. Jones also received an honorary Doctorate of Humanitarian Degree from the Tennessee School of Religion. She was employed at the University of Montevallo where she retired after many years of labor. She was the First Lady of Mount Olive Missionary Baptist Church in Wilton, AL for 36 years and the former president of the Lillie Star District Association for many years. One of the most notable characteristics of Mrs. Jones was her passion for people. She was determined to reach out to and lift up everyone she encountered to demonstrate the love of God. Although she loved her family, friends, and all that she met, she loved and feared the Lord even more. She was a phenomenal lady, a Proverbs 31 woman, priceless, more valued than rubies. If ever there was a virtuous woman, Mrs. Ora Lee Jones was one. Mrs. Jones peacefully entered eternal glory on Monday, May 30, 2011. Although she is physically gone, her work continues through the legacy that she leaves behind. It is with honor that her family celebrates her memory by contributing scholarships to students and engaging in community service projects on her behalf.