CINXE.COM

Open Textbook Library - Open Textbook Library

<!DOCTYPE html> <html class='h-100' lang='en' prefix='og: http://ogp.me/ns#'> <head> <script nonce="b78e328ffc81ff9822de8cdfc909ad85"> //<![CDATA[ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;var n=d.querySelector('[nonce]');n&&j.setAttribute('nonce',n.nonce||n.getAttribute('nonce'));f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-KVLSPNJ'); //]]> </script> <script type="text/javascript" nonce="b78e328ffc81ff9822de8cdfc909ad85">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"870b502a95","applicationID":"175895155","transactionName":"JlcNEUJcXg9UShZYUAdKAhdJHF4KU0pYRkBKUQ0BVUs=","queueTime":0,"applicationTime":46,"agent":""}</script> <script type="text/javascript" nonce="b78e328ffc81ff9822de8cdfc909ad85">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"870b502a95",applicationID:"175895155"};;/*! For license information please see nr-loader-rum-1.284.1.min.js.LICENSE.txt */ (()=>{var e,t,r={122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},217:(e,t,r)=>{"use strict";r.d(t,{D0:()=>m,gD:()=>v,xN:()=>h});r(860).K7.genericEvents;const n="experimental.marks",i="experimental.measures",o="experimental.resources",a=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var s=r(614),c=r(944),u=r(384),l=r(122);const d="[data-nr-mask]",f=()=>{const e={feature_flags:[],experimental:{marks:!1,measures:!1,resources:!1},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{get capture_marks(){return e.feature_flags.includes(n)||e.experimental.marks},set capture_marks(t){e.experimental.marks=t},get capture_measures(){return e.feature_flags.includes(i)||e.experimental.measures},set capture_measures(t){e.experimental.measures=t},capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:s.wk,inactiveMs:s.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){a(t)?e.mask_selector="".concat(t,",").concat(d):""===t||null===t?e.mask_selector=d:(0,c.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){a(t)?e.block_selector+=",".concat(t):""!==t&&(0,c.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,c.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},spa:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]}}},g={},p="All configuration objects require an agent identifier!";function m(e){if(!e)throw new Error(p);if(!g[e])throw new Error("Configuration for ".concat(e," was never set"));return g[e]}function h(e,t){if(!e)throw new Error(p);g[e]=(0,l.a)(t,f());const r=(0,u.nY)(e);r&&(r.init=g[e])}function v(e,t){if(!e)throw new Error(p);var r=m(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>d});var n=r(122),i=r(384),o=r(154),a=r(324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0,harvester:void 0},l={};function d(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!l[e])throw new Error("Runtime for ".concat(e," was never set"));return l[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");l[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(l[e],"harvestCount")||Object.defineProperty(l[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=l[e])}},324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.284.1",i="PROD",o="CDN"},154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>l,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,l=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>d,x3:()=>u});var n=r(836),i=r(606),o=r(860),a=r(646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};l(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function l(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function d(e="",t="feature",r=!1){if(l(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(990),o=r(371),a=r(646),s=r(607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},l={},d=!1;try{d=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=m(e),l=c.length,d=0;d<l;d++)c[d].apply(a,r);var p=v()[s[e]];p&&p.push([f,e,r,a]);return a},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:d?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:d};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return l[t]=l[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),l=(0,n.Zm)();l.ee||(l.ee=u)},646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(566).bz)()},566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(836),i=r(154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>l,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>d});var n=r(154),i=r(863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function l(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},434:(e,t,r)=>{"use strict";r.d(t,{Jt:()=>o,YM:()=>c});var n=r(836),i=r(607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];l(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return l(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,l,d;try{a=this,o=[...arguments],l="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],l],e)}i(r+"start",[o,a,s],l,c);try{return d=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],l,c),e}finally{i(r+"end",[o,a,d],l,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{A$:()=>o,ET:()=>a,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o={OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,TRACE:5},a="log";n.K7.logging},773:(e,t,r)=>{"use strict";r.d(t,{z_:()=>o,XG:()=>s,TZ:()=>n,rs:()=>i,xV:()=>a});r(154),r(566),r(384);const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(836),i=r(687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},603:(e,t,r)=>{"use strict";r.d(t,{j:()=>K});var n=r(860),i=r(555),o=r(371),a=r(908),s=r(836),c=r(687),u=r(289),l=r(154),d=r(944),f=r(773),g=r(384),p=r(344);const m=["setErrorHandler","finished","addToTrace","addRelease","recordCustomEvent","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],h=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(863),b=r(614),y=r(993);var w=r(646),R=r(434);const A=new Map;function E(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,d.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,R.YM)(i),a=new w.y(s.P);a.level=n.level,a.customAttributes=n.customAttributes;const c=t[r]?.[R.Jt]||t[r];return A.set(c,a),o.inPlace(t,[r],"wrap-logger-",(()=>A.get(c))),i}function _(){const e=(0,g.pV)();m.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,d.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const x={};function N(e,t,g=!1){t||(0,c.Ak)(e,"api");const m={};var w=s.ee.get(e),R=w.get("tracer");x[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{x[e]=t}));var A="api-",_=A+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),j(A,n,!0,o||null===r?"session":void 0)(t,r)}function k(){}m.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,v.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},m.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),E(w,e,t,{customAttributes:r,level:i})},h.forEach((e=>{m[e]=j(A,e,!0,"api")})),m.addPageAction=j(A,"addPageAction",!0,n.K7.genericEvents),m.recordCustomEvent=j(A,"recordCustomEvent",!0,n.K7.genericEvents),m.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,j(A,"setPageViewName",!0)()},m.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,d.R)(40,typeof t)}else(0,d.R)(39,typeof e)},m.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,d.R)(41,typeof e)},m.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,d.R)(42,typeof e)},m.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,d.R)(23,e)}},m[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},m[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},m.interaction=function(e){return(new k).get("object"==typeof e?e:{})};const T=k.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(_+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,w),function(){if(R.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw R.emit("fn-err",[arguments,this,t],r),t}finally{R.emit("fn-end",[(0,v.t)()],r)}}}};function j(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,w),i&&(0,a.p)(e+t,[r?(0,v.t)():performance.now(),...arguments],r?null:this,i,w),r?void 0:this}}function I(){r.e(296).then(r.bind(r,778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,d.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{T[e]=j(_,e,void 0,g?n.K7.softNav:n.K7.spa)})),m.setCurrentRouteName=g?j(_,"routeName",void 0,n.K7.softNav):j(A,"routeName",!0,n.K7.spa),m.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!x[e]],void 0,n.K7.jserrors,w)},l.RI?(0,u.GG)((()=>I()),!0):I(),m}var k=r(217),T=r(122);const j={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},I={};var O=r(284);const S=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let P=!1;function K(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:d={},exposed:f=!0}=t;d.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,k.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");I[e]=(0,T.a)(t,j);const r=(0,g.nY)(e);r&&(r.loader_config=I[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},l.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const m=(0,k.D0)(e.agentIdentifier),h=[c.beacon,c.errorBeacon];P||(m.proxy.assets&&(S(m.proxy.assets),h.push(m.proxy.assets)),m.proxy.beacon&&h.push(m.proxy.beacon),_(),(0,g.US)("activatedFeatures",O.B),e.runSoftNavOverSpa&&=!0===m.soft_navigations.enabled&&m.feature_flags.includes("soft_nav")),d.denyList=[...m.ajax.deny_list||[],...m.ajax.block_internal?h:[]],d.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,d),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=N(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),P=!0}},374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>u,K7:()=>s,P3:()=>c,XX:()=>i,qY:()=>n,v4:()=>a});const n="events",i="jserrors",o="browser/blobs",a="rum",s={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},c={[s.pageViewEvent]:1,[s.pageViewTiming]:2,[s.metrics]:3,[s.jserrors]:4,[s.spa]:5,[s.ajax]:6,[s.sessionTrace]:7,[s.softNav]:8,[s.sessionReplay]:9,[s.logging]:10,[s.genericEvents]:11},u={[s.pageViewEvent]:a,[s.pageViewTiming]:n,[s.ajax]:n,[s.spa]:n,[s.softNav]:n,[s.metrics]:i,[s.jserrors]:i,[s.sessionTrace]:o,[s.sessionReplay]:o,[s.logging]:"browser/logs",[s.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.284.1.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.284.1.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var d=u[l];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+o){s=d;break}}if(!s){c=!0;var f={296:"sha512-I5tV79u0jhQi7aouG2M+kaxUnC8otPe2WXnytHYva1pERqoP8GhxHAi7OJZyNzSvBOojrdGEBSfIO5Sy7scrmA=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={374:0,840:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.284.1.PROD"]=self["webpackChunk:NRBA-1.284.1.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(374);var e=i(944),t=i(344),r=i(566);class n{agentIdentifier;constructor(){this.agentIdentifier=(0,r.LA)(16)}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}recordCustomEvent(e,t){return this.#e("recordCustomEvent",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(217);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var l=i(603);var d=i(687),f=i(234),g=i(289),p=i(154),m=i(384);const h=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function v(e){return!!(0,m.dV)().o.MO&&h(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,d.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,d.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(h(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(!this.#t(this.featureName,o))return(0,d.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),t.runtime.harvester.initializedAggregates.push(this.featAggregate),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,d.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return v(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(630);class R extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var A=i(908),E=i(843),_=i(878),x=i(782),N=i(863);class k extends y{static featureName=x.T;constructor(e,t=!0){super(e,x.T,t),p.RI&&((0,E.u)((()=>(0,A.p)("docHidden",[(0,N.t)()],void 0,x.T,this.ee)),!0),(0,_.sp)("pagehide",(()=>(0,A.p)("winPagehide",[(0,N.t)()],void 0,x.T,this.ee))),this.importAggregator(e))}}var T=i(773);class j extends y{static featureName=T.TZ;constructor(e,t=!0){super(e,T.TZ,t),p.RI&&document.addEventListener("securitypolicyviolation",(e=>{(0,A.p)(T.xV,["Generic/CSPViolation/Detected"],void 0,this.featureName,this.ee)})),this.importAggregator(e)}}new class extends o{constructor(t){super(),p.gm?(this.features={},(0,m.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(R),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,l.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,m.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[R,k,j],loaderType:"lite"})})()})();</script> <title>Open Textbook Library - Open Textbook Library</title> <link rel="icon" type="image/x-icon" href="/assets/common/favicon/favicon-6666d4af5ecb597851b1bd6b4af4d8472feee5ef149656c053063f5c427c993c.ico" sizes="32x32" /> <link rel="icon" type="image/svg+xml" href="/assets/common/favicon/icon-0d2a8f5b51ab3059a14f0742b4afa82fe4ecfcc80305b3c52a94bf0e16aac2a1.svg" /> <link rel="apple-touch-icon" type="image/x-icon" href="/assets/common/favicon/apple-touch-icon-d7d601b3543106476d46692d8ea08dea4b727bbbcdf744e1f938f5e2fe3a69c2.png" sizes="120x120" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-32x32-c803789e4367172c87005d8724c6548012c9cabdd427eb9568dae1b5b84cbeff.webp" sizes="32x32" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-16x16-1fb95c64521256b6558821cc3c3d8d0d236531556f15788b0de758b456de57ff.webp" sizes="16x16" /> <link rel="mask-icon" type="image/x-icon" href="/assets/common/favicon/safari-pinned-tab-92ce09c3a70c51dd7b3743e4cc638a69dac4e6fb6889cf49b0aaee2407fed538.svg" color="#872384" /> <meta content='#ffffff' name='msapplication-TileColor'> <meta content='#ffffff' name='theme-color'> <meta content='text/html; charset=utf-8' http-equiv='Content-Type'> <meta content='width=device-width, initial-scale=1, shrink-to-fit=no' name='viewport'> <link href='/humans.txt' rel='author'> <link href='/opentextbooks/manifest.json' rel='manifest'> <link href='/opentextbooks/search.xml' rel='search' title='Open Textbook Library' type='application/opensearchdescription+xml'> <link href='https://open.umn.edu/opentextbooks' rel='canonical'> <meta content='Open textbooks are licensed by authors and publishers to be freely used and adapted. Download, edit and distribute them at no cost.' name='description'> <meta content='open education, open educational resources, OER, open publishing, open textbooks, open textbook library, equity higher education' name='keywords'> <meta content='summary' name='twitter:card'> <meta content='open.umn.edu' property='twitter:domain'> <meta content='https://open.umn.edu/opentextbooks' property='twitter:url'> <meta content='@OpenEd_Network' name='twitter:site'> <meta content='Open Textbook Library - Open Textbook Library' name='twitter:title'> <meta content='Open textbooks are licensed by authors and publishers to be freely used and adapted. Download, edit and distribute them at no cost.' name='twitter:description'> <meta content='Open Textbook Library - Open Textbook Library' property='og:title'> <meta content='Open textbooks are licensed by authors and publishers to be freely used and adapted. Download, edit and distribute them at no cost.' property='og:description'> <meta content='Open Textbook Library' property='og:site_name'> <meta content='website' property='og:type'> <meta content='https://open.umn.edu/opentextbooks' property='og:url'> <meta content='en' property='og:locale'> <script type='application/ld+json'>{"@context":"https://schema.org","@type":"WebSite","url":"https://open.umn.edu/opentextbooks","potentialAction":{"type":"SearchAction","target":{"type":"EntryPoint","urlTemplate":"https://open.umn.edu/opentextbooks/textbooks?term={search_term_string}"},"query-input":"required name=search_term_string"}}</script> <link rel="stylesheet" href="/assets/library-91796f4b8e97f95f96fe174e499b888f2c3e6df2b2242737707df444165f1571.css" media="all" /> <script src="/assets/jquery-sprockets-9604073ae34ebee077913ca351aa2b7f8ca6a1c14cd5883622ccf278d39ea507.js" nonce="b78e328ffc81ff9822de8cdfc909ad85"></script> <script type="importmap" data-turbo-track="reload" nonce="b78e328ffc81ff9822de8cdfc909ad85">{ "imports": { "@rails/ujs": "/assets/@rails--ujs-539e0c5fdda60fc0fda95b372aa523264324b5674ff5588c8717c88b90b6ebae.js", "@hotwired/turbo-rails": "/assets/turbo.min-af96e10b36ae4e9eec25aaa9d1f39341959490c38f5248c341202038709b894c.js", "@hotwired/stimulus": "/assets/stimulus.min-6dffef3d415b06e9a0e43e64748aac6d2a98f87793d6b5b1dc2a00fec5142f21.js", "@hotwired/stimulus-loading": "/assets/stimulus-loading-b6081246c3a026b7ffd648c4b58d9f60146e33573a181eabbf14a484d6e8979e.js", "bootstrap": "/assets/bootstrap.bundle.min-c1916178b069202f2b150fed4b75c3f1d9e4adf156df22a461acf7e64d268568.js", "tinymce": "/assets/tinymce-9883d4ce7abffe2de24c66b8e81edf042f062ad123a132677eb63694bfc793e7.js", "chartkick": "/assets/chartkick-c20eba1b2a7e7591efd43ac5aac663d75fab9a9392fd8c89f84425daca857b8c.js", "Chart.bundle": "/assets/Chart.bundle-ecf72bb23fe48f65dc1eee5ec414f3fdd0cccf607c7d5e1291e569b5ac3f457d.js", "leaflet": "/assets/leaflet-224b432d7ebc13377e0d4952499678c671b104ffbe36dd6c479fc8583f9e5289.js", "bootstrap5-tags": "/assets/bootstrap5-tags-e1181c6570154590ab36498e2e5af7e25cbe063ddc851c9d0bbe158b5d709361.js", "@stimulus-components/rails-nested-form": "/assets/@stimulus-components--rails-nested-form-f89cc67954ecf3397221d0a295e73e636adb8cfb8ff30c730432a9b30a13ceb9.js", "sortablejs": "/assets/sortablejs-e346030bcbec5adc12b5cfde95574d7e708906109843abd30e885b9919976a4c.js", "jquery": "/assets/jquery-ce32ce5ce754b04a94396ebfdbf5fb2c8adeac11e90617dbdc84bedef016b729.js", "jquery-ui": "/assets/jquery-ui-7a70cfac4d0419cd5e3e30d451bed5fb6c1dd0a5cbeb2d5a32734193bc0c388e.js", "bootstrap-datepicker": "/assets/bootstrap-datepicker-05a9a0e2f0b57636a7ada905d081b2af062cffde2b5c69ec1cba848c12e361de.js", "bootstrap-table": "/assets/bootstrap-table-3e59dbc5f8f97be1a28611c6b2f7a6f834c7d889add13843898442f095572366.js", "admin": "/assets/admin-8910ae5e10966a5b8ab9c2f2efd122be86a7a4e37ac8d7632e94851e3cf40a27.js", "library": "/assets/library-adc792cc9e4bee0e876616c97c88bda4d7fe0932b671f2e3971bb8c38cf22eb8.js", "network": "/assets/network-30537bb58853571af515a268cdd789a230008b64ce211b4618aefac11c136c01.js", "oen": "/assets/oen-3e80124a9424a330109be3be381d625214213435471b05a68fe670da6cdb31a9.js", "open": "/assets/open-bfbe344949720e28e643345b827fffba9d6d205ca68270fc396294a63d9fe7af.js", "controllers/hw_combobox_controller": "/assets/controllers/hw_combobox_controller-19619334ddefec3fbfaea85c27863a36bd48e96798740107038db2abc3f3a1f5.js", "hotwire_combobox.esm": "/assets/hotwire_combobox.esm-d7b105771c96a51ebbc0a4e2871b92e596f9b738b5ff56cd4ce4c9883df24b67.js", "hotwire_combobox.umd": "/assets/hotwire_combobox.umd-dcbff27a2bf6ea468397684961a44d38e45fb337037336116531bdc4a71c76f9.js", "hw_combobox/helpers": "/assets/hw_combobox/helpers-34cc45ad2f35aab41074ad6bb06fcc2e4784b1e468d3251d7bc3ab4c37e277a7.js", "hw_combobox/models/combobox": "/assets/hw_combobox/models/combobox-88c476092c277b0697edef97d93b43f9800c9b1e9c09f347d55f81e2f1a0417f.js", "hw_combobox/models/combobox/actors": "/assets/hw_combobox/models/combobox/actors-273f7894c329c4db05cbf51c66dbf7a288e552a4c2a7cbf216616143d0673a42.js", "hw_combobox/models/combobox/announcements": "/assets/hw_combobox/models/combobox/announcements-3443e126bbab33cf28214d91112616ab805864117469c3fcef9be1482d3887f0.js", "hw_combobox/models/combobox/async_loading": "/assets/hw_combobox/models/combobox/async_loading-a4018b0d2a611c32e3c4493e771ca9247848f03ac934b5d599f05586c6acbd21.js", "hw_combobox/models/combobox/autocomplete": "/assets/hw_combobox/models/combobox/autocomplete-1eb4c87725caf270fc5151954fd65dc6ccc46786f5630c2705636618a49d821d.js", "hw_combobox/models/combobox/base": "/assets/hw_combobox/models/combobox/base-6b9b6dd3ad706c59e7638a5c3fd922b1f0c9802d0befda576fee00a63eb2a611.js", "hw_combobox/models/combobox/callbacks": "/assets/hw_combobox/models/combobox/callbacks-69f82e443df196fe1cde8260a5d8584d0d4b90c346264da4a939fd40952e2b3d.js", "hw_combobox/models/combobox/dialog": "/assets/hw_combobox/models/combobox/dialog-665cfeae29141de952ac6369704c342ff79aebbf06fb6888357d194c7f412028.js", "hw_combobox/models/combobox/events": "/assets/hw_combobox/models/combobox/events-3233e5cd44c0f2d7cfc386dea2bc821cfaeedeb3ab1baad18343016bdda3f5cf.js", "hw_combobox/models/combobox/filtering": "/assets/hw_combobox/models/combobox/filtering-b4af5e2794d42681697057293efa4c3378a737399f8af759093f99a4c5771a83.js", "hw_combobox/models/combobox/form_field": "/assets/hw_combobox/models/combobox/form_field-57bb0e27a73fe79717913d8a05d5e190690d937f65ed188eff0ecd14c6e4c40f.js", "hw_combobox/models/combobox/multiselect": "/assets/hw_combobox/models/combobox/multiselect-7220194bbc98cc61240a9ec46bd2562d5c9e225b55d6cf5f3b37b2cc0faf7570.js", "hw_combobox/models/combobox/navigation": "/assets/hw_combobox/models/combobox/navigation-ee5256935e3e0974d04f0ff8f929538e57e4b1087833b4fa5335da3d5c1bb31f.js", "hw_combobox/models/combobox/new_options": "/assets/hw_combobox/models/combobox/new_options-0e610c6d34addb779f720882e9c7153b4fe19a3f997c05dce2f19aa7ae8fa7bb.js", "hw_combobox/models/combobox/options": "/assets/hw_combobox/models/combobox/options-0fadbc18dea42af3988417e8ff0e8f720745a9239708f5515ce5fc0e97faeec8.js", "hw_combobox/models/combobox/selection": "/assets/hw_combobox/models/combobox/selection-4f2e35553d1da268873aa8fa99e5c6e1a9c75a79303b963a967c2d9103cbdd45.js", "hw_combobox/models/combobox/toggle": "/assets/hw_combobox/models/combobox/toggle-0f8fc5acae294d185d6395bd8a57fa4b7f1c1ba016e548e4be928d2e26165f3a.js", "hw_combobox/models/combobox/validity": "/assets/hw_combobox/models/combobox/validity-71aafeaecc050701d898959f4b0721d49d79fc101d567ba2cd19bfdb1538dd03.js", "hw_combobox/vendor/bodyScrollLock": "/assets/hw_combobox/vendor/bodyScrollLock-f0d5fe0c8e690da1b336712cb443b0b5f1e03ae5ba68e4068a057eaee188c67d.js", "hw_combobox/vendor/requestjs": "/assets/hw_combobox/vendor/requestjs-8cc79e2139988237617f6a3aff41d271ab189de3030d112218de4807d876978f.js", "admin/init": "/assets/admin/init-b95579e484e750f244b4e4b415f29272ed233417886e56ec164b2b9c1bbf9bb5.js", "admin/main": "/assets/admin/main-d486bca051f3b6c47d34c2bcbc83beecd18de3b5465fcaf2963c78b642d6bb9d.js", "controllers/admin/calendar_controller": "/assets/controllers/admin/calendar_controller-797098041d34432dd450d5f8626cb71a2d0e0a1b3029c4512cfce094b5dba2ad.js", "controllers/admin/check_column_controller": "/assets/controllers/admin/check_column_controller-b7b7f14dd750fc771bad42c3e0fafc97a5f6bdb415b076050c03a937b2b87eaf.js", "controllers/admin/check_subjects_controller": "/assets/controllers/admin/check_subjects_controller-5bba6a63af9bafea5c92bdd1717c8b60685e42e48ac9717238effe9cb89fe408.js", "controllers/admin/clipboard_controller": "/assets/controllers/admin/clipboard_controller-46e2608e27b58151c3aa68f15107a119763c3e6e46b7805a6c322b8b35ab33f4.js", "controllers/admin/course_controller": "/assets/controllers/admin/course_controller-3041b05ab3e436d7d3c9983bc5cfffbc48dd9f267b463351b9cc7355a0640a33.js", "controllers/admin/datepicker_controller": "/assets/controllers/admin/datepicker_controller-00c83c29de2502fd9434f1129c1fe6ddf9e653eeba9bdff4e29256f5ed9be461.js", "controllers/admin/drag_controller": "/assets/controllers/admin/drag_controller-b86bb2138fe0d7024242fb1a6f616128809ddb39076920fc9af4893c25b6aa45.js", "controllers/admin/enrollment_controller": "/assets/controllers/admin/enrollment_controller-53d0f7c4fb2a10dd3368b0b228c85c2fac5199c43f23e5280a2143e98135da85.js", "controllers/admin/file_upload_controller": "/assets/controllers/admin/file_upload_controller-47839006892d237059674276efbb9cc14af427827c6c19629dc1915c9fe9f903.js", "controllers/admin/form_controller": "/assets/controllers/admin/form_controller-ebe39545fdb125989e221fe1863f3980396b8f4696d801a1e43b3a7b035271c8.js", "controllers/admin/legend_controller": "/assets/controllers/admin/legend_controller-43c692231bf004eab61e1c191e7cfad59dfb213a22a603a44aa383c2226c3fa2.js", "controllers/admin/membership_controller": "/assets/controllers/admin/membership_controller-550e3d8b66518a11d9be20e2d3ed17c15bd024ced5220eeb8c386f02688a15e6.js", "controllers/admin/modal_controller": "/assets/controllers/admin/modal_controller-82e0791e54dd74c8081558907b4fa68f9fbccb1ef320d100dd5639ac1950246d.js", "controllers/admin/popover_controller": "/assets/controllers/admin/popover_controller-25c097a2d03e3e2a0f445fac72ed686cbc59a2dd6b5bbce9aca6632567bc266d.js", "controllers/admin/recipient_table_controller": "/assets/controllers/admin/recipient_table_controller-ebbab91eb66311c8968b03458d72d2c46d03fb3efa5707e6bae2bd98573e7521.js", "controllers/admin/remote_button_controller": "/assets/controllers/admin/remote_button_controller-2f81c148e4050ff077f4d2d6793fde0f16cfc79cdbb0949774e43cadf88cfa6a.js", "controllers/admin/request_form_controller": "/assets/controllers/admin/request_form_controller-b6deb5e56caf6683b83cad22e261b3d30a7b77f41a97b5d7056cec35bca81240.js", "controllers/admin/request_recipient_controller": "/assets/controllers/admin/request_recipient_controller-e860e59e8ab940452b8e9c20f4e5e59afdaa158f302d8df0aac1b82dfa3e11bb.js", "controllers/admin/tab_controller": "/assets/controllers/admin/tab_controller-d47080c654293d9b21a6729d0342329bc4d3262129bcc5f82d6912281e3883fd.js", "controllers/admin/tab_nav_controller": "/assets/controllers/admin/tab_nav_controller-cd9460b3d6e839a542eb669f8de61ef1ed1db001abba23033dbeb7050d0772b0.js", "controllers/admin/table_controller": "/assets/controllers/admin/table_controller-88ef8d7864501d1f485182828935d82db0977aaadb5db13382c93b9be9d56adf.js", "controllers/admin/tag_area_controller": "/assets/controllers/admin/tag_area_controller-b69bfc8991a3bc3471da762ee4b72a4c953ee11524348837fcfefa5fb629a709.js", "controllers/admin/text_area_controller": "/assets/controllers/admin/text_area_controller-4f6ac30adf5c7302b5dffbb8693c895549419965ff1db7c4f25cd2f27ec2d058.js", "controllers/admin/toggleable_controller": "/assets/controllers/admin/toggleable_controller-f5dcf182dba2288dfd4096dc9931f06aa8e0ed00ca2d35db0ef6ba57f3d103bb.js", "controllers/admin/workshop_form_controller": "/assets/controllers/admin/workshop_form_controller-4c969b8236d763ef29176f4e8a588079dfa3f5cac61409afe23875c763bfc282.js", "controllers/application": "/assets/controllers/application-6c5b179927587bf93b8fb2fbf83a17f964d01cc0bdcdd81537fe2f11fea6e07a.js", "controllers/common/accordion_controller": "/assets/controllers/common/accordion_controller-7dc8a1559c1bb5495c2731ff1406e453f5017980b96eb0af7faaeefe19e06571.js", "controllers/common/cover_controller": "/assets/controllers/common/cover_controller-5ad2350622cb8b081a1a088c34599dccb0b336a15025a77d26c1e47f4b631f9f.js", "controllers/common/infinite_scroll_controller": "/assets/controllers/common/infinite_scroll_controller-01e09b65a6f8705212d198f43451588fd7086111296a07b0390a47a90c7d5b78.js", "controllers/common/preview_controller": "/assets/controllers/common/preview_controller-892f05b83bd46366ffd6aee35c9f519fa9a57aa3f63931eae699c2c0bb83e7fb.js", "controllers": "/assets/controllers/index-d50fc38857ec5b80d738c8f000c8f77decfde685e9370ba5e3383152a2f57985.js", "controllers/library/filter_controller": "/assets/controllers/library/filter_controller-b5e44577c5687d34b8cff33a423384dd6ebbdce65ff7f1b53fa9185d08a19c7f.js", "controllers/library/review_controller": "/assets/controllers/library/review_controller-5ddceba71a5e5b1459d2111d9fbdec23ea442a018a2e20026e76f8d9f61eefeb.js", "controllers/oen/map_controller": "/assets/controllers/oen/map_controller-6786a041a058b7fcbf97e99c9f3a3571a9009c7edbc276b24d50fa49dc1511ff.js", "controllers/oen/profiles_controller": "/assets/controllers/oen/profiles_controller-b724513ca3ec38dbae683e975414a1f1f899a9a88bc69039c1222af849dee1dc.js", "controllers/oen/sidebar_controller": "/assets/controllers/oen/sidebar_controller-9fd0a65e647e1284801cc4326380ca25fd1eca5920994ae2f7ed7f397cfbe749.js", "common/listeners": "/assets/common/listeners-be4caf063f51b5c837b171883828ebdcc0e80facad9c679b5ecd084315b7e6d2.js", "common/util": "/assets/common/util-a521fb9fa985ff23462c2a40993a5f4373bffac8a878dbf4bbd55a3bb249920b.js", "library/main": "/assets/library/main-ba88f388a4d24f2c6b3181f2e3ce22e28cf5c1fc2c530a10bd87c4ae59d9c8c9.js", "library/serviceworker-companion": "/assets/library/serviceworker-companion-b556b25eef2b071fb42c147ebc4980bf067c3044a93ba2a98070839b1461546c.js", "network/main": "/assets/network/main-8979d570965002baab5723d1c17a0527843992460a47a2668b7933415b047c87.js" } }</script> <script type="module" nonce="b78e328ffc81ff9822de8cdfc909ad85">import "library"</script> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="dVGGHKH-WiuRz5bAdfTDiGeVEn4YcRWpYYmAmunLotFhsXzvOS6kSFBmm8j42IYS67wL9B7o9O4EzIAXfb3W1g" /> <meta name="csp-nonce" content="b78e328ffc81ff9822de8cdfc909ad85" /> </head> <body class='d-flex flex-column h-100'> <noscript> <iframe class='hidden' height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-KVLSPNJ' width='0'></iframe> </noscript> <div id='container'> <a class='skip-to-content-link' href='#main' role='link'>Skip to content</a> <div class='container-sub'> <header> <div class='row'> <div class='col-sm'> <a href='/opentextbooks/'> <picture id="banner"><!-- / %source{srcset: image_path('library/otl_logo_dark.webp'), media: '(prefers-color-scheme: dark)' } --> <img alt="Library Home" title="Open Textbook Library logo" width="1000" height="271" src="/assets/library/otl_logo-23d864367b91dd38b6ef8eeec20ee0ae733b8f3685c53f178fd4ea06f6a95100.webp" /> </picture></a> </div> <search class='col-sm align-self-end'> <form id="search-oer" action="/opentextbooks/textbooks" accept-charset="UTF-8" method="get"><div class='input-group input-group-sm'> <fieldset class="hw-combobox" data-async-id="search" data-controller="hw-combobox" data-hw-combobox-expanded-value="false" data-hw-combobox-name-when-new-value="q" data-hw-combobox-original-name-value="search" data-hw-combobox-autocomplete-value="both" data-hw-combobox-small-viewport-max-width-value="640px" data-hw-combobox-async-src-value="/opentextbooks/textbooks?for_id=search&amp;format=turbo_stream" data-hw-combobox-filterable-attribute-value="data-filterable-as" data-hw-combobox-autocompletable-attribute-value="data-autocompletable-as" data-hw-combobox-selected-class="hw-combobox__option--selected" data-hw-combobox-invalid-class="hw-combobox__input--invalid"> <label class="hw-combobox__label" for="search" hidden="hidden"></label> <input type="hidden" name="search" id="search-hw-hidden-field" data-hw-combobox-target="hiddenField" autocomplete="off" /> <div class="hw-combobox__main__wrapper" data-hw-combobox-target="mainWrapper"> <style nonce="b78e328ffc81ff9822de8cdfc909ad85"> .hw-combobox__announcer { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .hw_combobox__pagination__wrapper { height: 5px; } </style> <div class="hw-combobox__announcer" aria-live="polite" aria-atomic="true" data-hw-combobox-target="announcer"></div> <input id="search" role="combobox" class="hw-combobox__input" type="text" data-action="focus-&gt;hw-combobox#open input-&gt;hw-combobox#filterAndSelect keydown-&gt;hw-combobox#navigate click@window-&gt;hw-combobox#closeOnClickOutside focusin@window-&gt;hw-combobox#closeOnFocusOutside turbo:before-stream-render@document-&gt;hw-combobox#rerouteListboxStreamToDialog turbo:before-cache@document-&gt;hw-combobox#hideChipsForCache turbo:morph-element-&gt;hw-combobox#idempotentConnect" data-hw-combobox-target="combobox" data-async-id="search" aria-controls="search-hw-listbox" aria-owns="search-hw-listbox" aria-haspopup="listbox" aria-autocomplete="both" aria-activedescendant="" autocomplete="off" title="Textbook Search" placeholder="Search the Library"> <span class="hw-combobox__handle" data-action="click-&gt;hw-combobox#clearOrToggleOnHandleClick" data-hw-combobox-target="handle"></span> <ul id="search-hw-listbox" role="listbox" class="hw-combobox__listbox" hidden="hidden" data-hw-combobox-target="listbox" aria-multiselectable="false"> <li id="search__hw_combobox_pagination__wrapper" class="hw_combobox__pagination__wrapper" data-hw-combobox-target="endOfOptionsStream" aria-hidden="true"> <turbo-frame loading="lazy" id="search__hw_combobox_pagination" src="/opentextbooks/textbooks?for_id=search&amp;format=turbo_stream"></turbo-frame> </li> </ul> <div tabindex="-1" data-hw-combobox-target="dialogFocusTrap"></div> <div class="hw-combobox__dialog__wrapper"> <dialog class="hw-combobox__dialog" role="dialog" data-action="keydown-&gt;hw-combobox#navigate" data-hw-combobox-target="dialog"> <label class="hw-combobox__dialog__label" for="search-hw-dialog-combobox">Textbook Search</label> <input id="search-hw-dialog-combobox" role="combobox" class="hw-combobox__dialog__input" autofocus="autofocus" type="text" data-action="input-&gt;hw-combobox#filterAndSelect keydown-&gt;hw-combobox#navigate click@window-&gt;hw-combobox#closeOnClickOutside" data-hw-combobox-target="dialogCombobox" aria-controls="search-hw-dialog-listbox" aria-owns="search-hw-dialog-listbox" aria-autocomplete="both" aria-activedescendant=""> <ul id="search-hw-dialog-listbox" class="hw-combobox__dialog__listbox" role="listbox" data-hw-combobox-target="dialogListbox" aria-multiselectable="false"></ul> </dialog></div> </div></fieldset> <input type="submit" name="commit" value="Go" class="primary search-button btn btn-secondary white input-group-text" data-disable-with="Go" /> </div> </form></search> </div> </header> <div class='border-top'> <nav id='library-nav'> <ul> <li> <a href="/opentextbooks/subjects">Browse Subjects</a> <ul class="subject-directory"><li><a title="137 Business textbooks" data-unhide-mouseover="nav_textbook_subject_2" href="/opentextbooks/subjects/business">Business</a><a class="galaxy" aria-label="Expand Business" data-toggle="nav_textbook_subject_2" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_2" hidden="hidden"><li><a title="16 Accounting textbooks" href="/opentextbooks/subjects/accounting">Accounting</a></li><li><a title="22 Finance textbooks" href="/opentextbooks/subjects/finance">Finance</a></li><li><a title="13 Human Resources textbooks" href="/opentextbooks/subjects/human-resources">Human Resources</a></li><li><a title="54 Management textbooks" href="/opentextbooks/subjects/management">Management</a></li><li><a title="22 Marketing textbooks" href="/opentextbooks/subjects/marketing">Marketing</a></li></ul></li><li><a title="133 Computer Science textbooks" data-unhide-mouseover="nav_textbook_subject_3" href="/opentextbooks/subjects/computer-science-information-systems">Computer Science</a><a class="galaxy" aria-label="Expand Computer Science" data-toggle="nav_textbook_subject_3" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_3" hidden="hidden"><li><a title="5 Databases textbooks" href="/opentextbooks/subjects/databases">Databases</a></li><li><a title="27 Information Systems textbooks" href="/opentextbooks/subjects/information-systems">Information Systems</a></li><li><a title="26 Programming Languages textbooks" href="/opentextbooks/subjects/programming-languages">Programming Languages</a></li></ul></li><li><a title="129 Education textbooks" data-unhide-mouseover="nav_textbook_subject_5" href="/opentextbooks/subjects/education">Education</a><a class="galaxy" aria-label="Expand Education" data-toggle="nav_textbook_subject_5" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_5" hidden="hidden"><li><a title="44 Curriculum &amp; Instruction textbooks" href="/opentextbooks/subjects/curriculum-instruction">Curriculum &amp; Instruction</a></li><li><a title="10 Distance Education textbooks" href="/opentextbooks/subjects/distance-education">Distance Education</a></li><li><a title="16 Early Childhood textbooks" href="/opentextbooks/subjects/early-childhood">Early Childhood</a></li><li><a title="14 Elementary Education textbooks" href="/opentextbooks/subjects/elementary-education">Elementary Education</a></li><li><a title="31 Higher Education textbooks" href="/opentextbooks/subjects/higher-education">Higher Education</a></li><li><a title="10 Secondary Education textbooks" href="/opentextbooks/subjects/secondary-education">Secondary Education</a></li></ul></li><li><a title="114 Engineering &amp; Technology textbooks" data-unhide-mouseover="nav_textbook_subject_13" href="/opentextbooks/subjects/engineering">Engineering &amp; Technology</a><a class="galaxy" aria-label="Expand Engineering &amp; Technology" data-toggle="nav_textbook_subject_13" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_13" hidden="hidden"><li><a title="13 Civil Engineering textbooks" href="/opentextbooks/subjects/civil">Civil Engineering</a></li><li><a title="24 Electrical Engineering textbooks" href="/opentextbooks/subjects/electrical">Electrical Engineering</a></li><li><a title="18 Mechanical Engineering textbooks" href="/opentextbooks/subjects/mechanical">Mechanical Engineering</a></li></ul></li><li><a title="409 Humanities textbooks" data-unhide-mouseover="nav_textbook_subject_6" href="/opentextbooks/subjects/humanities">Humanities</a><a class="galaxy" aria-label="Expand Humanities" data-toggle="nav_textbook_subject_6" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_6" hidden="hidden"><li><a title="55 Arts textbooks" href="/opentextbooks/subjects/arts">Arts</a></li><li><a title="50 History textbooks" href="/opentextbooks/subjects/history">History</a></li><li><a title="121 Languages textbooks" href="/opentextbooks/subjects/languages">Languages</a></li><li><a title="12 Linguistics textbooks" href="/opentextbooks/subjects/linguistics">Linguistics</a></li><li><a title="123 Literature, Rhetoric, and Poetry textbooks" href="/opentextbooks/subjects/literature-rhetoric-and-poetry">Literature, Rhetoric, and Poetry</a></li><li><a title="18 Music textbooks" href="/opentextbooks/subjects/music">Music</a></li><li><a title="40 Philosophy textbooks" href="/opentextbooks/subjects/philosophy">Philosophy</a></li><li><a title="19 Religion textbooks" href="/opentextbooks/subjects/religion">Religion</a></li></ul></li><li><a title="51 Journalism, Media Studies &amp; Communications textbooks" data-unhide-mouseover="nav_textbook_subject_16" href="/opentextbooks/subjects/journalism-media-studies-communications">Journalism, Media Studies &amp; Communications</a><a class="galaxy" aria-label="Expand Journalism, Media Studies &amp; Communications" data-toggle="nav_textbook_subject_16" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_16" hidden="hidden"><li><a title="14 New Media Journalism textbooks" href="/opentextbooks/subjects/new-media-journalism">New Media Journalism</a></li></ul></li><li><a title="95 Law textbooks" data-unhide-mouseover="nav_textbook_subject_11" href="/opentextbooks/subjects/law">Law</a><a class="galaxy" aria-label="Expand Law" data-toggle="nav_textbook_subject_11" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_11" hidden="hidden"><li><a title="14 Administrative Law textbooks" href="/opentextbooks/subjects/administrative-law">Administrative Law</a></li><li><a title="26 Civil Law textbooks" href="/opentextbooks/subjects/law-civil-law">Civil Law</a></li><li><a title="19 Constitutional Law textbooks" href="/opentextbooks/subjects/constitutional-law">Constitutional Law</a></li><li><a title="25 Contract Law textbooks" href="/opentextbooks/subjects/environmental-law">Contract Law</a></li><li><a title="20 Criminal Law textbooks" href="/opentextbooks/subjects/criminal-law">Criminal Law</a></li><li><a title="12 Procedural Law textbooks" href="/opentextbooks/subjects/contract-law">Procedural Law</a></li><li><a title="22 Property Law textbooks" href="/opentextbooks/subjects/property-law">Property Law</a></li></ul></li><li><a title="174 Mathematics textbooks" data-unhide-mouseover="nav_textbook_subject_7" href="/opentextbooks/subjects/mathematics">Mathematics</a><a class="galaxy" aria-label="Expand Mathematics" data-toggle="nav_textbook_subject_7" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_7" hidden="hidden"><li><a title="29 Algebra textbooks" href="/opentextbooks/subjects/algebra">Algebra</a></li><li><a title="8 Analysis textbooks" href="/opentextbooks/subjects/analysis">Analysis</a></li><li><a title="48 Applied textbooks" href="/opentextbooks/subjects/applied">Applied</a></li><li><a title="31 Calculus textbooks" href="/opentextbooks/subjects/calculus">Calculus</a></li><li><a title="10 Geometry and Trigonometry textbooks" href="/opentextbooks/subjects/geometry-and-trigonometry">Geometry and Trigonometry</a></li><li><a title="83 Pure textbooks" href="/opentextbooks/subjects/pure">Pure</a></li><li><a title="28 Statistics textbooks" href="/opentextbooks/subjects/statistics">Statistics</a></li></ul></li><li><a title="101 Medicine textbooks" data-unhide-mouseover="nav_textbook_subject_17" href="/opentextbooks/subjects/medicine">Medicine</a><a class="galaxy" aria-label="Expand Medicine" data-toggle="nav_textbook_subject_17" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_17" hidden="hidden"><li><a title="22 Nursing textbooks" href="/opentextbooks/subjects/nursing">Nursing</a></li><li><a title="12 Nutrition textbooks" href="/opentextbooks/subjects/nutrition">Nutrition</a></li></ul></li><li><a title="244 Natural Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_8" href="/opentextbooks/subjects/natural-sciences">Natural Sciences</a><a class="galaxy" aria-label="Expand Natural Sciences" data-toggle="nav_textbook_subject_8" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_8" hidden="hidden"><li><a title="87 Biology textbooks" href="/opentextbooks/subjects/biology">Biology</a></li><li><a title="30 Chemistry textbooks" href="/opentextbooks/subjects/chemistry">Chemistry</a></li><li><a title="53 Earth Sciences textbooks" href="/opentextbooks/subjects/geology">Earth Sciences</a></li><li><a title="46 Physics textbooks" href="/opentextbooks/subjects/physics">Physics</a></li></ul></li><li><a title="266 Social Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_9" href="/opentextbooks/subjects/social-sciences">Social Sciences</a><a class="galaxy" aria-label="Expand Social Sciences" data-toggle="nav_textbook_subject_9" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_9" hidden="hidden"><li><a title="9 Anthropology textbooks" href="/opentextbooks/subjects/anthropology">Anthropology</a></li><li><a title="26 Cultural &amp; Ethnic Studies textbooks" href="/opentextbooks/subjects/cultural-ethnic-studies">Cultural &amp; Ethnic Studies</a></li><li><a title="39 Economics textbooks" href="/opentextbooks/subjects/economics">Economics</a></li><li><a title="15 Gender &amp; Sexuality Studies textbooks" href="/opentextbooks/subjects/gender-sexuality-studies">Gender &amp; Sexuality Studies</a></li><li><a title="20 Geography textbooks" href="/opentextbooks/subjects/geography">Geography</a></li><li><a title="24 Library Science and Museum Studies textbooks" href="/opentextbooks/subjects/library-science-and-museum-studies">Library Science and Museum Studies</a></li><li><a title="40 Political Science textbooks" href="/opentextbooks/subjects/political-science">Political Science</a></li><li><a title="49 Psychology textbooks" href="/opentextbooks/subjects/psychology">Psychology</a></li><li><a title="30 Sociology textbooks" href="/opentextbooks/subjects/sociology">Sociology</a></li></ul></li><li><a title="62 Student Success textbooks" href="/opentextbooks/subjects/student-success">Student Success</a></li></ul> </li> <li> <a href="/opentextbooks/books">About Open Textbooks</a> <ul> <li><a href="/opentextbooks/faq">FAQ</a></li> <li><a href="/opentextbooks/friends">Friends</a></li> </ul> </li> <li> <a href="/opentextbooks/textbooks/submit">Submit</a> <!-- / %ul --> <!-- / %li= link_to t('library.nav.menu.submit_book'), library_submit_path --> <!-- / %li= link_to t('library.nav.menu.submit_ancillary'), new_library_textbook_ancillary_path --> </li> <li><a href="/opentextbooks/discovery">Discovery</a></li> <li><a data-turbo="false" href="/oen">Open Education Network</a></li> </ul> </nav> </div> <br class='clearfloat'> <main id='main'> <div id='intro'> <div class='row'> <div class='col'> <h1 class='lozenge'>Transform Higher Education and Student Learning</h1> <p>Open textbooks are licensed by authors and publishers to be freely used and adapted. Download, edit and distribute them at no cost.</p> <p>Now offering 1604 open textbooks, the Open Textbook Library is supported by the <a href="/oen">Open Education Network</a>.</p> <br> <p class='center buttons'><a class="primary with-arrows" href="/opentextbooks/subjects">Browse Subjects</a></p> </div> </div> </div> <br> <br> <div class='row' id='showcase'> <section class='col-sm-6' id='NewBooks'> <h2>New Books</h2> <ul> <li class='row'> <div class='col-4 cover'><img alt="Read more about Strategies for Conducting Literary Research - 2e" title="Strategies for Conducting Literary Research - 2e cover image" class="cover " width="350" height="453" data-controller="common--cover" data-placeholder="/assets/common/placeholder-f8e123f91b7e13ad321132c609842fdd40121f691ee7db391b88763bc42be6a0.webp" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTQzNDgsInB1ciI6ImJsb2JfaWQifX0=--31824a6dc033364f9bbc15e520e323cf7fc12641/8.5x11_Cover-Page-350x453.png" /></div> <div class='col-8'> <h3><a href="/opentextbooks/textbooks/strategies-for-conducting-literary-research">Strategies for Conducting Literary Research</a></h3> <p class='buttons'><a aria-label="Read more about Strategies for Conducting Literary Research" class="primary with-arrows" href="/opentextbooks/textbooks/strategies-for-conducting-literary-research">Read more</a></p> </div> </li> <li class='row'> <div class='col-4 cover'><img alt="Read more about Atomic Physics for Everyone: An Introduction to Atomic Physics, Quantum Mechanics, and Precision Spectroscopy with No College-Level Prerequisites" title="Atomic Physics for Everyone: An Introduction to Atomic Physics, Quantum Mechanics, and Precision Spectroscopy with No College-Level Prerequisites cover image" class="cover " width="864" height="1316" data-controller="common--cover" data-placeholder="/assets/common/placeholder-f8e123f91b7e13ad321132c609842fdd40121f691ee7db391b88763bc42be6a0.webp" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTQzNDUsInB1ciI6ImJsb2JfaWQifX0=--c85ab21f7434361e7b6a8dffe5053f0cf3e522d4/Screen%20Shot%202025-03-12%20at%203.33.25%20PM.png" /></div> <div class='col-8'> <h3><a href="/opentextbooks/textbooks/atomic-physics-for-everyone-an-introduction-to-atomic-physics-quantum-mechanics-and-precision-spectroscopy-with-no-college-level-prerequisites">Atomic Physics for Everyone: An Introduction to Atomic Physics, Quantum Mechanics, and Precision Spectroscopy with No College-Level Prerequisites</a></h3> <p class='buttons'><a aria-label="Read more about Atomic Physics for Everyone: An Introduction to Atomic Physics, Quantum Mechanics, and Precision Spectroscopy with No College-Level Prerequisites" class="primary with-arrows" href="/opentextbooks/textbooks/atomic-physics-for-everyone-an-introduction-to-atomic-physics-quantum-mechanics-and-precision-spectroscopy-with-no-college-level-prerequisites">Read more</a></p> </div> </li> <li class='row'> <div class='col-4 cover'><img alt="Read more about CALL Principles and Practices" title="CALL Principles and Practices cover image" class="cover " width="2484" height="3731" data-controller="common--cover" data-placeholder="/assets/common/placeholder-f8e123f91b7e13ad321132c609842fdd40121f691ee7db391b88763bc42be6a0.webp" src="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTQyNDYsInB1ciI6ImJsb2JfaWQifX0=--d87cca8df468f2224fe422adb87357e99b7ede66/Cover-Capture-Edit.png" /></div> <div class='col-8'> <h3><a href="/opentextbooks/textbooks/call-principles-and-practices">CALL Principles and Practices</a></h3> <p class='buttons'><a aria-label="Read more about CALL Principles and Practices" class="primary with-arrows" href="/opentextbooks/textbooks/call-principles-and-practices">Read more</a></p> </div> </li> </ul> <p class='Bottom-Link'><a class="with-arrows" href="/opentextbooks/textbooks/newest">See newest textbooks</a></p> </section> <section class='col-sm-6' id='InDevelopment'> <h2>Coming Soon</h2> <ul> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1797">Principles of Cultivar Development</a></h3> <p>Published by Iowa State University Digital Press</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1781">Food Preparation Lab Manual for FSHN 1150</a></h3> <p>Published by Iowa State University Digital Press</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1779">Strategic Management and Case Analysis: An Integrated Approach</a></h3> <p>Published by Virginia Tech Publishing</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1778">Microbiology, Pharmacology, and Immunology for Pre-Clinical Students</a></h3> <p>Published by Virginia Tech Publishing</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1777">Significant Statistics</a></h3> <p>Published by Virginia Tech Publishing</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1763">Comprendre et se faire comprendre</a></h3> <p>Published by University of Wisconsin-Eau Claire</p> </div> </li> <li class='row'> <div class='col cover'> <h3><a href="/opentextbooks/textbooks/1679">Gateway to Business Analytics</a></h3> <p>Published by PALNI</p> </div> </li> </ul> <p class='Bottom-Link'><a class="with-arrows" href="/opentextbooks/textbooks/in_development">See textbooks being developed by OEN members</a></p> </section> </div> <br class='clearfloat'> </main> <br class='clearfloat'> </div> </div> </body> <footer class='center mt-auto'> <div class='container'> <div class='content px-5 py-3'> <div class='row'> <div class='socials left col-sm'> <p class='header'>Stay Updated</p> <a href="https://mastodon.social/@OpenEd_Network"><i class="fab fa-mastodon " alt="Open Education Network on Mastodon"></i> <p class='sr-only'>Twitter</p> </a><a href="https://www.linkedin.com/company/open-education-network"><i class="fab fa-linkedin " alt="Open Education Network on LinkedIn"></i> <p class='sr-only'>LinkedIn</p> </a><a href="https://www.youtube.com/channel/UC_lf4_Wss_uW0KGny_A3erg"><i class="fab fa-youtube " alt="Open Education Network on YouTube"></i> <p class='sr-only'>YouTube</p> </a></div> <div class='newsletter right col-sm'> <p class='header'>Join Our Newsletter</p> <div class='row'> <div class='col right offset-md-2' id='newsletter'> <form action='https://cl.exct.net/DEManager.aspx' method='post' name='subscribeForm'> <input name='_clientID' type='hidden' value='6329914'> <input name='_deExternalKey' type='hidden' value='BF8CCDC6-9A32-460A-B2A6-F74B89BA62BF'> <input name='_action' type='hidden' value='add'> <input name='_returnXML' type='hidden' value='0'> <input name='_successURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=true'> <input name='_errorURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=false'> <div class='input-group'> <input aria-label='Email Newsletter Signup' autocomplete='email' class='form-control email' id='newsletter_signup_email' name='Email Address' placeholder='email address' required title='Email Newsletter Signup' type='email'> <input class='btn primary' id='signup-button' type='submit' value='Subscribe'> </div> </form> </div> </div> </div> </div> <br class='clearfix'> <div class='row'> <div class='col center'> <p> CENTER FOR OPEN EDUCATION | The Open Education Network is based in the Center for Open Education in the University of Minnesota鈥檚 College of Education and Human Development. <br> University of Minnesota, 330 Wulling Hall, 86 Pleasant Street S.E., Minneapolis, MN 55455 </p> <p> <a href="http://creativecommons.org/licenses/by/4.0/"><img width="92" height="35" alt="Attribution License" class="license-img" src="/assets/library/licenses/Attribution-cc57bff26f2eb73610d0ffcd514b9aab049fe95712d702c23ba4d69f140bd07d.webp" /></a> Except where otherwise noted, content on this site is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a> </p> </div> </div> </div> </div> </footer> </html>

Pages: 1 2 3 4 5 6 7 8 9 10