????

Your IP : 18.190.219.46


Current Path : C:/inetpub/vhost/bcvt.kontum.gov.vn/www/
Upload File :
Current File : C:/inetpub/vhost/bcvt.kontum.gov.vn/www/53-es2015.js.map

{"version":3,"sources":["./node_modules/arcgis-js-api/core/cookie.js","./node_modules/arcgis-js-api/identity/Credential.js","./node_modules/arcgis-js-api/identity/IdentityManager.js","./node_modules/arcgis-js-api/identity/IdentityManagerBase.js","./node_modules/arcgis-js-api/identity/IdentityManagerDialog.js","./node_modules/arcgis-js-api/identity/OAuthCredential.js","./node_modules/arcgis-js-api/identity/OAuthInfo.js","./node_modules/arcgis-js-api/identity/OAuthSignInHandler.js","./node_modules/arcgis-js-api/identity/ServerInfo.js","./node_modules/arcgis-js-api/identity/nls/identity.js","./node_modules/arcgis-js-api/identity/nls/vi/identity.js","./node_modules/dijit/BackgroundIframe.js","./node_modules/dijit/Destroyable.js","./node_modules/dijit/Dialog.js","./node_modules/dijit/DialogUnderlay.js","./node_modules/dijit/Tooltip.js","./node_modules/dijit/Viewport.js","./node_modules/dijit/_AttachMixin.js","./node_modules/dijit/_BidiMixin.js","./node_modules/dijit/_Container.js","./node_modules/dijit/_CssStateMixin.js","./node_modules/dijit/_DialogMixin.js","./node_modules/dijit/_FocusMixin.js","./node_modules/dijit/_OnDijitClickMixin.js","./node_modules/dijit/_TemplatedMixin.js","./node_modules/dijit/_Widget.js","./node_modules/dijit/_WidgetBase.js","./node_modules/dijit/_base/manager.js","./node_modules/dijit/a11y.js","./node_modules/dijit/a11yclick.js","./node_modules/dijit/focus.js","./node_modules/dijit/form/Button.js","./node_modules/dijit/form/Form.js","./node_modules/dijit/form/TextBox.js","./node_modules/dijit/form/ValidationTextBox.js","./node_modules/dijit/form/_ButtonMixin.js","./node_modules/dijit/form/_FormMixin.js","./node_modules/dijit/form/_FormValueMixin.js","./node_modules/dijit/form/_FormValueWidget.js","./node_modules/dijit/form/_FormWidget.js","./node_modules/dijit/form/_FormWidgetMixin.js","./node_modules/dijit/form/_TextBoxMixin.js","./node_modules/dijit/form/nls/validate.js","./node_modules/dijit/form/nls/vi/validate.js","./node_modules/dijit/hccss.js","./node_modules/dijit/layout/ContentPane.js","./node_modules/dijit/layout/_ContentPaneResizeMixin.js","./node_modules/dijit/layout/utils.js","./node_modules/dijit/main.js","./node_modules/dijit/nls/common.js","./node_modules/dijit/nls/loading.js","./node_modules/dijit/nls/vi/common.js","./node_modules/dijit/nls/vi/loading.js","./node_modules/dijit/place.js","./node_modules/dijit/registry.js","webpack:///./node_modules/arcgis-js-api/identity/nls/identity.js?fdcb","webpack:///./node_modules/dijit/form/nls/validate.js?4a5e","webpack:///./node_modules/dijit/nls/common.js?bdd1","webpack:///./node_modules/dijit/nls/loading.js?76aa","./node_modules/dijit/form/templates/Button.html","./node_modules/dijit/form/templates/TextBox.html","./node_modules/dijit/form/templates/ValidationTextBox.html","./node_modules/dijit/templates/Dialog.html","./node_modules/dijit/templates/Tooltip.html","./node_modules/dojo/_base/fx.js","./node_modules/dojo/_base/url.js","./node_modules/dojo/cache.js","./node_modules/dojo/date/stamp.js","./node_modules/dojo/dnd/Moveable.js","./node_modules/dojo/dnd/Mover.js","./node_modules/dojo/dnd/TimedMoveable.js","./node_modules/dojo/dnd/autoscroll.js","./node_modules/dojo/dnd/common.js","./node_modules/dojo/dom-class.js","./node_modules/dojo/domReady.js","./node_modules/dojo/hccss.js","./node_modules/dojo/html.js","./node_modules/dojo/parser.js","./node_modules/dojo/query.js","./node_modules/dojo/ready.js","./node_modules/dojo/request.js","./node_modules/dojo/selector/_loader.js","./node_modules/dojo/selector/lite.js","./node_modules/dojo/string.js","./node_modules/dojo/text.js","./node_modules/dojo/touch.js","./node_modules/dojo/uacss.js","./node_modules/dojo/window.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,mCAAC,cAAc,kBAAkB,iBAAiB,EAAE,gBAAgB,uBAAuB,eAAe,oDAAoD,gDAAgD,kCAAkC,gBAAgB,KAAK,KAAK,WAAW,mBAAmB,kBAAkB,sCAAsC,SAAS,kBAAkB;AAAA,oGAAC,C;;;;;;;;;;;ACxBxZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,gHAAuB,CAAC,mCAAC,gBAAgB,oBAAoB;AAAA,oGAAC,C;;;;;;;;;;;ACxB1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,8EAAW,CAAC,0FAAiB,CAAC,oHAAyB,CAAC,8GAAsB,CAAC,mCAAC,sBAAsB,+BAA+B,gBAAgB;AAAA,oGAAC,C;;;;;;;;;;;ACxBlL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,wHAAgC,CAAC,wIAAwC,CAAC,4HAAkC,CAAC,8EAAW,CAAC,8EAAW,CAAC,gFAAY,CAAC,wFAAgB,CAAC,sFAAe,CAAC,0FAAiB,CAAC,wFAAgB,CAAC,oFAAc,CAAC,wFAAgB,CAAC,oGAAsB,CAAC,wFAAgB,CAAC,4FAAkB,CAAC,4FAAkB,CAAC,gIAAoC,CAAC,wGAAmB,CAAC,4FAAa,CAAC,8FAAc,CAAC,mCAAC,sDAAsD,sCAAsC,SAAS,EAAE,QAAQ,eAAe,yFAAyF,4BAA4B,iBAAiB,qCAAqC,wBAAwB,GAAG,eAAe,aAAa,yBAAyB,qkBAAqkB,0GAA0G,EAAE,0GAA0G,EAAE,yHAAyH,EAAE,uHAAuH,EAAE,8GAA8G,gkBAAgkB,sBAAsB,IAAI,sDAAsD,8BAA8B,0BAA0B,kCAAkC,yEAAyE,6FAA6F,EAAE,4CAA4C,6BAA6B,0BAA0B,oCAAoC,iDAAiD,uCAAuC,MAAM,IAAI,0FAA0F,qOAAqO,oGAAoG,6FAA6F,+BAA+B,kBAAkB,6CAA6C,kBAAkB,6CAA6C,kBAAkB,+CAA+C,kBAAkB,EAAE,EAAE,oCAAoC,WAAW,MAAM,sCAAsC,mDAAmD,MAAM,SAAS,sBAAsB,gEAAgE,oCAAoC,MAAM,SAAS,sBAAsB,4CAA4C,uCAAuC,yBAAyB,6HAA6H,GAAG,wCAAwC,MAAM,uBAAuB,+BAA+B,WAAW,KAAK,WAAW,4CAA4C,IAAI,OAAO,SAAS,uCAAuC,MAAM,uBAAuB,8BAA8B,WAAW,KAAK,WAAW,+CAA+C,IAAI,OAAO,SAAS,0CAA0C,QAAQ,qGAAqG,WAAW,KAAK,WAAW,uEAAuE,IAAI,OAAO,oCAAoC,WAAW,KAAK,WAAW,6FAA6F,IAAI,OAAO,SAAS,yCAAyC,aAAa,iDAAiD,2BAA2B,8DAA8D,UAAU,EAAE,8CAA8C,UAAU,yBAAyB,2DAA2D,kCAAkC,kBAAkB,6HAA6H,kHAAkH,2CAA2C,sFAAsF,wCAAwC,GAAG,cAAc,8BAA8B,yIAAyI,QAAQ,wBAAwB,gCAAgC,mCAAmC,6BAA6B,kGAAkG,KAAK,8BAA8B,4IAA4I,oKAAoK,kFAAkF,6IAA6I,2BAA2B,yCAAyC,sQAAsQ,2CAA2C,iLAAiL,qhBAAqhB,eAAe,0KAA0K,kHAAkH,gEAAgE,aAAa,kGAAkG,eAAe,qBAAqB,kDAAkD,EAAE,+BAA+B,mBAAmB,2CAA2C,kDAAkD,oBAAoB,EAAE,4CAA4C,gBAAgB,6BAA6B,UAAU,mBAAmB,SAAS,UAAU,oIAAoI,KAAK,mBAAmB,cAAc,2BAA2B,KAAK,mBAAmB,cAAc,4BAA4B,uCAAuC,6BAA6B,mBAAmB,sHAAsH,uCAAuC,cAAc,oBAAoB,sDAAsD,sCAAsC,kGAAkG,2DAA2D,OAAO,cAAc,EAAE,mBAAmB,OAAO,oCAAoC,EAAE,+CAA+C,qBAAqB,iDAAiD,qBAAqB,2CAA2C,qBAAqB,6CAA6C,YAAY,EAAE,iCAAiC,sCAAsC,2BAA2B,MAAM,sCAAsC,8BAA8B,gVAAgV,0CAA0C,gEAAgE,uDAAuD,sBAAsB,2CAA2C,qIAAqI,yDAAyD,EAAE,oCAAoC,oMAAoM,4DAA4D,KAAK,QAAQ,sBAAsB,8IAA8I,2DAA2D,2CAA2C,wCAAwC,4BAA4B,oCAAoC,WAAW,KAAK,WAAW,sCAAsC,IAAI,OAAO,SAAS,wCAAwC,2DAA2D,2CAA2C,SAAS,iEAAiE,qCAAqC,0NAA0N,oCAAoC,mBAAmB,0DAA0D,gDAAgD,iDAAiD,wOAAwO,kDAAkD,6OAA6O,iDAAiD,iIAAiI,uKAAuK,sCAAsC,mFAAmF,mFAAmF,wCAAwC,mCAAmC,0CAA0C,uDAAuD,uCAAuC,wDAAwD,+CAA+C,MAAM,mDAAmD,0EAA0E,eAAe,4CAA4C,yCAAyC,4IAA4I,SAAS,yCAAyC,uHAAuH,0LAA0L,yCAAyC,qCAAqC,yCAAyC,cAAc,sCAAsC,8DAA8D,EAAE,SAAS,2HAA2H,oDAAoD,kEAAkE,SAAS,+CAA+C,iBAAiB,qBAAqB,KAAK,qBAAqB,kCAAkC,IAAI,OAAO,SAAS,oCAAoC,4EAA4E,yCAAyC,iBAAiB,qDAAqD,qCAAqC,0DAA0D,OAAO,SAAS,qBAAqB,mBAAmB,cAAc,GAAG,sBAAsB,4BAA4B,SAAS,oCAAoC,kDAAkD,oCAAoC,8DAA8D,uIAAuI,wBAAwB,kGAAkG,SAAS,mHAAmH,0CAA0C,wLAAwL,OAAO,SAAS,6DAA6D,mBAAmB,cAAc,EAAE,0CAA0C,kCAAkC,2CAA2C,WAAW,4BAA4B,wDAAwD,WAAW,KAAK,uBAAuB,gBAAgB,IAAI,MAAM,kBAAkB,yBAAyB,WAAW,KAAK,WAAW,4DAA4D,IAAI,QAAQ,MAAM,WAAW,mKAAmK,SAAS,wCAAwC,uDAAuD,kCAAkC,WAAW,iBAAiB,WAAW,KAAK,4BAA4B,yDAAyD,SAAS,2CAA2C,4BAA4B,qGAAqG,mVAAmV,SAAS,qDAAqD,gFAAgF,8CAA8C,sDAAsD,8KAA8K,2BAA2B,IAAI,uHAAuH,SAAS,4CAA4C,0UAA0U,mCAAmC,WAAW,gDAAgD,kBAAkB,oEAAoE,+UAA+U,qBAAqB,mCAAmC,wCAAwC,8BAA8B,6CAA6C,qCAAqC,+FAA+F,4EAA4E,aAAa,mGAAmG,eAAe,wJAAwJ,qBAAqB,oGAAoG,6CAA6C,+CAA+C,MAAM,mBAAmB,qEAAqE,qBAAqB,kFAAkF,GAAG,MAAM,gCAAgC,kmBAAkmB,2FAA2F,+DAA+D,4EAA4E,mBAAmB,wEAAwE,GAAG,WAAW,mBAAmB,OAAO,oEAAoE,kHAAkH,wBAAwB,uFAAuF,GAAG,kEAAkE,mBAAmB,SAAS,sJAAsJ,kKAAkK,qJAAqJ,WAAW,6CAA6C,iBAAiB,kBAAkB,gEAAgE,iFAAiF,cAAc,wDAAwD,gEAAgE,2BAA2B,+BAA+B,WAAW,KAAK,WAAW,gCAAgC,IAAI,OAAO,MAAM,2CAA2C,UAAU,2BAA2B,iBAAiB,+CAA+C,KAAK,qEAAqE,qEAAqE,EAAE,mBAAmB,SAAS,8IAA8I,GAAG,KAAK,KAAK,wCAAwC,6DAA6D,iGAAiG,mBAAmB,qDAAqD,aAAa,KAAK,IAAI,oBAAoB,uFAAuF,6BAA6B,eAAe,mBAAmB,qWAAqW,0CAA0C,sBAAsB,6BAA6B,YAAY,2BAA2B,yHAAyH,KAAK,wEAAwE,iBAAiB,8OAA8O,aAAa,mBAAmB,YAAY,mBAAmB,iEAAiE,6FAA6F,sFAAsF,mBAAmB,YAAY,kBAAkB,SAAS,IAAI,mBAAmB,YAAY,mBAAmB,oFAAoF,MAAM,4CAA4C,wJAAwJ,MAAM,uBAAuB,qBAAqB,8EAA8E,sEAAsE,OAAO,SAAS,qBAAqB,kBAAkB,0BAA0B,6EAA6E,EAAE,mCAAmC,6GAA6G,OAAO,yHAAyH,qBAAqB,mBAAmB,iBAAiB,iCAAiC,gGAAgG,EAAE,EAAE,0DAA0D,gBAAgB,wBAAwB,kBAAkB,cAAc,2BAA2B,+FAA+F,gDAAgD,0FAA0F,qCAAqC,uRAAuR,iCAAiC,sDAAsD,iDAAiD,yDAAyD,kCAAkC,QAAQ,2CAA2C,oBAAoB,cAAc,KAAK,OAAO,aAAa,sHAAsH,sCAAsC,mBAAmB,cAAc,KAAK,kBAAkB,WAAW,EAAE,6DAA6D,6JAA6J,oBAAoB,GAAG,4CAA4C,WAAW,4DAA4D,2DAA2D,oRAAoR,EAAE,yCAAyC,iCAAiC,uGAAuG,gLAAgL,gCAAgC,sKAAsK,qCAAqC,+EAA+E,+BAA+B,iBAAiB,qLAAqL,mBAAmB,gDAAgD,2CAA2C,iCAAiC,kHAAkH,iFAAiF,inBAAinB,gCAAgC,eAAe;AAAA,oGAAC,C;;;;;;;;;;;ACxBj86B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,0FAAiB,CAAC,2EAAe,CAAC,mEAAW,CAAC,6EAAgB,CAAC,yEAAc,CAAC,8EAAW,CAAC,oFAAc,CAAC,sFAAe,CAAC,4FAAkB,CAAC,oGAAsB,CAAC,gGAAoB,CAAC,gHAAuB,CAAC,0KAA0B,CAAC,mFAAmB,CAAC,+EAAiB,CAAC,yGAA8B,CAAC,mCAAC,oCAAoC,0DAA0D,cAAc,sEAAsE,gBAAgB,0KAA0K,uBAAuB,GAAG,KAAK,8BAA8B,cAAc,cAAc,uDAAuD,cAAc,2BAA2B,oBAAoB,kBAAkB,qBAAqB,GAAG,YAAY,8BAA8B,cAAc,cAAc,kCAAkC,qBAAqB,QAAQ,8JAA8J,oGAAoG,OAAO,sJAAsJ,sLAAsL,MAAM,iHAAiH,UAAU,8CAA8C,iIAAiI,uEAAuE,8CAA8C,aAAa,UAAU,4CAA4C,6BAA6B,6OAA6O,uEAAuE,uBAAuB,0GAA0G,+CAA+C,+BAA+B,2CAA2C,OAAO,6DAA6D,yEAAyE,WAAW,EAAE,aAAa,oGAAoG,oCAAoC,0DAA0D,mBAAmB,6DAA6D,yBAAyB,wCAAwC,qBAAqB,gFAAgF,gCAAgC,0CAA0C,qDAAqD,2HAA2H,oBAAoB,6DAA6D,cAAc,uKAAuK,sFAAsF,iBAAiB,mCAAmC,oFAAoF,sBAAsB,EAAE,wCAAwC,qBAAqB,sMAAsM,GAAG,oBAAoB,yCAAyC,gLAAgL,2BAA2B,EAAE,uDAAuD,aAAa,cAAc,qsBAAqsB,EAAE;AAAA,oGAAC,C;;;;;;;;;;;ACxBxyK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,mCAAC,cAAc,iBAAiB,gBAAgB,oJAAoJ,sCAAsC,SAAS,4CAA4C,iBAAiB,mBAAmB,uEAAuE,SAAS,6BAA6B,iBAAiB,oCAAoC,oCAAoC,yBAAyB,2BAA2B,kBAAkB,uEAAuE,IAAI,yDAAyD,SAAS,kBAAkB,gCAAgC,oCAAoC,iEAAiE,gGAAgG,qMAAqM,KAAK,yBAAyB,4BAA4B,kDAAkD,yBAAyB,MAAM,sBAAsB,IAAI,yDAAyD,SAAS,iBAAiB,2CAA2C,8BAA8B,oCAAoC,oCAAoC,yBAAyB,wGAAwG,8BAA8B,SAAS,iBAAiB,6CAA6C,SAAS,gBAAgB,SAAS,gBAAgB,SAAS,GAAG,GAAG,mEAAmE;AAAA,oGAAC,C;;;;;;;;;;;ACxBx6D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,wIAAwC,CAAC,4HAAkC,CAAC,kGAAqB,CAAC,gIAAoC,CAAC,mCAAC,sBAAsB,mBAAmB,cAAc,2BAA2B,gUAAgU,wCAAwC,kCAAkC,MAAM,sBAAsB,MAAM,UAAU,8CAA8C,MAAM,UAAU,sDAAsD,MAAM,UAAU,mDAAmD,MAAM,UAAU,mDAAmD,MAAM,UAAU,+CAA+C,MAAM,UAAU,+DAA+D,MAAM,UAAU,8CAA8C,MAAM,UAAU,yDAAyD,MAAM,UAAU,4DAA4D,MAAM,UAAU,kDAAkD,MAAM,UAAU,0FAA0F,4BAA4B;AAAA,oGAAC,C;;;;;;;;;;;ACxBh9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,8FAAc,CAAC,4FAAkB,CAAC,kFAAa,CAAC,sFAAe,CAAC,oGAAsB,CAAC,4FAAkB,CAAC,gGAAoB,CAAC,yEAAc,CAAC,6EAAgB,CAAC,2EAAe,CAAC,0KAA0B,CAAC,mFAAmB,CAAC,mCAAC,gCAAgC,mBAAmB,OAAO,gHAAgH,uBAAuB,GAAG,UAAU,8BAA8B,cAAc,cAAc,uDAAuD,cAAc,2BAA2B,oBAAoB,kBAAkB,qBAAqB,GAAG,YAAY,8BAA8B,cAAc,cAAc,wJAAwJ,MAAM,mHAAmH,UAAU,wDAAwD,0BAA0B,+BAA+B,wCAAwC,2CAA2C,+CAA+C,qEAAqE,+CAA+C,wCAAwC,4DAA4D,wFAAwF,iDAAiD,+JAA+J,oGAAoG,qBAAqB,kCAAkC,qBAAqB,6BAA6B,2EAA2E,yBAAyB,YAAY,4KAA4K,YAAY,KAAK,kDAAkD,mIAAmI,EAAE,wJAAwJ,+BAA+B,gDAAgD,OAAO,8DAA8D,WAAW,EAAE,aAAa,4GAA4G,sCAAsC,6BAA6B,mEAAmE,oBAAoB,6BAA6B,sCAAsC,uDAAuD,YAAY,kBAAkB,0DAA0D,cAAc,yXAAyX,gCAAgC,cAAc,uBAAuB,iFAAiF,OAAO,yMAAyM,iCAAiC,qGAAqG,YAAY,MAAM,mPAAmP,aAAa,kCAAkC,kBAAkB,MAAM,uDAAuD,cAAc,MAAM,KAAK,wDAAwD,0BAA0B,yFAAyF,wEAAwE,sBAAsB;AAAA,oGAAC,C;;;;;;;;;;;ACxBzsJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAO,CAAC,kCAAS,CAAC,OAAS,CAAC,wIAAwC,CAAC,4HAAkC,CAAC,kGAAqB,CAAC,gIAAoC,CAAC,mCAAC,sBAAsB,mBAAmB,cAAc,2BAA2B,+NAA+N,6BAA6B,MAAM,UAAU,6DAA6D,MAAM,UAAU,uDAAuD,MAAM,UAAU,kDAAkD,MAAM,UAAU,kDAAkD,MAAM,UAAU,wDAAwD,MAAM,UAAU,qDAAqD,MAAM,UAAU,+CAA+C,MAAM,UAAU,gEAAgE,MAAM,UAAU,wDAAwD,MAAM,UAAU,qFAAqF,4BAA4B;AAAA,oGAAC,C;;;;;;;;;;;ACxBhvC;AACA;AACA;AACA;AACA,mBAAQ,CAAC,SAAS,iFAAiF,OAAO,EAAE,SAAS,kCAAkC,OAAO,yYAAyY,oaAAoa,C;;;;;;;;;;;ACJ38B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAO,CAAC,+EAA+E,OAAO,EAAE,SAAS,qCAAqC,OAAO,sYAAsY,CAAC,C;;;;;;;;;;;ACxB5hB,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,iEAAQ;AACT,CAAC,mFAAmB;AACpB,CAAC,qFAAoB;AACrB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;;AAEpF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,oCAAoC,WAAW,UAAU;AACzD,qBAAqB,6BAA6B;AAClD;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACnHF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,uEAAa;AACd,CAAC,qFAAoB;AACrB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ,oBAAoB;AACpB;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClFF,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,iFAAkB;AACnB,CAAC,uEAAa;AACd,CAAC,qFAAoB;AACrB,CAAC,2EAAe;AAChB,CAAC,iEAAU;AACX,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,2EAAe;AAChB,CAAC,mEAAW;AACZ,CAAC,mEAAW;AACZ,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,qEAAY;AACb,CAAC,qEAAY;AACb,CAAC,uEAAa;AACd,CAAC,mFAAmB;AACpB,CAAC,6FAAwB;AACzB,CAAC,mEAAS;AACV,CAAC,mFAAiB;AAClB,CAAC,uEAAW;AACZ,CAAC,uFAAmB;AACpB,CAAC,qFAAkB;AACnB,CAAC,uFAAmB;AACpB,CAAC,iFAAgB;AACjB,CAAC,qFAAkB;AACnB,CAAC,6FAAsB;AACvB,CAAC,iFAAgB;AACjB,CAAC,wKAAmC;AACpC,CAAC,2EAAa;AACd,CAAC,qJAAwB;AACzB,CAAC,mCAAE;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,kBAAkB,uCAAuC;;AAEzD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,cAAc;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ,6CAA6C;;AAE7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ,8CAA8C;;AAE9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,sCAAsC;AAC9D;AACA;AACA,wBAAwB,8CAA8C;AACtE;AACA,uBAAuB;AACvB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA,MAAM;AACN;AACA,6BAA6B;AAC7B;AACA,KAAK;AACL,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gDAAgD;AAC7E;AACA;AACA,EAAE;AACF,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,6DAA6D;AACzE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,+CAA+C;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,QAAQ;AACnF,IAAI;;AAEJ;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,qBAAqB;AACrB,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACptBF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,+EAAiB;AAClB,CAAC,uEAAa;AACd,CAAC,2EAAe;AAChB,CAAC,6EAAgB;AACjB,CAAC,+DAAS;AACV,CAAC,uEAAa;AACd,CAAC,uEAAW;AACZ,CAAC,uFAAmB;AACpB,CAAC,yFAAoB;AACrB,CAAC,yEAAY;AACb,CAAC,iEAAQ;AACT,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,sCAAsC;AAC3E;AACA,GAAG;;AAEH;AACA,qCAAqC,sCAAsC;AAC3E;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH,aAAa,qBAAqB;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1KF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,2EAAe;AAChB,CAAC,iEAAU;AACX,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,mFAAiB;AAClB,CAAC,mEAAS;AACV,CAAC,uEAAW;AACZ,CAAC,uFAAmB;AACpB,CAAC,yFAAoB;AACrB,CAAC,0KAAoC;AACrC,CAAC,iEAAQ;AACT,CAAC,mCAAE;AACH;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,4BAA4B,kFAAkF;AAC9G,8BAA8B,kFAAkF;AAChH,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,qDAAqD;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC;;AAErC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2CAA2C,SAAS;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAiD,6BAA6B,EAAE;AAChF,IAAI;;AAEJ;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,oDAAoD;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,mDAAmD;AAC/D,IAAI;AACJ;;AAEA,yBAAyB,2DAA2D;AACpF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yEAAyE,YAAY;AACrF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,iBAAiB,EAAE;AAC9D,IAAI;;AAEJ;AACA;AACA,kBAAkB,yCAAyC,EAAE;;AAE7D;AACA;AACA;AACA;AACA;AACA,0BAA0B,yCAAyC,EAAE;AACrE,0BAA0B,kBAAkB,EAAE;AAC9C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,4BAA4B,EAAE;AAC3E;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B,iCAAiC;AACjC,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC,GAAG;;AAEH;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,2CAA2C,iBAAiB,EAAE;AAC9D,IAAI;;AAEJ;AACA;AACA,EAAE;;AAEF,wCAAwC;AACxC,kCAAkC;AAClC,kCAAkC;;AAElC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACjmBF,iGAAO;AACP,CAAC,yEAAc;AACf,CAAC,+DAAS;AACV,CAAC,2EAAe;AAChB,CAAC,qEAAY;AACb,CAAC,uEAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACtFF,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,+EAAe;AAChB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,6BAA6B;AAC7B,GAAG;;AAEH;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4EAA4E,0BAA0B,EAAE;AACxG;AACA;AACA,KAAK;AACL,0BAA0B,QAAQ;AAClC;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA,sDAAsD,iBAAiB,EAAE;AACzE;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC7OF,iGAAO,EAAE,mCAAE;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AChJF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,mFAAmB;AACpB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,+BAA+B,eAAe;AAC9C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,wCAAwC;AACxC,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,GAAG;;AAEH;AACA;AACA;AACA,mDAAmD;AACnD;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC3GF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,6EAAgB;AACjB,CAAC,iEAAU;AACX,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,2EAAe;AAChB,CAAC,qEAAY;AACb,CAAC,mFAAmB;AACpB,CAAC,2EAAa;AACd,CAAC,yEAAY;AACb,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,yCAAyC;AACzC;AACA;AACA;;AAEA,0BAA0B;AAC1B;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,+BAA+B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACnXF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,iEAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1EF,iGAAO;AACP,CAAC,mEAAS;AACV,CAAC,+EAAe;AAChB,CAAC,qFAAoB;AACrB,CAAC,+EAAiB;AAClB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACjEF,iGAAO;AACP,CAAC,+DAAS;AACV,CAAC,iFAAkB;AACnB,CAAC,mEAAW;AACZ,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,2EAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,MAAM;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF,2BAA2B;;AAE3B;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9BF,iGAAO;AACP,CAAC,qEAAY;AACb,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,uEAAa;AACd,CAAC,iFAAgB;AACjB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,IAAI;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,qDAAqD;AAClF,oCAAoC,6CAA6C,EAAE;AACnF,sBAAsB,WAAW;;AAEjC;AACA,gEAAgE;AAChE;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA,mBAAmB,IAAI,+CAA+C,IAAI;;AAE1E;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,eAAe;AACf,eAAe;AACf,kBAAkB;AAClB,iBAAiB;AACjB,KAAK;AACL,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,eAAe;AACpE;;AAEA;AACA;AACA,8CAA8C,IAAI;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,gBAAgB;AAC7B;AACA;;AAEA;;AAEA,kDAAkD,KAAK,KAAK;AAC5D;AACA,yCAAyC;AACzC,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC5MF,iGAAO;AACP,CAAC,uEAAa;AACd,CAAC,mFAAmB;AACpB,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,qEAAY;AACb,CAAC,yEAAY;AACb,CAAC,+EAAe;AAChB,CAAC,6FAAsB;AACvB,CAAC,+EAAe;AAChB,CAAC,qEAAY,iDAAiD;AAC9D,CAAC,mEAAS;AACV,CAAC,mCAAE;AACH;;;AAGA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA,GAAG,KAAK;AACR;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA,gGAAgG;AAChG,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;AACd;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,oBAAoB;AACpB,EAAE;AACF;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC/VF,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,iFAAkB;AACnB,CAAC,uEAAa;AACd,CAAC,mFAAmB;AACpB,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,2EAAe;AAChB,CAAC,6EAAgB;AACjB,CAAC,qFAAoB;AACrB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,iEAAU;AACX,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,2EAAe;AAChB,CAAC,qEAAY;AACb,CAAC,mFAAmB;AACpB,CAAC,+EAAe;AAChB,CAAC,wEAAiC;AAClC,CAAC,yEAAY;AACb,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,GAAG;AACH;;AAEA;AACA,SAAS,QAAQ,+BAA+B,WAAW;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,iCAAiC;;AAEnD;AACA,0CAA0C,KAAK;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA,yBAAyB;AACzB;AACA,gBAAgB;AAChB,kBAAkB;;AAElB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kDAAkD,oBAAoB;AACtE;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,gCAAgC;AAChC,KAAK;AACL;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,6DAA6D;AAC7D,2CAA2C;;AAE3C;AACA;AACA,iCAAiC;AACjC;AACA;;AAEA,gDAAgD;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,IAAI;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,sFAAsF,MAAM;AAC5F;AACA;AACA;AACA,8FAA8F,MAAM;AACpG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6EAA6E;AAC7E,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA,iEAAiE;AACjE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oEAAoE;AACpE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,mGAAmG;AACnG,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gBAAgB;AACjD;AACA,uCAAuC,sBAAsB,EAAE;AAC/D;AACA;AACA,kCAAkC;AAClC;AACA;AACA,iCAAiC,gBAAgB;AACjD;AACA;AACA;AACA,yBAAyB,gCAAgC;;AAEzD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACzsCF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,0EAAa;AACd,CAAC,kEAAS;AACV,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA,wBAAwB;AACxB,cAAc;AACd,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClCF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,iEAAU;AACX,CAAC,2EAAe;AAChB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,iEAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,0CAA0C;AAC1C,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAW;AACX,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;;AAEA,CAAC,KAAkB;;AAEnB;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9LF,iGAAO;AACP,CAAC,mEAAW;AACZ,CAAC,qEAAY;AACb,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,MAAM;AACjC,uBAAuB,aAAa;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF;AACA;AACA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1IF,iGAAO;AACP,CAAC,uEAAa;AACd,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,2EAAe;AAChB,CAAC,6EAAgB;AACjB,CAAC,qFAAoB;AACrB,CAAC,yEAAc;AACf,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,2EAAe;AAChB,CAAC,qEAAY;AACb,CAAC,2EAAe;AAChB,CAAC,mFAAmB;AACpB,CAAC,uEAAa;AACd,CAAC,iEAAQ;AACT,CAAC,yEAAY;AACb,CAAC,iEAAQ;AACT,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,MAAM;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;;AAE9C;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,MAAgB,GAAG,SAAe;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,8BAA8B,QAAQ;;AAEtC;AACA;AACA;AACA,6CAA6C,QAAQ;;AAErD;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS;;AAEb;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,4BAA4B,QAAQ;AACpC;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,sBAAsB,sCAAsC;AAC5D;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,iBAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,QAAQ,cAAc,EAAE,SAAS;AACjC;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClXF,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,qFAAoB;AACrB,CAAC,6EAAgB;AACjB,CAAC,iEAAU;AACX,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,oFAAe;AAChB,CAAC,sFAAgB;AACjB,CAAC,6KAAmC;AACpC,CAAC,4EAAc;AACf,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mCAAmC;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,kCAAkC;;AAExD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC3HF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,2EAAe;AAChB,CAAC,mFAAmB;AACpB,CAAC,qEAAY;AACb,CAAC,wEAAY;AACb,CAAC,wFAAoB;AACrB,CAAC,kFAAc;AACf,CAAC,sHAAmC;AACpC,CAAC,mCAAE;;AAEH;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+HAA+H,iBAAiB;;AAEhJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACvKF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,qFAAoB;AACrB,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,8FAAoB;AACrB,CAAC,wFAAiB;AAClB,CAAC,+KAAoC;AACrC,CAAC,kEAAS;AACV,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wJAAwJ,KAAK,IAAI,iBAAiB;;AAElL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS;AACf;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iDAAiD,sBAAsB,EAAE;AACzE;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,qBAAqB,QAAQ;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,oCAAoC;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9KF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,mEAAW;AACZ,CAAC,4EAAW;AACZ,CAAC,wEAAY;AACb,CAAC,mMAA8C;AAC/C,CAAC,8JAA0B;AAC3B,CAAC,mCAAE;;AAEH;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+CAA+C;AAC/C,GAAG;AACH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,mDAAmD;AACnD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mCAAmC;AAClD;AACA;AACA;AACA;;AAEA;AACA,4DAA4D;AAC5D;AACA,IAAI;AACJ,+CAA+C;AAC/C,oEAAoE;AACpE,IAAI;AACJ,+CAA+C;AAC/C;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,wBAAwB;AACxB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,iCAAiC;AACjC;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,KAAK;AAChD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,QAAQ;AACR;AACA,KAAK,SAAS;AACd;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,8CAA8C;AAC9C,GAAG;;AAEH;AACA,6BAA6B;AAC7B;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA,8BAA8B;AAC9B;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClVF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,iEAAU;AACX,CAAC,0EAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mCAAmC;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACvHF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,uEAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,mBAAmB;;;AAGhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kBAAkB,aAAa,EAAE;AACrC,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,+CAA+C;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;;AAEA;;AAEA;AACA;AACA;AACA;AACA,6CAA6C,6BAA6B,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,4BAA4B,EAAE;AAC7F,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA,iCAAiC,QAAQ;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,qCAAqC;AACrC;AACA,MAAM;AACN,yBAAyB;AACzB,MAAM;;AAEN;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,KAAK;;AAEL;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI,EAAE;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC,IAAI;;AAEJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,sDAAsD,uCAAuC,EAAE;AAC/F,GAAG;;AAEH;AACA;AACA;;AAEA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACrcF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,2EAAe;AAChB,CAAC,mEAAW;AACZ,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,8FAAoB;AACrB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AChFF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,qEAAY;AACb,CAAC,oFAAe;AAChB,CAAC,4FAAmB;AACpB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB;AACtB;AACA;AACA,iDAAiD;AACjD,2CAA2C;AAC3C;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,2CAA2C;AAC3C,+DAA+D;AAC/D;AACA;AACA,SAAS,EAAE;AACX;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClDF,iGAAO;AACP,CAAC,qFAAoB;AACrB,CAAC,qEAAY;AACb,CAAC,mFAAmB;AACpB,CAAC,qEAAY;AACb,CAAC,wEAAY;AACb,CAAC,sFAAmB;AACpB,CAAC,wFAAoB;AACrB,CAAC,8FAAoB;AACrB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClEF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,2EAAe;AAChB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,+DAAS;AACV,CAAC,qEAAY;AACb,CAAC,uEAAa;AACd,CAAC,kEAAS;AACV,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sDAAsD,MAAgB,GAAG,SAAa;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,OAAO;AACP,oBAAoB;AACpB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK,EAAE;AACP;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,EAAE;AACT;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC7PF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,iEAAU;AACX,CAAC,qEAAY;AACb,CAAC,mEAAW;AACZ,CAAC,+EAAiB;AAClB,CAAC,+DAAS;AACV,CAAC,kEAAS;AACV,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,0DAA0D;;AAE1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,gBAAgB,aAAa;AAC7B;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,qBAAqB,EAAE;AACpE;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,OAAO;AACZ;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,SAAS;AACZ;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACjiBF;AACA;AACA;AACA;AACA,mBAAQ,CAAC,SAAS,2IAA2I,geAAge,C;;;;;;;;;;;ACJ7nB,CAAC,mBAEA;AACD;AACA;AACA;AACA,CAAC,CAEA;;;;;;;;;;;;ACRD,iGAAO,CAAC,6EAAgB,EAAE,qEAAY,EAAE,2EAAe,EAAE,mFAAmB,CAAC,mCAAE;;AAE/E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACpBF,iGAAO;AACP,CAAC,mFAAmB;AACpB,CAAC,+EAAiB;AAClB,CAAC,wEAAY;AACb,CAAC,8EAAe;AAChB,CAAC,8GAA2B;AAC5B,CAAC,uEAAa;AACd,CAAC,mEAAW;AACZ,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,uFAAqB;AACtB,CAAC,iEAAU;AACX,CAAC,2EAAe;AAChB,CAAC,qFAAoB;AACrB,CAAC,6EAAgB;AACjB,CAAC,mEAAW;AACZ,CAAC,mEAAW;AACZ,CAAC,wJAA0B;AAC3B,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6GAA6G,aAAa;;AAE1H;AACA;AACA,uGAAuG,WAAW;;AAElH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+FAA+F,aAAa;AAC5G,YAAY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,8BAA8B;AAC9B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;;AAEA;;AAEA,8BAA8B;;AAE9B,8BAA8B;AAC9B,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oCAAoC;AACpC;AACA,KAAK;AACL;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,MAAM;AACN;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iCAAiC;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACxpBF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,qFAAoB;AACrB,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,qEAAY;AACb,CAAC,0EAAa;AACd,CAAC,0EAAa;AACd,CAAC,0EAAS;AACV,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,QAAQ;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;;AAEJ;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC;AACA,uDAAuD;AACvD;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8BAA8B,iBAAiB;AAC/C,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,qBAAqB;AACrB,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC3OF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,+EAAiB;AAClB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,WAAW;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;;AAEtB;;AAEA;AACA;AACA;AACA,oDAAoD,gEAAgE,EAAE;AACtH,kDAAkD,gEAAgE,EAAE;;AAEpH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qDAAqD;AACrD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;;AAEA,6CAA6C;;AAE7C;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACtJF,iGAAO;AACP,CAAC,mFAAmB;AACpB,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACfF;AACA;AACA;AACA;AACA,mBAAQ,CAAC,SAAS,gFAAgF,geAAge,C;;;;;;;;;;;ACJlkB;AACA;AACA;AACA;AACA,mBAAQ,CAAC,SAAS,oEAAoE,geAAge,C;;;;;;;;;;;ACJtjB,CAAC,mBAEA;AACD;AACA;AACA;AACA;AACA,CAAC,CAEA;;;;;;;;;;;;ACTD,CAAC,mBAEA;AACD;AACA;AACA,CAAC,CAEA;;;;;;;;;;;;ACPD,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,mFAAmB;AACpB,CAAC,6EAAgB;AACjB,CAAC,mFAAmB;AACpB,CAAC,mFAAmB;AACpB,CAAC,yEAAY;AACb,CAAC,iEAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB,aAAa;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B,UAAU,4BAA4B;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,MAAM;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iGAAiG,gBAAgB;AACjH;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kHAAkH,qEAAqE,mCAAmC,4DAA4D;;AAEtR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,iCAAiC;AACjG;AACA;AACA;AACA,IAAI;;AAEJ,qDAAqD,oBAAoB;AACzE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B;AAC5B,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACtZF,iGAAO;AACP,CAAC,iFAAkB;AACnB,CAAC,mFAAmB;AACpB,CAAC,iEAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;AAEA,wBAAwB;;AAExB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,gDAAgD;AAChD,GAAG;;AAEH;AACA;AACA;AACA,8CAA8C;AAC9C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB,EAAE;;AAEvE;AACA;AACA;AACA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,yEAAyE;AACzE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9JF,iGAAO,CAAC,mEAAW,EAAE,iJAA+G;AACpI,CAAC,oHAA+B;AAChC,CAAC,2KAA6I;AAC9I,CAAC,mCAAE;AACH,uDAAuD,mBAAmB;AAC1E,CAAC;AAAA,oGAAC,C;;;;;;;;;;;ACLF,iGAAO,CAAC,mEAAW,EAAE,iJAA+G;AACpI,CAAC,qGAA4B;AAC7B,CAAC,gJAA8H;AAC/H,CAAC,mCAAE;AACH,oDAAoD,mBAAmB;AACvE,CAAC;AAAA,oGAAC,C;;;;;;;;;;;ACLF,iGAAO,CAAC,mEAAW,EAAE,iJAA+G;AACpI,CAAC,uFAAqB;AACtB,CAAC,2HAAgH;AACjH,CAAC,mCAAE;AACH,6CAA6C,mBAAmB;AAChE,CAAC;AAAA,oGAAC,C;;;;;;;;;;;ACLF,iGAAO,CAAC,mEAAW,EAAE,iJAA+G;AACpI,CAAC,yFAAsB;AACvB,CAAC,8HAAkH;AACnH,CAAC,mCAAE;AACH,8CAA8C,mBAAmB;AACjE,CAAC;AAAA,oGAAC,C;;;;;;;;;;;ACLF,gYAAgY,GAAG,kLAAkL,sFAAsF,GAAG,+GAA+G,iBAAiB,UAAU,KAAK,aAAa,MAAM,yK;;;;;;;;;;;ACAhzB,sFAAsF,GAAG,sNAAsN,iBAAiB,SAAS,KAAK,wB;;;;;;;;;;;ACA9U,yFAAyF,GAAG,uLAAuL,sRAAsR,iBAAiB,SAAS,KAAK,wB;;;;;;;;;;;ACAxkB,iFAAiF,GAAG,uKAAuK,GAAG,wMAAwM,aAAa,oHAAoH,aAAa,iIAAiI,mBAAmB,a;;;;;;;;;;;ACAxuB,0X;;;;;;;;;;;ACAA,iGAAO,CAAC,0EAAU,EAAE,0EAAU,+BAA+B,sEAAQ,EAAE,uEAAY,EAAE,wEAAS,EAAE,qEAAW,EAAE,mEAAU,EAAE,+DAAQ,EAAE,2EAAc,CAAC,mCACjJ;AACD;AACA;AACA;AACA,gFAAgF;AAChF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,WAAW;AAC1B,aAAa;AACb,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,oBAAoB;AACpB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,eAAe,EAAE;AACvC,yCAAyC;;AAEzC;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,SAAS,SAAS;AAChD;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,SAAS,SAAS;AAChD;;AAEA;AACA;AACA;AACA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC,QAAQ;AACR;AACA;AACA,qBAAqB,SAAS,0BAA0B,EAAE;AAC1D;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,iBAAiB,uCAAuC;AACxD,kBAAkB,sCAAsC;AACxD,sBAAsB;AACtB;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,SAAS,WAAW,EAAE;AAC3C;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,YAAY;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,YAAY,EAAE;AAC7C,6BAA6B,YAAY;AACzC;AACA;AACA,QAAQ;AACR;;AAEA;AACA,mBAAmB,mCAAmC;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gCAAgC,YAAY;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,cAAc,qDAAqD;AACnE,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA,0BAA0B,aAAa;AACvC,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;AAGA,IAAI,IAAkB;AACtB;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACnqBF,iGAAO,CAAC,0EAAU,CAAC,mCAAE;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B,eAAe,UAAU;;AAEzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,sCAAsC,iBAAiB;;AAEvD;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC5GF,iGAAO,CAAC,gFAAgB,EAAE,gEAAQ,CAAC,mCAAE;AACrC;AACA;;AAEA;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACNF,iGAAO,CAAC,6EAAe,EAAE,+EAAgB,CAAC,mCAAE;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE;AACxG;;AAEA;AACA;;AAEA;AACA;AACA,eAAe,YAAY;AAC3B,eAAe,kBAAkB;;AAEjC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,kHAAkH;AAClH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC/IF,iGAAO;AACP,CAAC,+EAAgB,EAAE,mFAAkB,EAAE,6EAAe,EAAE,+DAAQ,EAAE,2EAAc,EAAE,uEAAY;AAC9F,CAAC,+DAAQ,EAAE,6DAAO,EAAE,mEAAU,EAAE,mEAAU,EAAE,wEAAU,EAAE,sEAAS,EAAE,iFAAiB;AACpF,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,IAAmB;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,aAAa;AAC3B;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,8CAA8C,iBAAiB,EAAE;AACjE;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;AACF;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA,EAAE;AACF;AACA;AACA,0CAA0C;AAC1C;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AClNF,iGAAO;AACP,CAAC,+EAAgB,EAAE,mFAAkB,EAAE,6EAAe,EAAE,mEAAU,EAAE,iFAAiB;AACrF,CAAC,+DAAQ,EAAE,iFAAiB,EAAE,2EAAc,EAAE,uEAAY,EAAE,6DAAO,EAAE,mEAAU,EAAE,wEAAU,EAAE,gFAAc;AAC3G,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,mCAAmC;AAC7D;AACA;AACA,EAAE;AACF;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,8CAA8C,iBAAiB,EAAE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACnIF,iGAAO,CAAC,mFAAkB,EAAE,4EAAY,4BAA4B,mCAAE;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,EAAE;AACF,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC/DF,iGAAO,CAAC,6EAAe,EAAE,mEAAU,EAAE,iFAAiB,EAAE,iFAAiB,EAAE,2EAAc,EAAE,qEAAW,CAAC,mCACtG;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,6EAA6E;AAC7E;AACA;AACA;AACA,EAAE;AACF,2EAA2E;AAC3E;AACA;AACA;;AAEA,uBAAuB;AACvB,0BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,sBAAsB,GAAG;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACnJF,iGAAO,CAAC,mEAAU,EAAE,iFAAiB,EAAE,6EAAe,EAAE,+DAAQ,CAAC,mCAChE;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC3CF,iGAAO,CAAC,4EAAc,EAAE,8EAAe,EAAE,8DAAO,CAAC,mCAAE;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,UAAU,EAAE;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,IAAI;;AAEJ;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA,KAAK;AACL;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;;AAE5D,uFAAuF;AACvF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8BAA8B,uBAAuB;AACrD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACrUF,iGAAO,CAAC,oEAAU,EAAE,8DAAO,CAAC,mCAAE;AAC9B;AACA,iBAAiB,6BAA6B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,4BAA4B;;AAE/C;AACA;;AAEA,qBAAqB,QAAQ;AAC7B;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kFAAkF,QAAQ;;AAE1F;AACA,sBAAsB,6BAA6B;;AAEnD;AACA;AACA,IAAI;AACJ;AACA;AACA,2BAA2B,qDAAqD,EAAE;AAClF;;AAEA,KAAK,KAA4B,CAAC,YAqB/B;;AAEH;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1HF,iGAAO;AACP,CAAC,kCAAS;AACV,CAAC,gFAAgB;AACjB,CAAC,0EAAa;AACd,CAAC,0EAAa;AACd,CAAC,8DAAO;AACR,CAAC,wEAAY;AACb,CAAC,gFAAgB;AACjB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C,wBAAwB,oBAAoB,aAAa,aAAa;AAChH,oGAAoG;AACpG;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,uBAAuB;AACvB,IAAI;AACJ;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACtDF,iGAAO,CAAC,gFAAgB,EAAE,4EAAc,EAAE,8EAAe,EAAE,kFAAiB,EAAE,8DAAO,EAAE,kFAAiB,EAAE,oEAAU,CAAC,mCACpH;AACD;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,eAAe;AACtD;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,qBAAqB;AACrB,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,sBAAsB,UAAU;AAChC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,OAAO;AACP;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,iBAAiB;AACtB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C,2CAA2C,QAAQ;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1XF,6GAAO;AACP,CAAC,kCAAS,EAAE,gFAAgB,EAAE,4EAAc,EAAE,8EAAe,EAAE,gFAAgB,EAAE,8DAAO,EAAE,gFAAgB;AAC1G,EAAE,0EAAa,EAAE,oEAAU,EAAE,8EAAe,EAAE,4EAAc,EAAE,wEAAY,EAAE,8DAAO,EAAE,kEAAS,EAAE,4DAAM,EAAE,kEAAS;AACjH,CAAC,mCAAE;;AAEH;AACA;;AAEA,eAAe;;AAEf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,uEAAuE;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4FAA4F;;AAE5F;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC,iBAAiB;AACjB,KAAK;AACL;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,MAAM;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM,IAA8B;AACpC;AACA;AACA,IAAI,KAAK,qBAoBL;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA,cAAc,oBAAoB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C,OAAO;AACP,iBAAiB,yBAAyB;AAC1C,OAAO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,2CAA2C;AAC/D,MAAM;AACN,oBAAoB,uBAAuB;AAC3C,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,oBAAoB;AAClC;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA,cAAc,oBAAoB;AAClC;AACA;AACA,cAAc,gBAAgB;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,sEAAsE;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO,KAA0B,CAAC,EAE7B;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,SAAS,EAAE;;AAEzG,uBAAuB,yBAAyB;AAChD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,IAAI;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA,iCAAiC,eAAe;AAChD;AACA,uBAAuB,mCAAmC;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,iBAAiB,KAAK;AACzD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA,IAAI,IAAkB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACx5BF,iGAAO,CAAC,gFAAgB,EAAE,8DAAO,EAAE,8DAAO,EAAE,4DAAM,EAAE,8EAAe,EAAE,4EAAc,EAAE,wFAAoB,EAAE,6FAA4B,CAAC,mCACvI;;AAED;;AAEA;AACA;AACA,4BAA4B,UAAU;AACtC,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,kCAAkC;AAClC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE,KAAuB,QAAQ,SAAE,CAAC;;AAEpC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,4EAA4E;AACrG,EAAE;AACF;;AAEA;AACA;AACA;AACA,yBAAyB,6DAA6D;AACtF,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,yCAAyC;AACzC,IAAI;AACJ;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,4CAA4C;AAC5C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,iCAAiC;AACjC;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,wEAAwE;AACxE,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA,IAAI,EAAE;AACN,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,SAAS;AACT,SAAS;;AAET;AACA;AACA,cAAc,qBAAqB;AACnC,gBAAgB,iBAAiB;AACjC,IAAI;AACJ,yBAAyB;AACzB;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,UAAU;AACV;AACA,oCAAoC,oBAAoB;AACxD;AACA,UAAU;AACV,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACvsBF,iGAAO,CAAC,gFAAgB,EAAE,8DAAO,EAAE,kCAAS,EAAE,wEAA+B,EAAE,4EAAc,CAAC,mCAAE;AAChG;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB,EAAE;AAChD,QAAQ;AACR;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B,EAAE;AAC5D,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB,mDAAmD,EAAE;AAC/F;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mDAAmD;AACnE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,KAAmE,CAAC,EAOtE;;AAEF;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACxJF,iGAAO;AACP,CAAC,kFAAoB;AACrB;AACA;AACA,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AChFF,6GAAO,CAAC,+DAAQ,EAAE,kCAAS,CAAC,mCAC1B;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,GAAG;AACH,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,KAAiB,UAAU,SAAI;AACpD,mBAAmB,KAAe,UAAU,SAAI;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC1DF,iGAAO,CAAC,+DAAQ,EAAE,iFAAiB,CAAC,mCAAE;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA,uC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uE;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;;AAEA,GAAG,KAA4B,CAAC,0BAiH/B;AACD,GAAG,KAAe,CAAC,gBAwBlB;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC,qBAAqB;;AAEtB;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9RF,iGAAO;AACP,CAAC,gFAAgB;AACjB,CAAC,4EAAc;AACf,CAAC,mCAAE;;AAEH;AACA;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX,WAAW;AACX,aAAa;AACb,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU,WAAW;AACrB;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,WAAW;;AAEjC;AACA,OAAO;AACP;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,IAAI;AAClD,QAAQ,WAAW;AACnB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,EAAE,+BAA+B,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAK,+BAA+B,SAAS;AAC7D,QAAQ,0BAA0B,eAAe;AACjD;AACA;AACA;AACA;AACA;AACA,UAAU,EAAE,mBAAmB,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,UAAU;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kDAAkD,UAAU;;AAE5D,8BAA8B,SAAS,iBAAiB,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG,EAAE;AACL;;AAEA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;AC9LF,iGAAO,CAAC,gFAAgB,EAAE,kCAAS,EAAE,8DAAO,EAAE,sEAA8B,CAAC,mCAAE;AAC/E;AACA;;AAEA;AACA,IAAI,IAAmB;AACvB;AACA,iBAAiB,uBAAuB,2BAA2B,EAAE;AACrE;AACA,EAAE,IAAI,EAQJ;;AAEF;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH,eAAe;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,eAAe;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;;AAE3F;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;AAAA,oGAAC;;;;;;;;;;;;;ACxNF,iGAAO,CAAC,gFAAgB,EAAE,oEAAU,EAAE,8DAAO,EAAE,0EAAa,EAAE,4EAAc,EAAE,4DAAM,EAAE,8DAAO,EAAE,kEAAS,EAAE,wEAAY,EAAE,gFAAgB,CAAC,mCACzI;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,sDAAsD;AAC3E,oBAAoB,MAAgB;AACpC,KAAK,SAA0D;AAC/D;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,aAAa;AACjD,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,6CAA6C;AACvD;;AAEA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,6CAA6C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,aAAa,6CAA6C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;AACH;AACA;AACA,6BAA6B;;AAE7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;;AAEN,4CAA4C;AAC5C,KAAK;;AAEL;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA,KAAK;AACL,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,2CAA2C;AAC3C,8CAA8C;AAC9C,6CAA6C;AAC7C;AACA;AACA,uCAAuC;AACvC,sCAAsC;AACtC,yCAAyC;AACzC,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,KAAkB;;AAEnB;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACheF,iGAAO,CAAC,gFAAgB,EAAE,4EAAc,EAAE,wEAAY,EAAE,kEAAS,EAAE,gFAAgB,CAAC,mCACnF;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,CAAC;AAAA,oGAAC;;;;;;;;;;;;ACpFF,iGAAO,CAAC,4EAAc,EAAE,kEAAS,EAAE,gFAAgB,EAAE,8DAAO,EAAE,gFAAgB,EAAE,0EAAa,EAAE,kFAAiB,CAAC,mCAChH;;AAED;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB,mCAAmC;AACnC;AACA,sDAAsD;AACtD;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA,8CAA8C;AAC9C,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sBAAsB,QAAQ,EAAE;AAChC;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA,iDAAiD;AACjD;AACA;AACA;AACA,MAAM;AACN;AACA,sBAAsB,iBAAiB,iBAAiB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,0BAA0B;AAC1B;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,qEAAqE,QAAQ;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA,CAAC,KAAkB;;AAEnB;AACA,CAAC;AAAA,oGAAC","file":"53-es2015.js","sourcesContent":["// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\"],function(e,i){function o(e,i,o){void 0===o&&(o={});var r=o.expires;if(\"number\"==typeof r){var t=new Date;t.setTime(t.getTime()+24*r*60*60*1e3),r=o.expires=t}\"string\"!=typeof r&&(o.expires=r.toUTCString());var n=e+\"=\"+encodeURIComponent(i);for(var f in o){n+=\"; \"+f;var p=o[f];!0!==p&&(n+=\"=\"+p)}document.cookie=n}Object.defineProperty(i,\"__esModule\",{value:!0}),i.writeCookie=o});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\",\"./IdentityManagerBase\"],function(e,n,r){return r.Credential});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\",\"../kernel\",\"../core/declare\",\"./IdentityManagerDialog\",\"./OAuthSignInHandler\"],function(e,n,r,i,a,t){var d=new a,l=i.safeMixin(d,t);return r.id=l,l});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\",\"../core/tsSupport/assignHelper\",\"../core/tsSupport/declareExtendsHelper\",\"../core/tsSupport/decorateHelper\",\"../config\",\"../kernel\",\"../request\",\"../core/cookie\",\"../core/Error\",\"../core/Evented\",\"../core/global\",\"../core/lang\",\"../core/object\",\"../core/promiseUtils\",\"../core/string\",\"../core/urlUtils\",\"../core/urlUtils\",\"../core/accessorSupport/decorators\",\"./OAuthCredential\",\"./OAuthInfo\",\"./ServerInfo\"],function(e,r,t,i,s,n,o,a,l,h,u,c,p,d,f,v,_,g,m,S,y,w){Object.defineProperty(r,\"__esModule\",{value:!0});var I={},k=function(e){var r=new g.Url(e.owningSystemUrl).host,t=new g.Url(e.server).host,i=/.+\\.arcgis\\.com$/i;return i.test(r)&&i.test(t)},U=function(e,r){return!!(k(e)&&r&&r.some(function(r){return r.test(e.server)}))},A=function(e){function r(){var r=e.call(this)||this;return r._portalConfig=c.esriGeowConfig,r.serverInfos=[],r.oAuthInfos=[],r.credentials=[],r._soReqs=[],r._xoReqs=[],r._portals=[],r.defaultOAuthInfo=null,r.defaultTokenValidity=60,r.tokenValidity=null,r.signInPage=null,r.useSignInPage=!0,r.normalizeWebTierAuth=!1,r._busy=null,r._rejectOnPersistedPageShow=!1,r._oAuthHash=null,r._gwTokenUrl=\"/sharing/rest/generateToken\",r._agsRest=\"/rest/services\",r._agsPortal=/\\/sharing(\\/|$)/i,r._agsAdmin=/(https?:\\/\\/[^\\/]+\\/[^\\/]+)\\/admin\\/?(\\/.*)?$/i,r._adminSvcs=/\\/rest\\/admin\\/services(\\/|$)/i,r._agolSuffix=\".arcgis.com\",r._gwDomains=[{regex:/^https?:\\/\\/www\\.arcgis\\.com/i,tokenServiceUrl:\"https://www.arcgis.com/sharing/rest/generateToken\"},{regex:/^https?:\\/\\/dev\\.arcgis\\.com/i,tokenServiceUrl:\"https://dev.arcgis.com/sharing/rest/generateToken\"},{regex:/^https?:\\/\\/[\\w\\.]*dev[^.]*\\.arcgis\\.com/i,tokenServiceUrl:\"https://devext.arcgis.com/sharing/rest/generateToken\"},{regex:/^https?:\\/\\/[\\w\\.]*qa[^.]*\\.arcgis\\.com/i,tokenServiceUrl:\"https://qaext.arcgis.com/sharing/rest/generateToken\"},{regex:/^https?:\\/\\/[\\w\\.]*\\.arcgis\\.com/i,tokenServiceUrl:\"https://www.arcgis.com/sharing/rest/generateToken\"}],r._legacyFed=[],r._regexSDirUrl=/http.+\\/rest\\/services\\/?/gi,r._regexServerType=/(\\/(MapServer|GeocodeServer|GPServer|GeometryServer|ImageServer|NAServer|FeatureServer|GeoDataServer|GlobeServer|MobileServer|GeoenrichmentServer|VectorTileServer|SceneServer)).*/gi,r._gwUser=/http.+\\/users\\/([^\\/]+)\\/?.*/i,r._gwItem=/http.+\\/items\\/([^\\/]+)\\/?.*/i,r._gwGroup=/http.+\\/groups\\/([^\\/]+)\\/?.*/i,r._rePortalTokenSvc=/\\/sharing(\\/rest)?\\/generatetoken/i,r._createDefaultOAuthInfo=!0,r._hasTestedIfAppIsOnPortal=!1,r._getOAuthHash(),window.addEventListener(\"pageshow\",function(e){r._pageShowHandler(e)}),r}return i(r,e),r.prototype.registerServers=function(e){var r=this,t=this.serverInfos;t?(e=e.filter(function(e){return!r.findServerInfo(e.server)}),this.serverInfos=t.concat(e)):this.serverInfos=e,e.forEach(function(e){e.owningSystemUrl&&r._portals.push(e.owningSystemUrl),e.hasPortal&&r._portals.push(e.server)})},r.prototype.registerOAuthInfos=function(e){var r=this,t=this.oAuthInfos;t?(e=e.filter(function(e){return!r.findOAuthInfo(e.portalUrl)}),this.oAuthInfos=t.concat(e)):this.oAuthInfos=e},r.prototype.registerToken=function(e){e=t({},e);var r,i=this._sanitizeUrl(e.server),s=this._isServerRsrc(i),n=this.findServerInfo(i),o=!0;n||(n=new w,n.server=this._getServerInstanceRoot(i),s?n.hasServer=!0:(n.tokenServiceUrl=this._getTokenSvcUrl(i),n.hasPortal=!0),this.registerServers([n])),r=this._findCredential(i),r?(delete e.server,p.mixin(r,e),o=!1):(r=new T({userId:e.userId,server:n.server,token:e.token,expires:e.expires,ssl:e.ssl,scope:s?\"server\":\"portal\"}),r.resources=[i],this.credentials.push(r)),r.emitTokenChange(!1),o||r.refreshServerTokens()},r.prototype.toJSON=function(){return p.fixJson({serverInfos:this.serverInfos.map(function(e){return e.toJSON()}),oAuthInfos:this.oAuthInfos.map(function(e){return e.toJSON()}),credentials:this.credentials.map(function(e){return e.toJSON()})})},r.prototype.initialize=function(e){var r=this;if(e){\"string\"==typeof e&&(e=JSON.parse(e));var t=e.serverInfos,i=e.oAuthInfos,s=e.credentials;if(t){var n=[];t.forEach(function(e){e.server&&e.tokenServiceUrl&&n.push(e.declaredClass?e:new w(e))}),n.length&&this.registerServers(n)}if(i){var o=[];i.forEach(function(e){e.appId&&o.push(e.declaredClass?e:new y(e))}),o.length&&this.registerOAuthInfos(o)}s&&s.forEach(function(e){e.server&&e.token&&e.expires&&e.expires>Date.now()&&(e=e.declaredClass?e:new T(e),e.emitTokenChange(),r.credentials.push(e))})}},r.prototype.findServerInfo=function(e){var r;e=this._sanitizeUrl(e);for(var t=0,i=this.serverInfos;t<i.length;t++){var s=i[t];if(this._hasSameServerInstance(s.server,e)){r=s;break}}return r},r.prototype.findOAuthInfo=function(e){var r;e=this._sanitizeUrl(e);for(var t=0,i=this.oAuthInfos;t<i.length;t++){var s=i[t];if(this._hasSameServerInstance(s.portalUrl,e)){r=s;break}}return r},r.prototype.findCredential=function(e,r){var t,i;if(e=this._sanitizeUrl(e),i=this._isServerRsrc(e)?\"server\":\"portal\",r)for(var s=0,n=this.credentials;s<n.length;s++){var o=n[s];if(this._hasSameServerInstance(o.server,e)&&r===o.userId&&o.scope===i){t=o;break}}else for(var a=0,l=this.credentials;a<l.length;a++){var o=l[a];if(this._hasSameServerInstance(o.server,e)&&-1!==this._getIdenticalSvcIdx(e,o)&&o.scope===i){t=o;break}}return t},r.prototype.getCredential=function(e,r){var i,s,n=!0;r&&(i=!!r.token,s=r.error,n=!1!==r.prompt),r=t({},r),e=this._sanitizeUrl(e);var o=f.createAbortController(),a=f.createResolver(function(){o.abort()});if(r&&r.signal&&f.onAbort(r.signal,function(){o.abort()}),f.onAbort(o,function(){a.reject(new h(\"identity-manager:user-aborted\",\"ABORTED\"))}),f.isAborted(o))return a.promise;r.signal=o.signal;var u,c=this._isAdminResource(e),p=i&&this._doPortalSignIn(e)?this._getEsriAuthCookie():null,d=i?this.findCredential(e):null;if(d&&s&&s.details&&498===s.details.httpStatus)d.destroy(),p&&p.token===r.token&&(l.writeCookie(\"esri_auth\",null,{expires:-1,path:\"/\",domain:document.domain}),v.endsWith(window.location.hostname,\".arcgis.com\")&&l.writeCookie(\"esri_auth\",null,{expires:-1,path:\"/\",domain:\"arcgis.com\"}));else if(p||d){var _=p&&p.email||d&&d.userId;return u=new h(\"identity-manager:not-authorized\",\"You are currently signed in as: '\"+_+\"'. You do not have access to this resource: \"+e,{error:s}),a.reject(u),a.promise}var g=this._findCredential(e,r);if(g)return a.resolve(g),a.promise;var m=this.findServerInfo(e);if(m)!m.hasServer&&this._isServerRsrc(e)&&(m._restInfoPms=this._getTokenSvcUrl(e),m.hasServer=!0);else{var S=this._getTokenSvcUrl(e);if(!S)return u=new h(\"identity-manager:unknown-resource\",\"Unknown resource - could not find token service endpoint.\"),a.reject(u),a.promise;m=new w,m.server=this._getServerInstanceRoot(e),\"string\"==typeof S?(m.tokenServiceUrl=S,m.hasPortal=!0):(m._restInfoPms=S,m.hasServer=!0),this.registerServers([m])}return n&&m.hasPortal&&void 0===m._selfReq&&!this._findOAuthInfo(e)&&(m._selfReq={owningTenant:r&&r.owningTenant,selfDfd:this._getPortalSelf(m.tokenServiceUrl.replace(this._rePortalTokenSvc,\"/sharing/rest/portals/self\"),e)}),this._enqueue(e,m,r,a,c)},r.prototype.getResourceName=function(e){return this._isRESTService(e)?e.replace(this._regexSDirUrl,\"\").replace(this._regexServerType,\"\")||\"\":this._gwUser.test(e)&&e.replace(this._gwUser,\"$1\")||this._gwItem.test(e)&&e.replace(this._gwItem,\"$1\")||this._gwGroup.test(e)&&e.replace(this._gwGroup,\"$1\")||\"\"},r.prototype.generateToken=function(e,r,t){var i,s,n,l,u,c,d,f,v,m,S=this._rePortalTokenSvc.test(e.tokenServiceUrl),y=new g.Url(window.location.href.toLowerCase()),w=this._getEsriAuthCookie(),k=e.shortLivedTokenValidity;return r&&(m=o.id.tokenValidity||k||o.id.defaultTokenValidity)>k&&k>0&&(m=k),t&&(s=t.isAdmin,n=t.serverUrl,l=t.token,d=t.signal,f=t.ssl,e.customParameters=t.customParameters),s?u=e.adminTokenServiceUrl:(u=e.tokenServiceUrl,c=new g.Url(u.toLowerCase()),w&&(i=w.auth_tier,i=i&&i.toLowerCase()),(\"web\"===i||e.webTierAuth)&&t&&t.serverUrl&&!f&&\"http\"===y.scheme&&(_.hasSameOrigin(y.uri,u,!0)||\"https\"===c.scheme&&y.host===c.host&&\"7080\"===y.port&&\"7443\"===c.port)&&(u=u.replace(/^https:/i,\"http:\").replace(/:7443/i,\":7080\"))),v=p.mixin({query:p.mixin({request:\"getToken\",username:r&&r.username,password:r&&r.password,serverUrl:n,token:l,expiration:m,referer:s||S?window.location.host:null,client:s?\"referer\":null,f:\"json\"},e.customParameters),method:\"post\",authMode:\"anonymous\",useProxy:this._useProxy(e,t),responseType:\"json\",signal:d},t&&t.ioArgs),S||(v.withCredentials=!1),a(u,v).then(function(t){var i=t.data;if(!i||!i.token)return new h(\"identity-manager:authentication-failed\",\"Unable to generate token\");var s=e.server;return I[s]||(I[s]={}),r&&(I[s][r.username]=r.password),i.validity=m,i})},r.prototype.isBusy=function(){return!!this._busy},r.prototype.checkSignInStatus=function(e){return this.checkAppAccess(e,\"\").then(function(e){return e.credential})},r.prototype.checkAppAccess=function(e,r,t){var i=this,s=!1;return this.getCredential(e,{prompt:!1}).then(function(n){var o,l={f:\"json\"};if(\"portal\"===n.scope)if(r&&(i._doPortalSignIn(e,!0)||t&&t.force))o=n.server+\"/sharing/rest/oauth2/validateAppAccess\",l.client_id=r;else{if(!n.token)return{credential:n};o=n.server+\"/sharing/rest\"}else{if(!n.token)return{credential:n};o=n.server+\"/rest/services\"}return n.token&&(l.token=n.token),a(o,{query:l,authMode:\"anonymous\"}).then(function(e){if(!1===e.data.valid)throw new h(\"identity-manager:not-authorized\",\"You are currently signed in as: '\"+n.userId+\"'.\");return s=!!e.data.viewOnlyUserTypeApp,{credential:n}}).catch(function(e){if(\"identity-manager:not-authorized\"===e.name)throw e;var r=e.details&&e.details.httpStatus;if(498===r)throw n.destroy(),new h(\"identity-manager:not-authenticated\",\"User is not signed in.\");if(400===r)throw new h(\"identity-manager:invalid-request\");return{credential:n}})}).then(function(e){return{credential:e.credential,viewOnly:s}})},r.prototype.setRedirectionHandler=function(e){this._redirectFunc=e},r.prototype.setProtocolErrorHandler=function(e){this._protocolFunc=e},r.prototype.destroyCredentials=function(){if(this.credentials){this.credentials.slice().forEach(function(e){e.destroy()})}this.emit(\"credentials-destroy\")},r.prototype._getOAuthHash=function(){var e=window.location.hash;if(e){\"#\"===e.charAt(0)&&(e=e.substring(1));var r=_.queryToObject(e),t=!1;r.access_token&&r.expires_in&&r.state&&r.hasOwnProperty(\"username\")?(r.state=JSON.parse(r.state),this._oAuthHash=r,t=!0):r.error&&r.error_description&&(console.log(\"IdentityManager OAuth Error: \",r.error,\" - \",r.error_description),\"access_denied\"===r.error&&(t=!0)),t&&(window.location.hash=\"object\"==typeof r.state&&r.state.hash||\"\")}},r.prototype._pageShowHandler=function(e){if(e.persisted&&this.isBusy()&&this._rejectOnPersistedPageShow){var r=new h(\"identity-manager:user-aborted\",\"ABORTED\");this._errbackFunc(r)}},r.prototype._findCredential=function(e,r){var t,i,s,n,o=this,a=-1,l=r&&r.token,h=r&&r.resource,u=this._isServerRsrc(e)?\"server\":\"portal\",c=this.credentials.filter(function(r){return o._hasSameServerInstance(r.server,e)&&r.scope===u});if(e=h||e,c.length)if(1===c.length){if(t=c[0],n=this.findServerInfo(t.server),i=n&&n.owningSystemUrl,s=i&&this.findCredential(i,t.userId),a=this._getIdenticalSvcIdx(e,t),!l)return-1===a&&t.resources.push(e),this._addResource(e,s),t;-1!==a&&(t.resources.splice(a,1),this._removeResource(e,s))}else{var p,d;if(c.some(function(r){return-1!==(d=o._getIdenticalSvcIdx(e,r))&&(p=r,n=o.findServerInfo(p.server),i=n&&n.owningSystemUrl,s=i&&o.findCredential(i,p.userId),a=d,!0)}),l)p&&(p.resources.splice(a,1),this._removeResource(e,s));else if(p)return this._addResource(e,s),p}},r.prototype._findOAuthInfo=function(e){var r=this.findOAuthInfo(e);if(!r)for(var t=0,i=this.oAuthInfos;t<i.length;t++){var s=i[t];if(this._isIdProvider(s.portalUrl,e)){r=s;break}}return r},r.prototype._addResource=function(e,r){r&&-1===this._getIdenticalSvcIdx(e,r)&&r.resources.push(e)},r.prototype._removeResource=function(e,r){var t=-1;r&&(t=this._getIdenticalSvcIdx(e,r))>-1&&r.resources.splice(t,1)},r.prototype._useProxy=function(e,r){return r&&r.isAdmin&&!_.hasSameOrigin(e.adminTokenServiceUrl,window.location.href)||!this._isPortalDomain(e.tokenServiceUrl)&&\"10.1\"===String(e.currentVersion)&&!_.hasSameOrigin(e.tokenServiceUrl,window.location.href)},r.prototype._getOrigin=function(e){var r=new g.Url(e);return r.scheme+\"://\"+r.host+(null!=r.port?\":\"+r.port:\"\")},r.prototype._getServerInstanceRoot=function(e){var r=e.toLowerCase(),t=r.indexOf(this._agsRest);return-1===t&&this._isAdminResource(e)&&(t=this._agsAdmin.test(e)?e.replace(this._agsAdmin,\"$1\").length:e.search(this._adminSvcs)),-1===t&&(t=r.indexOf(\"/sharing\")),-1===t&&\"/\"===r.substr(-1)&&(t=r.length-1),t>-1?e.substring(0,t):e},r.prototype._hasSameServerInstance=function(e,r){return\"/\"===e.substr(-1)&&(e=e.slice(0,-1)),e=e.toLowerCase(),r=this._getServerInstanceRoot(r).toLowerCase(),e=this._normalizeAGOLorgDomain(e),r=this._normalizeAGOLorgDomain(r),e=e.substr(e.indexOf(\":\")),r=r.substr(r.indexOf(\":\")),e===r},r.prototype._normalizeAGOLorgDomain=function(e){var r=/^https?:\\/\\/.+\\.maps\\.arcgis\\.com/i,t=/^https?:\\/\\/.+\\.mapsdevext\\.arcgis\\.com/i,i=/^https?:\\/\\/.+\\.mapsqa\\.arcgis\\.com/i;return r.test(e)?e=e.replace(r,\"https://www.arcgis.com\"):t.test(e)?e=e.replace(t,\"https://devext.arcgis.com\"):i.test(e)&&(e=e.replace(i,\"https://qaext.arcgis.com\")),e},r.prototype._sanitizeUrl=function(e){var r=(n.request.proxyUrl||\"\").toLowerCase(),t=r?e.toLowerCase().indexOf(r+\"?\"):-1;return-1!==t&&(e=e.substring(t+r.length+1)),e=_.normalize(e),_.urlToObject(e).path},r.prototype._isRESTService=function(e){return e.indexOf(this._agsRest)>-1},r.prototype._isAdminResource=function(e){return this._agsAdmin.test(e)||this._adminSvcs.test(e)},r.prototype._isServerRsrc=function(e){return this._isRESTService(e)||this._isAdminResource(e)},r.prototype._isIdenticalService=function(e,r){var t;if(this._isRESTService(e)&&this._isRESTService(r)){var i=this._getSuffix(e).toLowerCase(),s=this._getSuffix(r).toLowerCase();if(!(t=i===s)){var n=/(.*)\\/(MapServer|FeatureServer).*/gi;t=i.replace(n,\"$1\")===s.replace(n,\"$1\")}}else this._isAdminResource(e)&&this._isAdminResource(r)?t=!0:this._isServerRsrc(e)||this._isServerRsrc(r)||!this._isPortalDomain(e)||(t=!0);return t},r.prototype._isPortalDomain=function(e){var r=this,t=new g.Url(e.toLowerCase()),i=this._portalConfig,s=t.authority&&-1!==t.authority.indexOf(this._agolSuffix);return!s&&i&&(s=this._hasSameServerInstance(this._getServerInstanceRoot(i.restBaseUrl),t.uri)),s||n.portalUrl&&(s=_.hasSameOrigin(e,n.portalUrl,!0)),s||(s=this._portals.some(function(e){return r._hasSameServerInstance(e,t.uri)})),s=s||this._agsPortal.test(t.path)},r.prototype._isIdProvider=function(e,r){var t=-1,i=-1;this._gwDomains.forEach(function(s,n){-1===t&&s.regex.test(e)&&(t=n),-1===i&&s.regex.test(r)&&(i=n)});var s=!1;if(t>-1&&i>-1&&(0===t||4===t?0!==i&&4!==i||(s=!0):1===t?1!==i&&2!==i||(s=!0):2===t?2===i&&(s=!0):3===t&&3===i&&(s=!0)),!s){var n=this.findServerInfo(r),o=n&&n.owningSystemUrl;o&&k(n)&&this._isPortalDomain(o)&&this._isIdProvider(e,o)&&(s=!0)}return s},r.prototype._getIdenticalSvcIdx=function(e,r){for(var t=-1,i=0;i<r.resources.length;i++){var s=r.resources[i];if(this._isIdenticalService(e,s)){t=i;break}}return t},r.prototype._getSuffix=function(e){return e.replace(this._regexSDirUrl,\"\").replace(this._regexServerType,\"$1\")},r.prototype._getTokenSvcUrl=function(e){var r,t,i,s=this;if(this._isRESTService(e)||this._isAdminResource(e)){var n=this._getServerInstanceRoot(e);return r=n+\"/admin/generateToken\",e=n+\"/rest/info\",t=a(e,{query:{f:\"json\"},responseType:\"json\"}).then(function(e){return e.data}),{adminUrl:r,promise:t}}if(this._isPortalDomain(e)){var o=\"\";if(this._gwDomains.some(function(r){return r.regex.test(e)&&(o=r.tokenServiceUrl),!!o}),o||this._portals.some(function(r){return s._hasSameServerInstance(r,e)&&(o=r+s._gwTokenUrl),!!o}),o||-1!==(i=e.toLowerCase().indexOf(\"/sharing\"))&&(o=e.substring(0,i)+this._gwTokenUrl),o||(o=this._getOrigin(e)+this._gwTokenUrl),o){var l=new g.Url(e).port;/^http:\\/\\//i.test(e)&&\"7080\"===l&&(o=o.replace(/:7080/i,\":7443\")),o=o.replace(/http:/i,\"https:\")}return o}if(-1!==e.toLowerCase().indexOf(\"premium.arcgisonline.com\"))return\"https://premium.arcgisonline.com/server/tokens\"},r.prototype._getPortalSelf=function(e,r){return\"https:\"===window.location.protocol?e=e.replace(/^http:/i,\"https:\").replace(/:7080/i,\":7443\"):/^http:/i.test(r)&&(e=e.replace(/^https:/i,\"http:\").replace(/:7443/i,\":7080\")),a(e,{query:{f:\"json\"},authMode:\"anonymous\",responseType:\"json\",withCredentials:!0}).then(function(e){return e.data})},r.prototype._hasPortalSession=function(){return!!this._getEsriAuthCookie()},r.prototype._getEsriAuthCookie=function(){var e=null;if(navigator.cookieEnabled){for(var r=this._getAllCookies(\"esri_auth\"),t=void 0,i=0;i<r.length;i++){var s=JSON.parse(r[i]);if(s.portalApp){e=s;break}t?t.push(s):t=[s]}if(!e&&t)for(var n=0,o=t;n<o.length;n++){var s=o[n];if(window.location.hostname===s.urlKey+\".\"+s.customBaseUrl){e=s;break}}}if(e){var a=null;e.expires&&(\"number\"==typeof e.expires?a=e.expires:\"string\"==typeof e.expires&&(a=Date.parse(e.expires)),isNaN(a)&&(a=null),e.expires=a),a&&a<Date.now()&&(e=null)}return e},r.prototype._getAllCookies=function(e){var r=[],t=document.cookie,i=t.match(new RegExp(\"(?:^|; )\"+v.escapeRegExpString(e)+\"=([^;]*)\",\"g\"));if(i)for(var s=0;s<i.length;s++){var n=i[s],o=n.indexOf(\"=\");o>-1&&(n=n.substring(o+1),r.push(decodeURIComponent(n)))}return r},r.prototype._doPortalSignIn=function(e,r){if(navigator.cookieEnabled){var t=this._getEsriAuthCookie(),i=this._portalConfig,s=window.location.href,n=this.findServerInfo(e);if((r||this.useSignInPage)&&(i||this._isPortalDomain(s)||t)&&(n?n.hasPortal||n.owningSystemUrl&&this._isPortalDomain(n.owningSystemUrl):this._isPortalDomain(e))&&(this._isIdProvider(s,e)||i&&(this._hasSameServerInstance(this._getServerInstanceRoot(i.restBaseUrl),e)||this._isIdProvider(i.restBaseUrl,e))||_.hasSameOrigin(s,e,!0)))return!0}return!1},r.prototype._canUsePortalSignInWorkflow=function(e){return this._doPortalSignIn(e)&&(window===window.top||this._hasPortalSession())},r.prototype._checkProtocol=function(e,r,t,i){var s=!0,n=i?r.adminTokenServiceUrl:r.tokenServiceUrl;if(0===n.trim().toLowerCase().indexOf(\"https:\")&&0!==window.location.href.toLowerCase().indexOf(\"https:\")&&_.getProxyRule(n)&&!(s=!!this._protocolFunc&&!!this._protocolFunc({resourceUrl:e,serverInfo:r}))){t(new h(\"identity-manager:aborted\",\"Aborted the Sign-In process to avoid sending password over insecure connection.\"))}return s},r.prototype._enqueue=function(e,r,t,i,s,n){return i||(i=f.createResolver()),i.resUrl_=e,i.sinfo_=r,i.options_=t,i.admin_=s,i.refresh_=n,this._busy?this._hasSameServerInstance(this._getServerInstanceRoot(e),this._busy.resUrl_)?(this._oAuthDfd&&this._oAuthDfd.oAuthWin_&&this._oAuthDfd.oAuthWin_.focus(),this._soReqs.push(i)):this._xoReqs.push(i):this._doSignIn(i),i.promise},r.prototype._doSignIn=function(e){var r=this;this._busy=e,this._rejectOnPersistedPageShow=!1;var t=function(t){var i=e.options_&&e.options_.resource,s=e.resUrl_,n=e.refresh_,o=!1;-1===r.credentials.indexOf(t)&&(n&&-1!==r.credentials.indexOf(n)?(n.userId=t.userId,n.token=t.token,n.expires=t.expires,n.validity=t.validity,n.ssl=t.ssl,n.creationTime=t.creationTime,o=!0,t=n):r.credentials.push(t)),t.resources||(t.resources=[]),t.resources.push(i||s),t.scope=r._isServerRsrc(s)?\"server\":\"portal\",t.emitTokenChange();var a=r._soReqs,l={};r._soReqs=[],a.forEach(function(e){if(!r._isIdenticalService(s,e.resUrl_)){var i=r._getSuffix(e.resUrl_);l[i]||(l[i]=!0,t.resources.push(e.resUrl_))}}),e.resolve(t),a.forEach(function(e){r._hasSameServerInstance(r._getServerInstanceRoot(s),e.resUrl_)?e.resolve(t):r._soReqs.push(e)}),r._busy=e.resUrl_=e.sinfo_=e.refresh_=null,o||r.emit(\"credential-create\",{credential:t}),r._soReqs.length?r._doSignIn(r._soReqs.shift()):r._xoReqs.length&&r._doSignIn(r._xoReqs.shift())},i=function(t){e.reject(t),r._busy=e.resUrl_=e.sinfo_=e.refresh_=null,r._soReqs.length?r._doSignIn(r._soReqs.shift()):r._xoReqs.length&&r._doSignIn(r._xoReqs.shift())},s=function(s,n,o,a){var l,u,c=e.sinfo_,p=!e.options_||!1!==e.options_.prompt,d=c.hasPortal&&r._findOAuthInfo(e.resUrl_);if(r._canUsePortalSignInWorkflow(e.resUrl_)){var f=r._getEsriAuthCookie(),v=r._portalConfig;if(f){if(!c.webTierAuth){\"web\"===(f.auth_tier&&f.auth_tier.toLowerCase())&&(c.webTierAuth=!0)}return void t(new T({userId:f.email,server:c.server,token:c.webTierAuth?null:f.token,expires:f.expires}))}if(p){var _=\"\",g=window.location.href;return _=r.signInPage?r.signInPage:v?v.baseUrl+v.signin:r._isIdProvider(g,e.resUrl_)?r._getOrigin(g)+\"/home/signin.html\":c.tokenServiceUrl.replace(r._rePortalTokenSvc,\"\")+\"/home/signin.html\",_=_.replace(/http:/i,\"https:\"),v&&!1===v.useSSL&&(_=_.replace(/https:/i,\"http:\")),void(0===g.toLowerCase().replace(\"https\",\"http\").indexOf(_.toLowerCase().replace(\"https\",\"http\"))?(u=new h(\"identity-manager:unexpected-error\",\"Cannot redirect to Sign-In page from within Sign-In page. URL of the resource that triggered this workflow: \"+e.resUrl_),i(u)):(r._rejectOnPersistedPageShow=!0,r._redirectFunc?r._redirectFunc({signInPage:_,returnUrlParamName:\"returnUrl\",returnUrl:g,resourceUrl:e.resUrl_,serverInfo:c}):window.location.href=_+\"?returnUrl=\"+encodeURIComponent(g)))}u=new h(\"identity-manager:not-authenticated\",\"User is not signed in.\"),i(u)}else if(s)t(new T({userId:s,server:c.server,token:o,expires:null!=a?Number(a):null,ssl:!!n}));else if(d){var m=d._oAuthCred;if(!m){var y=new S(d,window.localStorage),w=new S(d,window.sessionStorage);y.isValid()&&w.isValid()?y.expires>w.expires?(m=y,w.destroy()):(m=w,y.destroy()):m=y.isValid()?y:w,d._oAuthCred=m}if(m.isValid())t(new T({userId:m.userId,server:c.server,token:m.token,expires:m.expires,ssl:m.ssl,_oAuthCred:m}));else if(r._oAuthHash&&r._oAuthHash.state.portalUrl===d.portalUrl){var I=r._oAuthHash;l=new T({userId:I.username,server:c.server,token:I.access_token,expires:Date.now()+1e3*Number(I.expires_in),ssl:\"true\"===I.ssl,oAuthState:I.state,_oAuthCred:m}),m.storage=I.persist?window.localStorage:window.sessionStorage,m.token=l.token,m.expires=l.expires,m.userId=l.userId,m.ssl=l.ssl,m.save(),r._oAuthHash=null,t(l)}else p?e._pendingDfd=r.oAuthSignIn(e.resUrl_,c,d,e.options_).then(t,i):(u=new h(\"identity-manager:not-authenticated\",\"User is not signed in.\"),i(u))}else if(p){if(r._checkProtocol(e.resUrl_,c,i,e.admin_)){var k=e.options_;e.admin_&&(k=k||{},k.isAdmin=!0),e._pendingDfd=r.signIn(e.resUrl_,c,k).then(t,i)}}else u=new h(\"identity-manager:not-authenticated\",\"User is not signed in.\"),i(u)},n=function(){var s,n,o,a,l=e.sinfo_,h=l.owningSystemUrl,u=e.options_;if(u&&(s=u.token,n=u.error,o=u.prompt),!(a=r._findCredential(h,{token:s,resource:e.resUrl_})))for(var c=0,p=r.credentials;c<p.length;c++){var d=p[c];if(r._isIdProvider(h,d.server)){a=d;break}}if(a){var f=r.findCredential(e.resUrl_,a.userId);if(f)t(f);else if(U(l,r._legacyFed)){var d=a.toJSON();d.server=l.server,d.resources=null,t(new T(d))}else{var v=e._pendingDfd=r.generateToken(r.findServerInfo(a.server),null,{serverUrl:e.resUrl_,token:a.token,signal:e.options_.signal,ssl:a.ssl});v.then(function(r){t(new T({userId:a.userId,server:l.server,token:r.token,expires:null!=r.expires?Number(r.expires):null,ssl:!!r.ssl,isAdmin:e.admin_,validity:r.validity}))},i)}}else{r._busy=null,s&&(e.options_.token=null);(e._pendingDfd=r.getCredential(h.replace(/\\/?$/,\"/sharing\"),{resource:e.resUrl_,owningTenant:l.owningTenant,signal:e.options_.signal,token:s,error:n,prompt:o})).then(function(){r._enqueue(e.resUrl_,e.sinfo_,e.options_,e,e.admin_)},function(e){i(e)})}};this._errbackFunc=i;var o=e.sinfo_.owningSystemUrl,a=this._isServerRsrc(e.resUrl_),l=e.sinfo_._restInfoPms;l?l.promise.then(function(t){var i=e.sinfo_;if(i._restInfoPms){i.adminTokenServiceUrl=i._restInfoPms.adminUrl,i._restInfoPms=null,i.tokenServiceUrl=d.getDeepValue(\"authInfo.tokenServicesUrl\",t)||d.getDeepValue(\"authInfo.tokenServiceUrl\",t)||d.getDeepValue(\"tokenServiceUrl\",t),i.shortLivedTokenValidity=d.getDeepValue(\"authInfo.shortLivedTokenValidity\",t),i.currentVersion=t.currentVersion,i.owningTenant=t.owningTenant;var o=i.owningSystemUrl=t.owningSystemUrl;o&&r._portals.push(o)}a&&i.owningSystemUrl?n():s()},function(){e.sinfo_._restInfoPms=null;var r=new h(\"identity-manager:server-identification-failed\",\"Unknown resource - could not find token service endpoint.\");i(r)}):a&&o?n():e.sinfo_._selfReq?e.sinfo_._selfReq.selfDfd.then(function(t){var i,s,n,o,a={};return t&&(i=t.user&&t.user.username,a.username=i,a.allSSL=t.allSSL,s=t.supportsOAuth,n=t.currentVersion,\"multitenant\"===t.portalMode&&(o=t.customBaseUrl)),e.sinfo_.webTierAuth=!!i,i&&r.normalizeWebTierAuth?r.generateToken(e.sinfo_,null,{ssl:a.allSSL}).catch(function(){return null}).then(function(e){return a.portalToken=e&&e.token,a.tokenExpiration=e&&e.expires,a}):!i&&s&&parseFloat(n)>=4.4&&!r._canUsePortalSignInWorkflow(e.resUrl_)?r._generateOAuthInfo({portalUrl:e.sinfo_.server,customBaseUrl:o,owningTenant:e.sinfo_._selfReq.owningTenant}).catch(function(){return null}).then(function(){return a}):a}).catch(function(){return null}).then(function(r){e.sinfo_._selfReq=null,r?s(r.username,r.allSSL,r.portalToken,r.tokenExpiration):s()}):s()},r.prototype._generateOAuthInfo=function(e){var r,t,i=this,s=e.portalUrl,n=e.customBaseUrl,o=e.owningTenant,l=!this.defaultOAuthInfo&&this._createDefaultOAuthInfo&&!this._hasTestedIfAppIsOnPortal;if(l){t=window.location.href;var h=t.indexOf(\"?\");h>-1&&(t=t.slice(0,h)),h=t.search(/\\/(apps|home)\\//),t=h>-1?t.slice(0,h):null}return l&&t?(this._hasTestedIfAppIsOnPortal=!0,r=a(t+\"/sharing/rest\",{query:{f:\"json\"},responseType:\"json\"}).then(function(){i.defaultOAuthInfo=new y({appId:\"arcgisonline\",popup:!0,popupCallbackUrl:t+\"/home/oauth-callback.html\"})})):r=f.resolve(),r.then(function(){if(i.defaultOAuthInfo)return s=s.replace(/^http:/i,\"https:\"),a(s+\"/sharing/rest/oauth2/validateRedirectUri\",{query:{accountId:o,client_id:i.defaultOAuthInfo.appId,redirect_uri:_.makeAbsolute(i.defaultOAuthInfo.popupCallbackUrl),f:\"json\"},responseType:\"json\"}).then(function(e){if(e.data.valid){var r=i.defaultOAuthInfo.clone();e.data.urlKey&&n?r.portalUrl=\"https://\"+e.data.urlKey+\".\"+n:r.portalUrl=s,i.oAuthInfos.push(r)}})})},r=s([m.subclass(\"esri.identity.IdentityManagerBase\")],r)}(m.declared(u));r.IdentityManagerBase=A;var T=function(e){function r(r){var t=e.call(this,r)||this;return t._oAuthCred=null,t.tokenRefreshBuffer=2,r&&r._oAuthCred&&(t._oAuthCred=r._oAuthCred),t}return i(r,e),r.prototype.initialize=function(){this.resources=this.resources||[],null==this.creationTime&&(this.creationTime=Date.now())},r.prototype.refreshToken=function(){var e,r,t=this,i=o.id.findServerInfo(this.server),s=i&&i.owningSystemUrl,n=!!s&&\"server\"===this.scope,a=n&&U(i,o.id._legacyFed),l=i.webTierAuth,h=l&&o.id.normalizeWebTierAuth,u=I[this.server],c=u&&u[this.userId],p=this.resources&&this.resources[0],d=n&&o.id.findServerInfo(s),f={username:this.userId,password:c};if((!l||h)&&(n&&!d&&o.id.serverInfos.some(function(e){return o.id._isIdProvider(s,e.server)&&(d=e),!!d}),e=d&&o.id.findCredential(d.server,this.userId),!n||e)){if(a)return void e.refreshToken();if(n)r={serverUrl:p,token:e&&e.token,ssl:e&&e.ssl};else if(h)f=null,r={ssl:this.ssl};else{if(!c){var v=void 0;return p&&(p=o.id._sanitizeUrl(p),this._enqueued=1,v=o.id._enqueue(p,i,null,null,this.isAdmin,this),v.then(function(){t._enqueued=0,t.refreshServerTokens()}).catch(function(){t._enqueued=0})),v}this.isAdmin&&(r={isAdmin:!0})}return o.id.generateToken(n?d:i,n?null:f,r).then(function(e){t.token=e.token,t.expires=null!=e.expires?Number(e.expires):null,t.creationTime=Date.now(),t.validity=e.validity,t.emitTokenChange(),t.refreshServerTokens()}).catch(function(){})}},r.prototype.refreshServerTokens=function(){var e=this;\"portal\"===this.scope&&o.id.credentials.forEach(function(r){var t=o.id.findServerInfo(r.server),i=t&&t.owningSystemUrl;r!==e&&r.userId===e.userId&&i&&\"server\"===r.scope&&(o.id._hasSameServerInstance(e.server,i)||o.id._isIdProvider(i,e.server))&&(U(t,o.id._legacyFed)?(r.token=e.token,r.expires=e.expires,r.creationTime=e.creationTime,r.validity=e.validity,r.emitTokenChange()):r.refreshToken())})},r.prototype.emitTokenChange=function(e){clearTimeout(this._refreshTimer);var r=this.server&&o.id.findServerInfo(this.server),t=r&&r.owningSystemUrl,i=t&&o.id.findServerInfo(t);!1===e||t&&\"portal\"!==this.scope&&(!i||!i.webTierAuth||o.id.normalizeWebTierAuth)||null==this.expires&&null==this.validity||this._startRefreshTimer(),this.emit(\"token-change\")},r.prototype.destroy=function(){this.userId=this.server=this.token=this.expires=this.validity=this.resources=this.creationTime=null,this._oAuthCred&&(this._oAuthCred.destroy(),this._oAuthCred=null);var e=o.id.credentials.indexOf(this);e>-1&&o.id.credentials.splice(e,1),this.emitTokenChange(),this.emit(\"destroy\")},r.prototype.toJSON=function(){var e=p.fixJson({userId:this.userId,server:this.server,token:this.token,expires:this.expires,validity:this.validity,ssl:this.ssl,isAdmin:this.isAdmin,creationTime:this.creationTime,scope:this.scope}),r=this.resources;return r&&r.length>0&&(e.resources=r.slice()),e},r.prototype._startRefreshTimer=function(){clearTimeout(this._refreshTimer);var e=6e4*this.tokenRefreshBuffer,r=this.validity?this.creationTime+6e4*this.validity:this.expires,t=r-Date.now();t<0&&(t=0),this._refreshTimer=setTimeout(this.refreshToken.bind(this),t>e?t-e:t)},s([m.property()],r.prototype,\"creationTime\",void 0),s([m.property()],r.prototype,\"expires\",void 0),s([m.property()],r.prototype,\"isAdmin\",void 0),s([m.property()],r.prototype,\"oAuthState\",void 0),s([m.property()],r.prototype,\"resources\",void 0),s([m.property()],r.prototype,\"scope\",void 0),s([m.property()],r.prototype,\"server\",void 0),s([m.property()],r.prototype,\"ssl\",void 0),s([m.property()],r.prototype,\"token\",void 0),s([m.property()],r.prototype,\"tokenRefreshBuffer\",void 0),s([m.property()],r.prototype,\"userId\",void 0),s([m.property()],r.prototype,\"validity\",void 0),r=s([m.subclass(\"esri.identity.Credential\")],r)}(m.declared(u.EventedAccessor));r.Credential=T});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"../core/declare\",\"dojo/dom-attr\",\"dojo/keys\",\"dijit/registry\",\"dijit/Dialog\",\"../kernel\",\"../core/lang\",\"../core/Error\",\"../core/domUtils\",\"../core/promiseUtils\",\"../intl/substitute\",\"./IdentityManagerBase\",\"dojo/i18n!./nls/identity\",\"dijit/form/Button\",\"dijit/form/Form\",\"dijit/form/ValidationTextBox\"],function(e,t,i,s,r,n,a,o,d,l,c,g,_){var u=c.substitute,m=g.IdentityManagerBase,b=g.Credential;return e([m],{declaredClass:\"esri.identity.IdentityManager\",constructor:function(e){a.mixin(this,e)},_dialogContent:\"<div data-dojo-type='dijit.form.Form' data-dojo-props='\\\"class\\\":\\\"esriIdForm\\\"'><div class='dijitDialogPaneContentArea'><div style='padding-bottom: 5px; word-wrap: break-word;'>{info}</div><div style='margin: 0px; padding: 0px; height: 10px;'></div><div class='esriErrorMsg' style='display: none; color: white; background-color: #D46464; text-align: center; padding-top: 3px; padding-bottom: 3px;'>{invalidUser}</div><div style='margin: 0px; padding: 0px; height: 10px;'></div><table style='width: 100%;'><tr><td>\"+'<label>{lblUser}<br/><input data-dojo-type=\\'dijit.form.ValidationTextBox\\' data-dojo-props=\\'type:\"text\", \"class\":\"esriIdUser\", required:true, trim:true, style:\"width: 100%;\", autocapitalize:\"none\", autocorrect:\"off\", spellcheck:false\\' /></label></td></tr><tr><td><label>{lblPwd}<br/><input data-dojo-type=\\'dijit.form.ValidationTextBox\\' data-dojo-props=\\'type:\"password\", \"class\":\"esriIdPwd\", required:true, style:\"width: 100%;\"\\' /></label></td></tr></table></div><div class=\\'dijitDialogPaneActionBar\\'><button data-dojo-type=\\'dijit.form.Button\\' data-dojo-props=\\'type:\"button\", \"class\":\"esriIdSubmit\"\\'>{lblOk}</button><button data-dojo-type=\\'dijit.form.Button\\' data-dojo-props=\\'type:\"button\", \"class\":\"esriIdCancel\"\\'>{lblCancel}</button></div></div>',signIn:function(e,i,s){this._nls||(this._nls=_),this._loginDialog||(this._loginDialog=this.dialog=this._createLoginDialog(),this.emit(\"dialog-create\"));var r=this._loginDialog,n=s&&s.error,a=s&&s.token,c=l.createResolver();if(s&&s.signal&&l.onAbort(s.signal,function(){r.onCancel()}),r.open){var g=new o(\"identity-manager:busy\",\"BUSY\");return c.reject(g),c.promise}return d.hide(r.errMsg_),n&&n.details&&403==n.details.httpStatus&&a&&(t.set(r.errMsg_,\"innerHTML\",this._nls.forbidden),d.show(r.errMsg_)),r.dfd_=c,r.serverInfo_=i,r.resUrl_=e,r.admin_=s&&s.isAdmin,r.signal_=s&&s.signal,t.set(r.resLink_,{title:e,innerHTML:\"(\"+(this.getResourceName(e)||this._nls.lblItem)+\")\"}),t.set(r.serverLink_,{title:i.server,innerHTML:(-1!==i.server.toLowerCase().indexOf(\"arcgis.com\")?\"ArcGIS Online\":i.server)+\" \"}),r.txtPwd_.set(\"value\",\"\"),r.show(),c.promise},_createLoginDialog:function(){var e=this._nls,a=u(this._dialogContent,e);a=u(a,{resource:\"<span class='resLink' style='word-wrap: break-word;'></span>\",server:\"<span class='serverLink' style='word-wrap: break-word;'></span>\"});var l=new r({title:e.title,content:a,class:\" esri-widget esriSignInDialog esriIdentityDialog\",style:\"width: 18em;\",esriIdMgr_:this,onShow:function(){this.domNode.classList.add(\"esriIdentityDialog--visible\")},onHide:function(){this.domNode.classList.remove(\"esriIdentityDialog--visible\")},keypressed_:function(e){e.charOrCode===i.ENTER&&this.execute_()},execute_:function(){var i=this.txtUser_.get(\"value\"),s=this.txtPwd_.get(\"value\"),a=this.dfd_,o=this;if(this.form_.validate()&&i&&s){this.btnSubmit_.set(\"label\",e.lblSigning);var l=n.id.findCredential(o.resUrl_,i),c=function(t){o.btnSubmit_.set(\"label\",e.lblOk),o.btnSubmit_.set(\"disabled\",!1),d.hide(o.errMsg_),o.hide(),r._DialogLevelManager.hide(o);var s=o.serverInfo_;o.dfd_=o.serverInfo_=o.generateDfd_=o.resUrl_=o.signal_=null;var n,c,g,_=l;t&&(n=t.token,c=null!=t.expires?Number(t.expires):null,g=!!t.ssl,_?(_.userId=i,_.token=n,_.expires=c,_.validity=t.validity,_.ssl=g,_.creationTime=Date.now()):_=new b({userId:i,server:s.server,token:n,expires:c,ssl:g,isAdmin:o.admin_,validity:t.validity})),a.resolve(_)};if(l&&!l._enqueued)return void c();o.btnSubmit_.set(\"disabled\",!0),o.generateDfd_=n.id.generateToken(this.serverInfo_,{username:i,password:s},{isAdmin:this.admin_,signal:this.signal_}).then(c,function(i){o.btnSubmit_.set(\"disabled\",!1),o.generateDfd_=null,o.btnSubmit_.set(\"label\",e.lblOk),t.set(o.errMsg_,\"innerHTML\",i&&i.details&&i.details.httpStatus?e.invalidUser:e.noAuthService),d.show(o.errMsg_)})}},cancel_:function(){var e=l.dfd_,t=l.resUrl_,i=l.serverInfo_;l.btnSubmit_.set(\"disabled\",!1),l.dfd_=l.serverInfo_=l.generateDfd_=l.resUrl_=l.signal_=null,d.hide(l.errMsg_),r._DialogLevelManager.hide(l),l.esriIdMgr_.emit(\"dialog-cancel\",{resourceUrl:t,serverInfo:i});var s=new o(\"identity-manager:user-aborted\",\"ABORTED\");e.reject(s)}}),c=l.domNode;return l.form_=s.byNode(c.getElementsByClassName(\"esriIdForm\")[0]),l.txtUser_=s.byNode(c.getElementsByClassName(\"esriIdUser\")[0]),l.txtPwd_=s.byNode(c.getElementsByClassName(\"esriIdPwd\")[0]),l.btnSubmit_=s.byNode(c.getElementsByClassName(\"esriIdSubmit\")[0]),l.btnCancel_=s.byNode(c.getElementsByClassName(\"esriIdCancel\")[0]),l.resLink_=c.getElementsByClassName(\"resLink\")[0],l.serverLink_=c.getElementsByClassName(\"serverLink\")[0],l.errMsg_=c.getElementsByClassName(\"esriErrorMsg\")[0],l.connect(l.txtUser_,\"onKeyPress\",l.keypressed_),l.connect(l.txtPwd_,\"onKeyPress\",l.keypressed_),l.connect(l.btnSubmit_,\"onClick\",l.execute_),l.connect(l.btnCancel_,\"onClick\",l.onCancel),l.connect(l,\"onCancel\",l.cancel_),l}})});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\"],function(t,e){var s=function(){function t(t,e){this.oAuthInfo=null,this.storage=null,this.expires=null,this.ssl=null,this.token=null,this.userId=null,this.oAuthInfo=t,this.storage=e,this._init()}return t.prototype.isValid=function(){var t=!1;if(this.oAuthInfo&&this.token&&this.userId){var e=Date.now();if(this.expires>e){(this.expires-e)/1e3>60*this.oAuthInfo.minTimeUntilExpiration&&(t=!0)}}return t},t.prototype.save=function(){if(this.storage){var t=this._load(),e=this.oAuthInfo;if(e&&e.authNamespace&&e.portalUrl){var s=t[e.authNamespace];s||(s=t[e.authNamespace]={}),s[e.portalUrl]={expires:this.expires,ssl:this.ssl,token:this.token,userId:this.userId};try{this.storage.setItem(\"esriJSAPIOAuth\",JSON.stringify(t))}catch(t){console.log(t)}}}},t.prototype.destroy=function(){var t=this._load(),e=this.oAuthInfo;if(e&&e.appId&&e.portalUrl&&this.token&&this.expires>Date.now()){var s=e.portalUrl.replace(/^http:/i,\"https:\")+\"/sharing/rest/oauth2/revokeToken\",i=new FormData;if(i.append(\"f\",\"json\"),i.append(\"auth_token\",this.token),i.append(\"client_id\",e.appId),i.append(\"token_type_hint\",\"access_token\"),\"function\"==typeof navigator.sendBeacon)navigator.sendBeacon(s,i);else{var o=new XMLHttpRequest;o.open(\"POST\",s),o.send(i)}}if(e&&e.authNamespace&&e.portalUrl&&this.storage){var r=t[e.authNamespace];if(r){delete r[e.portalUrl];try{this.storage.setItem(\"esriJSAPIOAuth\",JSON.stringify(t))}catch(t){console.log(t)}}}e&&(e._oAuthCred=null,this.oAuthInfo=null)},t.prototype._init=function(){var t=this._load(),e=this.oAuthInfo;if(e&&e.authNamespace&&e.portalUrl){var s=t[e.authNamespace];s&&(s=s[e.portalUrl])&&(this.expires=s.expires,this.ssl=s.ssl,this.token=s.token,this.userId=s.userId)}},t.prototype._load=function(){var t={};if(this.storage){var e=this.storage.getItem(\"esriJSAPIOAuth\");if(e)try{t=JSON.parse(e)}catch(t){console.log(t)}}return t},t}();return s.prototype.declaredClass=\"esri.identity.OAuthCredential\",s});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\",\"../core/tsSupport/declareExtendsHelper\",\"../core/tsSupport/decorateHelper\",\"../core/JSONSupport\",\"../core/accessorSupport/decorators\"],function(o,r,t,p,e,i){return function(o){function r(r){var t=o.call(this,r)||this;return t._oAuthCred=null,t.appId=null,t.authNamespace=\"/\",t.expiration=20160,t.forceLogin=!1,t.locale=null,t.minTimeUntilExpiration=30,t.popup=!1,t.popupCallbackUrl=\"oauth-callback.html\",t.popupWindowFeatures=\"height=490,width=800,resizable,scrollbars,status\",t.portalUrl=\"https://www.arcgis.com\",t.preserveUrlHash=!1,t}t(r,o),e=r,r.prototype.clone=function(){return e.fromJSON(this.toJSON())};var e;return p([i.property({json:{write:!0}})],r.prototype,\"appId\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"authNamespace\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"expiration\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"forceLogin\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"locale\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"minTimeUntilExpiration\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"popup\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"popupCallbackUrl\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"popupWindowFeatures\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"portalUrl\",void 0),p([i.property({json:{write:!0}})],r.prototype,\"preserveUrlHash\",void 0),r=e=p([i.subclass(\"esri.identity.OAuthInfo\")],r)}(i.declared(e.JSONSupport))});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"./Credential\",\"../core/domUtils\",\"../core/has\",\"../core/Error\",\"../core/promiseUtils\",\"../core/urlUtils\",\"../intl/substitute\",\"dijit/Dialog\",\"dijit/registry\",\"dojo/dom-attr\",\"dojo/i18n!./nls/identity\",\"dijit/form/Button\"],function(e,t,i,r,o,n,s,a,l,d,u){var h=s.substitute;return{_oAuthIntervalId:0,_oAuthDialogContent:\"<div class='dijitDialogPaneContentArea'><div style='padding-bottom: 5px; word-wrap: break-word;'>{oAuthInfo}</div><div style='margin: 0px; padding: 0px; height: 10px;'></div><div class='esriErrorMsg' style='display: none; color: white; background-color: #D46464; text-align: center; padding-top: 3px; padding-bottom: 3px;'>{invalidUser}</div><div style='margin: 0px; padding: 0px; height: 10px;'></div><div class='dijitDialogPaneActionBar'><button data-dojo-type='dijit.form.Button' data-dojo-props='type:\\\"button\\\", \\\"class\\\":\\\"esriIdSubmit\\\"'>{lblOk}</button><button data-dojo-type='dijit.form.Button' data-dojo-props='type:\\\"button\\\", \\\"class\\\":\\\"esriIdCancel\\\"'>{lblCancel}</button></div>\",setOAuthRedirectionHandler:function(e){this._oAuthRedirectFunc=e},oAuthSignIn:function(e,i,r,n){var s=this._oAuthDfd=o.createResolver();n&&n.signal&&o.onAbort(n.signal,function(){var e=this._oAuthDfd&&this._oAuthDfd.oAuthWin_;e&&!e.closed?e.close():this.oAuthDialog&&this.oAuthDialog.onCancel()}.bind(this)),s.resUrl_=e,s.sinfo_=i,s.oinfo_=r;var a=!n||!1!==n.oAuthPopupConfirmation;if(!r.popup||!a)return this._doOAuthSignIn(e,i,r),s.promise;this._nls||(this._nls=u),this.oAuthDialog||(this.oAuthDialog=this._createOAuthDialog());var l=this.oAuthDialog,h=n&&n.error,c=n&&n.token;return t.hide(l.errMsg_),h&&h.details&&403==h.details.httpStatus&&c&&(d.set(l.errMsg_,\"innerHTML\",this._nls.forbidden),t.show(l.errMsg_)),d.set(l.serverLink_,{title:i.server,innerHTML:-1!==i.server.toLowerCase().indexOf(\"arcgis.com\")?\"ArcGIS Online\":i.server}),l.show(),s.promise},setOAuthResponseHash:function(t){var i=this._oAuthDfd;if(this._oAuthDfd=null,i&&t){clearInterval(this._oAuthIntervalId),\"#\"===t.charAt(0)&&(t=t.substring(1));var o=n.queryToObject(t);if(o.error){var s=\"access_denied\"===o.error,a=new r(s?\"identity-manager:user-aborted\":\"identity-manager:authentication-failed\",s?\"ABORTED\":\"OAuth: \"+o.error+\" - \"+o.error_description);i.reject(a)}else{var l=i.sinfo_,d=i.oinfo_,u=d._oAuthCred,h=new e({userId:o.username,server:l.server,token:o.access_token,expires:Date.now()+1e3*Number(o.expires_in),ssl:\"true\"===o.ssl,_oAuthCred:u});u.storage=o.persist?window.localStorage:window.sessionStorage,u.token=h.token,u.expires=h.expires,u.userId=h.userId,u.ssl=h.ssl,u.save(),i.resolve(h)}}},_createOAuthDialog:function(){var e=this._nls,i=h(this._oAuthDialogContent,e);i=h(i,{server:\"<span class='serverLink' style='word-wrap: break-word;'></span>\"});var o=new a({title:e.title,content:i,class:\"esri-widget esriOAuthSignInDialog esriIdentityDialog\",style:\"min-width: 18em;\",esriIdMgr_:this,execute_:function(){var e=o.esriIdMgr_._oAuthDfd;o.hide_(),o.esriIdMgr_._doOAuthSignIn(e.resUrl_,e.sinfo_,e.oinfo_)},cancel_:function(){var e=o.esriIdMgr_._oAuthDfd;o.esriIdMgr_._oAuthDfd=null,o.hide_();var t=new r(\"identity-manager:user-aborted\",\"ABORTED\");e.reject(t)},hide_:function(){t.hide(o.errMsg_),o.hide(),a._DialogLevelManager.hide(o)}}),n=o.domNode;return o.btnSubmit_=l.byNode(n.getElementsByClassName(\"esriIdSubmit\")[0]),o.btnCancel_=l.byNode(n.getElementsByClassName(\"esriIdCancel\")[0]),o.serverLink_=n.getElementsByClassName(\"serverLink\")[0],o.errMsg_=n.getElementsByClassName(\"esriErrorMsg\")[0],o.connect(o.btnSubmit_,\"onClick\",o.execute_),o.connect(o.btnCancel_,\"onClick\",o.onCancel),o.connect(o,\"onCancel\",o.cancel_),o},_doOAuthSignIn:function(e,t,o){var s=this,a={portalUrl:o.portalUrl};!o.popup&&o.preserveUrlHash&&window.location.hash&&(a.hash=window.location.hash);var l={client_id:o.appId,response_type:\"token\",state:JSON.stringify(a),expiration:o.expiration,locale:o.locale,redirect_uri:o.popup?n.makeAbsolute(o.popupCallbackUrl):window.location.href.replace(/#.*$/,\"\")};o.forceLogin&&(l.force_login=!0);var d=o.portalUrl.replace(/^http:/i,\"https:\")+\"/sharing/oauth2/authorize\",u=d+\"?\"+n.objectToQuery(l);if(o.popup){var h;if(7===i(\"ie\")?(h=window.open(o.popupCallbackUrl,\"esriJSAPIOAuth\",o.popupWindowFeatures),h.location=u):h=window.open(u,\"esriJSAPIOAuth\",o.popupWindowFeatures),h)h.focus(),this._oAuthDfd.oAuthWin_=h,this._oAuthIntervalId=setInterval(function(){if(h.closed){clearInterval(s._oAuthIntervalId);var e=s._oAuthDfd;if(e){var t=new r(\"identity-manager:user-aborted\",\"ABORTED\");e.reject(t)}}},500);else{var c=new r(\"identity-manager:popup-blocked\",\"ABORTED\");this._oAuthDfd.reject(c)}}else this._rejectOnPersistedPageShow=!0,this._oAuthRedirectFunc?this._oAuthRedirectFunc({authorizeParams:l,authorizeUrl:d,resourceUrl:e,serverInfo:t,oAuthInfo:o}):window.location=u}}});","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine([\"require\",\"exports\",\"../core/tsSupport/declareExtendsHelper\",\"../core/tsSupport/decorateHelper\",\"../core/JSONSupport\",\"../core/accessorSupport/decorators\"],function(r,e,o,t,n,p){return function(r){function e(e){var o=r.call(this,e)||this;return o.adminTokenServiceUrl=null,o.currentVersion=null,o.hasPortal=null,o.hasServer=null,o.owningSystemUrl=null,o.owningTenant=null,o.server=null,o.shortLivedTokenValidity=null,o.tokenServiceUrl=null,o.webTierAuth=null,o}return o(e,r),t([p.property({json:{write:!0}})],e.prototype,\"adminTokenServiceUrl\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"currentVersion\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"hasPortal\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"hasServer\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"owningSystemUrl\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"owningTenant\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"server\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"shortLivedTokenValidity\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"tokenServiceUrl\",void 0),t([p.property({json:{write:!0}})],e.prototype,\"webTierAuth\",void 0),e=t([p.subclass(\"esri.identity.ServerInfo\")],e)}(p.declared(n.JSONSupport))});","/*\n * This module was modified by dojo-webpack-plugin to disable some locales\n * that were excluded by the plugin's 'locales' option\n */\ndefine(({'root':({'lblItem':'item','title':'Sign in','info':'Please sign in to access the item on {server} {resource}','oAuthInfo':'Please sign in to {server}.','lblUser':'Username:','lblPwd':'Password:','lblOk':'OK','lblSigning':'Signing in...','lblCancel':'Cancel','errorMsg':'Invalid username/password. Please try again.','invalidUser':'The username or password you entered is incorrect.','forbidden':'The username and password are valid, but you don\\'t have access to this resource.','noAuthService':'Unable to access the authentication service.'}),'ar':false,'bs':false,'ca':false,'cs':false,'da':false,'de':false,'el':false,'es':false,'et':false,'fi':false,'fr':false,'he':false,'hr':false,'hu':false,'id':false,'it':false,'ja':false,'ko':false,'lv':false,'lt':false,'nl':false,'nb':false,'pl':false,'pt-br':false,'pt-pt':false,'ro':false,'ru':false,'sl':false,'sr':false,'sv':false,'th':false,'tr':false,'uk':false,'vi':1,'zh-cn':false,'zh-hk':false,'zh-tw':false}))","// COPYRIGHT © 2019 Esri\n//\n// All rights reserved under the copyright laws of the United States\n// and applicable international laws, treaties, and conventions.\n//\n// This material is licensed for use under the Esri Master License\n// Agreement (MLA), and is bound by the terms of that agreement.\n// You may redistribute and use this code without modification,\n// provided you adhere to the terms of the MLA and include this\n// copyright notice.\n//\n// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english\n//\n// For additional information, contact:\n// Environmental Systems Research Institute, Inc.\n// Attn: Contracts and Legal Services Department\n// 380 New York Street\n// Redlands, California, USA 92373\n// USA\n//\n// email: contracts@esri.com\n//\n// See http://js.arcgis.com/4.14/esri/copyright.txt for details.\n\ndefine({lblItem:\"mục\",title:\"Đăng nhập\",info:\"Vui lòng đăng nhập để truy cập mục trên {server} {resource}\",oAuthInfo:\"Vui lòng đăng nhập vào {server}.\",lblUser:\"Tên đăng nhập:\",lblPwd:\"Mật khẩu:\",lblOk:\"OK\",lblSigning:\"Đang đăng nhập...\",lblCancel:\"Hủy\",errorMsg:\"Tên người dùng/mật khẩu không hợp lệ. Vui lòng thử lại.\",invalidUser:\"Tên người dùng hoặc mật khẩu bạn nhập không đúng.\",forbidden:\"Tên người dùng và mật khẩu hợp lệ, nhưng bạn không có quyền truy cập vào tài nguyên này.\",noAuthService:\"Không thể truy cập dịch vụ xác thực.\"});","define([\n\t\"require\",\t\t\t// require.toUrl\n\t\"./main\",\t// to export dijit.BackgroundIframe\n\t\"dojo/_base/config\",\n\t\"dojo/dom-construct\", // domConstruct.create\n\t\"dojo/dom-style\", // domStyle.set\n\t\"dojo/_base/lang\", // lang.extend lang.hitch\n\t\"dojo/on\",\n\t\"dojo/sniff\" // has(\"ie\"), has(\"trident\"), has(\"quirks\")\n], function(require, dijit, config, domConstruct, domStyle, lang, on, has){\n\n\t// module:\n\t//\t\tdijit/BackgroundIFrame\n\n\t// Flag for whether to create background iframe behind popups like Menus and Dialog.\n\t// A background iframe is useful to prevent problems with popups appearing behind applets/pdf files,\n\t// and is also useful on older versions of IE (IE6 and IE7) to prevent the \"bleed through select\" problem.\n\t// By default, it's enabled for IE6-11, excluding Windows Phone 8.\n\t// TODO: For 2.0, make this false by default.  Also, possibly move definition to has.js so that this module can be\n\t// conditionally required via  dojo/has!bgIfame?dijit/BackgroundIframe\n\thas.add(\"config-bgIframe\",\n    \t(has(\"ie\") || has(\"trident\")) && !/IEMobile\\/10\\.0/.test(navigator.userAgent)); // No iframe on WP8, to match 1.9 behavior\n\n\tvar _frames = new function(){\n\t\t// summary:\n\t\t//\t\tcache of iframes\n\n\t\tvar queue = [];\n\n\t\tthis.pop = function(){\n\t\t\tvar iframe;\n\t\t\tif(queue.length){\n\t\t\t\tiframe = queue.pop();\n\t\t\t\tiframe.style.display=\"\";\n\t\t\t}else{\n\t\t\t\t// transparency needed for DialogUnderlay and for tooltips on IE (to see screen near connector)\n\t\t\t\tif(has(\"ie\") < 9){\n\t\t\t\t\tvar burl = config[\"dojoBlankHtmlUrl\"] || require.toUrl(\"dojo/resources/blank.html\") || \"javascript:\\\"\\\"\";\n\t\t\t\t\tvar html=\"<iframe src='\" + burl + \"' role='presentation'\"\n\t\t\t\t\t\t+ \" style='position: absolute; left: 0px; top: 0px;\"\n\t\t\t\t\t\t+ \"z-index: -1; filter:Alpha(Opacity=\\\"0\\\");'>\";\n\t\t\t\t\tiframe = document.createElement(html);\n\t\t\t\t}else{\n\t\t\t\t\tiframe = domConstruct.create(\"iframe\");\n\t\t\t\t\tiframe.src = 'javascript:\"\"';\n\t\t\t\t\tiframe.className = \"dijitBackgroundIframe\";\n\t\t\t\t\tiframe.setAttribute(\"role\", \"presentation\");\n\t\t\t\t\tdomStyle.set(iframe, \"opacity\", 0.1);\n\t\t\t\t}\n\t\t\t\tiframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.\n\t\t\t}\n\t\t\treturn iframe;\n\t\t};\n\n\t\tthis.push = function(iframe){\n\t\t\tiframe.style.display=\"none\";\n\t\t\tqueue.push(iframe);\n\t\t}\n\t}();\n\n\n\tdijit.BackgroundIframe = function(/*DomNode*/ node){\n\t\t// summary:\n\t\t//\t\tFor IE/FF z-index shenanigans. id attribute is required.\n\t\t//\n\t\t// description:\n\t\t//\t\tnew dijit.BackgroundIframe(node).\n\t\t//\n\t\t//\t\tMakes a background iframe as a child of node, that fills\n\t\t//\t\tarea (and position) of node\n\n\t\tif(!node.id){ throw new Error(\"no id\"); }\n\t\tif(has(\"config-bgIframe\")){\n\t\t\tvar iframe = (this.iframe = _frames.pop());\n\t\t\tnode.appendChild(iframe);\n\t\t\tif(has(\"ie\")<7 || has(\"quirks\")){\n\t\t\t\tthis.resize(node);\n\t\t\t\tthis._conn = on(node, 'resize', lang.hitch(this, \"resize\", node));\n\t\t\t}else{\n\t\t\t\tdomStyle.set(iframe, {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tlang.extend(dijit.BackgroundIframe, {\n\t\tresize: function(node){\n\t\t\t// summary:\n\t\t\t//\t\tResize the iframe so it's the same size as node.\n\t\t\t//\t\tNeeded on IE6 and IE/quirks because height:100% doesn't work right.\n\t\t\tif(this.iframe){\n\t\t\t\tdomStyle.set(this.iframe, {\n\t\t\t\t\twidth: node.offsetWidth + 'px',\n\t\t\t\t\theight: node.offsetHeight + 'px'\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdestroy: function(){\n\t\t\t// summary:\n\t\t\t//\t\tdestroy the iframe\n\t\t\tif(this._conn){\n\t\t\t\tthis._conn.remove();\n\t\t\t\tthis._conn = null;\n\t\t\t}\n\t\t\tif(this.iframe){\n\t\t\t\tthis.iframe.parentNode.removeChild(this.iframe);\n\t\t\t\t_frames.push(this.iframe);\n\t\t\t\tdelete this.iframe;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn dijit.BackgroundIframe;\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/aspect\",\n\t\"dojo/_base/declare\"\n], function(array, aspect, declare){\n\n\t// module:\n\t//\t\tdijit/Destroyable\n\n\treturn declare(\"dijit.Destroyable\", null, {\n\t\t// summary:\n\t\t//\t\tMixin to track handles and release them when instance is destroyed.\n\t\t// description:\n\t\t//\t\tCall this.own(...) on list of handles (returned from dojo/aspect, dojo/on,\n\t\t//\t\tdojo/Stateful::watch, or any class (including widgets) with a destroyRecursive() or destroy() method.\n\t\t//\t\tThen call destroy() later to destroy this instance and release the resources.\n\n\t\tdestroy: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this class, releasing any resources registered via own().\n\t\t\tthis._destroyed = true;\n\t\t},\n\n\t\town: function(){\n\t\t\t// summary:\n\t\t\t//\t\tTrack specified handles and remove/destroy them when this instance is destroyed, unless they were\n\t\t\t//\t\talready removed/destroyed manually.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\t// returns:\n\t\t\t//\t\tThe array of specified handles, so you can do for example:\n\t\t\t//\t|\t\tvar handle = this.own(on(...))[0];\n\n\t\t\tvar cleanupMethods = [\n\t\t\t\t\"destroyRecursive\",\n\t\t\t\t\"destroy\",\n\t\t\t\t\"remove\"\n\t\t\t];\n\n\t\t\tarray.forEach(arguments, function(handle){\n\t\t\t\t// When this.destroy() is called, destroy handle.  Since I'm using aspect.before(),\n\t\t\t\t// the handle will be destroyed before a subclass's destroy() method starts running, before it calls\n\t\t\t\t// this.inherited() or even if it doesn't call this.inherited() at all.  If that's an issue, make an\n\t\t\t\t// onDestroy() method and connect to that instead.\n\t\t\t\tvar destroyMethodName;\n\t\t\t\tvar odh = aspect.before(this, \"destroy\", function (preserveDom){\n\t\t\t\t\thandle[destroyMethodName](preserveDom);\n\t\t\t\t});\n\n\t\t\t\t// Callback for when handle is manually destroyed.\n\t\t\t\tvar hdhs = [];\n\t\t\t\tfunction onManualDestroy(){\n\t\t\t\t\todh.remove();\n\t\t\t\t\tarray.forEach(hdhs, function(hdh){\n\t\t\t\t\t\thdh.remove();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Setup listeners for manual destroy of handle.\n\t\t\t\t// Also computes destroyMethodName, used in listener above.\n\t\t\t\tif(handle.then){\n\t\t\t\t\t// Special path for Promises.  Detect when Promise is resolved, rejected, or\n\t\t\t\t\t// canceled (nb: cancelling a Promise causes it to be rejected).\n\t\t\t\t\tdestroyMethodName = \"cancel\";\n\t\t\t\t\thandle.then(onManualDestroy, onManualDestroy);\n\t\t\t\t}else{\n\t\t\t\t\t// Path for other handles.  Just use AOP to detect when handle is manually destroyed.\n\t\t\t\t\tarray.forEach(cleanupMethods, function(cleanupMethod){\n\t\t\t\t\t\tif(typeof handle[cleanupMethod] === \"function\"){\n\t\t\t\t\t\t\tif(!destroyMethodName){\n\t\t\t\t\t\t\t\t// Use first matching method name in above listener (prefer destroyRecursive() to destroy())\n\t\t\t\t\t\t\t\tdestroyMethodName = cleanupMethod;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thdhs.push(aspect.after(handle, cleanupMethod, onManualDestroy, true));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, this);\n\n\t\t\treturn arguments;\t\t// handle\n\t\t}\n\t});\n});\n","define([\n\t\"require\",\n\t\"dojo/_base/array\", // array.forEach array.indexOf array.map\n\t\"dojo/aspect\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/Deferred\", // Deferred\n\t\"dojo/dom\", // dom.isDescendant\n\t\"dojo/dom-class\", // domClass.add domClass.contains\n\t\"dojo/dom-geometry\", // domGeometry.position\n\t\"dojo/dom-style\", // domStyle.set\n\t\"dojo/_base/fx\", // fx.fadeIn fx.fadeOut\n\t\"dojo/i18n\", // i18n.getLocalization\n\t\"dojo/keys\",\n\t\"dojo/_base/lang\", // lang.mixin lang.hitch\n\t\"dojo/on\",\n\t\"dojo/ready\",\n\t\"dojo/sniff\", // has(\"ie\") has(\"opera\") has(\"dijit-legacy-requires\")\n\t\"dojo/touch\",\n\t\"dojo/window\", // winUtils.getBox, winUtils.get\n\t\"dojo/dnd/Moveable\", // Moveable\n\t\"dojo/dnd/TimedMoveable\", // TimedMoveable\n\t\"./focus\",\n\t\"./_base/manager\", // manager.defaultDuration\n\t\"./_Widget\",\n\t\"./_TemplatedMixin\",\n\t\"./_CssStateMixin\",\n\t\"./form/_FormMixin\",\n\t\"./_DialogMixin\",\n\t\"./DialogUnderlay\",\n\t\"./layout/ContentPane\",\n\t\"./layout/utils\",\n\t\"dojo/text!./templates/Dialog.html\",\n\t\"./a11yclick\",\t// template uses ondijitclick\n\t\"dojo/i18n!./nls/common\"\n], function(require, array, aspect, declare, Deferred,\n\t\t\tdom, domClass, domGeometry, domStyle, fx, i18n, keys, lang, on, ready, has, touch, winUtils,\n\t\t\tMoveable, TimedMoveable, focus, manager, _Widget, _TemplatedMixin, _CssStateMixin, _FormMixin, _DialogMixin,\n\t\t\tDialogUnderlay, ContentPane, utils, template){\n\n\t// module:\n\t//\t\tdijit/Dialog\n\n\tvar resolvedDeferred = new Deferred();\n\tresolvedDeferred.resolve(true);\n\n\tfunction nop(){}\n\n\tvar _DialogBase = declare(\"dijit._DialogBase\" + (has(\"dojo-bidi\") ? \"_NoBidi\" : \"\"), [_TemplatedMixin, _FormMixin, _DialogMixin, _CssStateMixin], {\n\t\ttemplateString: template,\n\n\t\tbaseClass: \"dijitDialog\",\n\n\t\tcssStateNodes: {\n\t\t\tcloseButtonNode: \"dijitDialogCloseIcon\"\n\t\t},\n\n\t\t// Map widget attributes to DOMNode attributes.\n\t\t_setTitleAttr: { node: \"titleNode\", type: \"innerHTML\" },\n\n\t\t// open: [readonly] Boolean\n\t\t//\t\tTrue if Dialog is currently displayed on screen.\n\t\topen: false,\n\n\t\t// duration: Integer\n\t\t//\t\tThe time in milliseconds it takes the dialog to fade in and out\n\t\tduration: manager.defaultDuration,\n\n\t\t// refocus: Boolean\n\t\t//\t\tA Toggle to modify the default focus behavior of a Dialog, which\n\t\t//\t\tis to re-focus the element which had focus before being opened.\n\t\t//\t\tFalse will disable refocusing. Default: true\n\t\trefocus: true,\n\n\t\t// autofocus: Boolean\n\t\t//\t\tA Toggle to modify the default focus behavior of a Dialog, which\n\t\t//\t\tis to focus on the first dialog element after opening the dialog.\n\t\t//\t\tFalse will disable autofocusing. Default: true\n\t\tautofocus: true,\n\n\t\t// _firstFocusItem: [private readonly] DomNode\n\t\t//\t\tThe pointer to the first focusable node in the dialog.\n\t\t//\t\tSet by `dijit/_DialogMixin._getFocusItems()`.\n\t\t_firstFocusItem: null,\n\n\t\t// _lastFocusItem: [private readonly] DomNode\n\t\t//\t\tThe pointer to which node has focus prior to our dialog.\n\t\t//\t\tSet by `dijit/_DialogMixin._getFocusItems()`.\n\t\t_lastFocusItem: null,\n\n\t\t// draggable: Boolean\n\t\t//\t\tToggles the movable aspect of the Dialog. If true, Dialog\n\t\t//\t\tcan be dragged by it's title. If false it will remain centered\n\t\t//\t\tin the viewport.\n\t\tdraggable: true,\n\t\t_setDraggableAttr: function(/*Boolean*/ val){\n\t\t\t// Avoid _WidgetBase behavior of copying draggable attribute to this.domNode,\n\t\t\t// as that prevents text select on modern browsers (#14452)\n\t\t\tthis._set(\"draggable\", val);\n\t\t},\n\n\t\t// maxRatio: Number\n\t\t//\t\tMaximum size to allow the dialog to expand to, relative to viewport size\n\t\tmaxRatio: 0.9,\n\n\t\t// closable: Boolean\n\t\t//\t\tDialog show [x] icon to close itself, and ESC key will close the dialog.\n\t\tclosable: true,\n\t\t_setClosableAttr: function(val){\n\t\t\tthis.closeButtonNode.style.display = val ? \"\" : \"none\";\n\t\t\tthis._set(\"closable\", val);\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\tvar _nlsResources = i18n.getLocalization(\"dijit\", \"common\");\n\t\t\tlang.mixin(this, _nlsResources);\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\tdomStyle.set(this.domNode, {\n\t\t\t\tdisplay: \"none\",\n\t\t\t\tposition: \"absolute\"\n\t\t\t});\n\t\t\tthis.ownerDocumentBody.appendChild(this.domNode);\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\taspect.after(this, \"onExecute\", lang.hitch(this, \"hide\"), true);\n\t\t\taspect.after(this, \"onCancel\", lang.hitch(this, \"hide\"), true);\n\t\t\ton(this.closeButtonNode, touch.press, function(e){\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tthis._modalconnects = [];\n\t\t},\n\n\t\tonLoad: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when data has been loaded from an href.\n\t\t\t//\t\tUnlike most other callbacks, this function can be connected to (via `dojo.connect`)\n\t\t\t//\t\tbut should *not* be overridden.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\n\t\t\t// when href is specified we need to reposition the dialog after the data is loaded\n\t\t\t// and find the focusable elements\n\t\t\tthis.resize();\n\t\t\tthis._position();\n\n\t\t\tif(this.autofocus && DialogLevelManager.isTop(this)){\n\t\t\t\tthis._getFocusItems();\n\t\t\t\tfocus.focus(this._firstFocusItem);\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tfocus: function(){\n\t\t\tthis._getFocusItems();\n\t\t\tfocus.focus(this._firstFocusItem);\n\t\t},\n\n\t\t_endDrag: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled after dragging the Dialog. Saves the position of the dialog in the viewport,\n\t\t\t//\t\tand also adjust position to be fully within the viewport, so user doesn't lose access to handle\n\t\t\tvar nodePosition = domGeometry.position(this.domNode),\n\t\t\t\tviewport = winUtils.getBox(this.ownerDocument);\n\t\t\tnodePosition.y = Math.min(Math.max(nodePosition.y, 0), (viewport.h - nodePosition.h));\n\t\t\tnodePosition.x = Math.min(Math.max(nodePosition.x, 0), (viewport.w - nodePosition.w));\n\t\t\tthis._relativePosition = nodePosition;\n\t\t\tthis._position();\n\t\t},\n\n\t\t_setup: function(){\n\t\t\t// summary:\n\t\t\t//\t\tStuff we need to do before showing the Dialog for the first\n\t\t\t//\t\ttime (but we defer it until right beforehand, for\n\t\t\t//\t\tperformance reasons).\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tvar node = this.domNode;\n\n\t\t\tif(this.titleBar && this.draggable){\n\t\t\t\tthis._moveable = new ((has(\"ie\") == 6) ? TimedMoveable // prevent overload, see #5285\n\t\t\t\t\t: Moveable)(node, { handle: this.titleBar });\n\t\t\t\taspect.after(this._moveable, \"onMoveStop\", lang.hitch(this, \"_endDrag\"), true);\n\t\t\t}else{\n\t\t\t\tdomClass.add(node, \"dijitDialogFixed\");\n\t\t\t}\n\n\t\t\tthis.underlayAttrs = {\n\t\t\t\tdialogId: this.id,\n\t\t\t\t\"class\": array.map(this[\"class\"].split(/\\s/),function(s){\n\t\t\t\t\treturn s + \"_underlay\";\n\t\t\t\t}).join(\" \"),\n\t\t\t\t_onKeyDown: lang.hitch(this, \"_onKey\"),\n\t\t\t\townerDocument: this.ownerDocument\n\t\t\t};\n\t\t},\n\n\t\t_size: function(){\n\t\t\t// TODO: remove for 2.0\n\t\t\tthis.resize();\n\t\t},\n\n\t\t_position: function(){\n\t\t\t// summary:\n\t\t\t//\t\tPosition the dialog in the viewport.  If no relative offset\n\t\t\t//\t\tin the viewport has been determined (by dragging, for instance),\n\t\t\t//\t\tcenter the dialog.  Otherwise, use the Dialog's stored relative offset,\n\t\t\t//\t\tclipped to fit inside the viewport (which may have been shrunk).\n\t\t\t//\t\tFinally, adjust position according to viewport's scroll.\n\n\t\t\tif(!domClass.contains(this.ownerDocumentBody, \"dojoMove\")){    // don't do anything if called during auto-scroll\n\t\t\t\tvar node = this.domNode,\n\t\t\t\t\tviewport = winUtils.getBox(this.ownerDocument),\n\t\t\t\t\tp = this._relativePosition,\n\t\t\t\t\tbb = domGeometry.position(node),\n\t\t\t\t\tl = Math.floor(viewport.l + (p ? Math.min(p.x, viewport.w - bb.w) : (viewport.w - bb.w) / 2)),\n\t\t\t\t\tt = Math.floor(viewport.t + (p ? Math.min(p.y, viewport.h - bb.h) : (viewport.h - bb.h) / 2));\n\n\t\t\t\tdomStyle.set(node, {\n\t\t\t\t\tleft: l + \"px\",\n\t\t\t\t\ttop: t + \"px\"\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t_onKey: function(/*Event*/ evt){\n\t\t\t// summary:\n\t\t\t//\t\tHandles the keyboard events for accessibility reasons\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tif(evt.keyCode == keys.TAB){\n\t\t\t\tthis._getFocusItems();\n\t\t\t\tvar node = evt.target;\n\t\t\t\tif(this._firstFocusItem == this._lastFocusItem){\n\t\t\t\t\t// don't move focus anywhere, but don't allow browser to move focus off of dialog either\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t}else if(node == this._firstFocusItem && evt.shiftKey){\n\t\t\t\t\t// if we are shift-tabbing from first focusable item in dialog, send focus to last item\n\t\t\t\t\tfocus.focus(this._lastFocusItem);\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t}else if(node == this._lastFocusItem && !evt.shiftKey){\n\t\t\t\t\t// if we are tabbing from last focusable item in dialog, send focus to first item\n\t\t\t\t\tfocus.focus(this._firstFocusItem);\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t}\n\t\t\t}else if(this.closable && evt.keyCode == keys.ESCAPE){\n\t\t\t\tthis.onCancel();\n\t\t\t\tevt.stopPropagation();\n\t\t\t\tevt.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\tshow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDisplay the dialog\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tPromise object that resolves when the display animation is complete\n\n\t\t\tif(this.open){\n\t\t\t\treturn resolvedDeferred.promise;\n\t\t\t}\n\n\t\t\tif(!this._started){\n\t\t\t\tthis.startup();\n\t\t\t}\n\n\t\t\t// first time we show the dialog, there's some initialization stuff to do\n\t\t\tif(!this._alreadyInitialized){\n\t\t\t\tthis._setup();\n\t\t\t\tthis._alreadyInitialized = true;\n\t\t\t}\n\n\t\t\tif(this._fadeOutDeferred){\n\t\t\t\t// There's a hide() operation in progress, so cancel it, but still call DialogLevelManager.hide()\n\t\t\t\t// as though the hide() completed, in preparation for the DialogLevelManager.show() call below.\n\t\t\t\tthis._fadeOutDeferred.cancel();\n\t\t\t\tDialogLevelManager.hide(this);\n\t\t\t}\n\n\t\t\t// Recenter Dialog if user scrolls browser.  Connecting to document doesn't work on IE, need to use window.\n\t\t\t// Be sure that event object doesn't get passed to resize() method, because it's expecting an optional\n\t\t\t// {w: ..., h:...} arg.\n\t\t\tvar win = winUtils.get(this.ownerDocument);\n\t\t\tthis._modalconnects.push(on(win, \"scroll\", lang.hitch(this, \"resize\", null)));\n\n\t\t\tthis._modalconnects.push(on(this.domNode, \"keydown\", lang.hitch(this, \"_onKey\")));\n\n\t\t\tdomStyle.set(this.domNode, {\n\t\t\t\topacity: 0,\n\t\t\t\tdisplay: \"\"\n\t\t\t});\n\n\t\t\tthis._set(\"open\", true);\n\t\t\tthis._onShow(); // lazy load trigger\n\n\t\t\tthis.resize();\n\t\t\tthis._position();\n\n\t\t\t// fade-in Animation object, setup below\n\t\t\tvar fadeIn;\n\n\t\t\tthis._fadeInDeferred = new Deferred(lang.hitch(this, function(){\n\t\t\t\tfadeIn.stop();\n\t\t\t\tdelete this._fadeInDeferred;\n\t\t\t}));\n\t\t\tthis._fadeInDeferred.then(undefined, nop);\t// avoid spurious CancelError message to console\n\n\t\t\t// If delay is 0, code below will delete this._fadeInDeferred instantly, so grab promise while we can.\n\t\t\tvar promise = this._fadeInDeferred.promise;\n\n\t\t\tfadeIn = fx.fadeIn({\n\t\t\t\tnode: this.domNode,\n\t\t\t\tduration: this.duration,\n\t\t\t\tbeforeBegin: lang.hitch(this, function(){\n\t\t\t\t\tDialogLevelManager.show(this, this.underlayAttrs);\n\t\t\t\t}),\n\t\t\t\tonEnd: lang.hitch(this, function(){\n\t\t\t\t\tif(this.autofocus && DialogLevelManager.isTop(this)){\n\t\t\t\t\t\t// find focusable items each time dialog is shown since if dialog contains a widget the\n\t\t\t\t\t\t// first focusable items can change\n\t\t\t\t\t\tthis._getFocusItems();\n\t\t\t\t\t\tfocus.focus(this._firstFocusItem);\n\t\t\t\t\t}\n\t\t\t\t\tthis._fadeInDeferred.resolve(true);\n\t\t\t\t\tdelete this._fadeInDeferred;\n\t\t\t\t})\n\t\t\t}).play();\n\n\t\t\treturn promise;\n\t\t},\n\n\t\thide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHide the dialog\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tPromise object that resolves when the display animation is complete\n\n\t\t\t// If we haven't been initialized yet then we aren't showing and we can just return.\n\t\t\t// Likewise if we are already hidden, or are currently fading out.\n\t\t\tif(!this._alreadyInitialized || !this.open){\n\t\t\t\treturn resolvedDeferred.promise;\n\t\t\t}\n\t\t\tif(this._fadeInDeferred){\n\t\t\t\tthis._fadeInDeferred.cancel();\n\t\t\t}\n\n\t\t\t// fade-in Animation object, setup below\n\t\t\tvar fadeOut;\n\n\t\t\tthis._fadeOutDeferred = new Deferred(lang.hitch(this, function(){\n\t\t\t\tfadeOut.stop();\n\t\t\t\tdelete this._fadeOutDeferred;\n\t\t\t}));\n\t\t\tthis._fadeOutDeferred.then(undefined, nop);\t// avoid spurious CancelError message to console\n\n\t\t\t// fire onHide when the promise resolves.\n\t\t\tthis._fadeOutDeferred.then(lang.hitch(this, 'onHide'));\n\n\t\t\t// If delay is 0, code below will delete this._fadeOutDeferred instantly, so grab promise while we can.\n\t\t\tvar promise = this._fadeOutDeferred.promise;\n\n\t\t\tfadeOut = fx.fadeOut({\n\t\t\t\tnode: this.domNode,\n\t\t\t\tduration: this.duration,\n\t\t\t\tonEnd: lang.hitch(this, function(){\n\t\t\t\t\tthis.domNode.style.display = \"none\";\n\t\t\t\t\tDialogLevelManager.hide(this);\n\t\t\t\t\tthis._fadeOutDeferred.resolve(true);\n\t\t\t\t\tdelete this._fadeOutDeferred;\n\t\t\t\t})\n\t\t\t}).play();\n\n\t\t\tif(this._scrollConnected){\n\t\t\t\tthis._scrollConnected = false;\n\t\t\t}\n\t\t\tvar h;\n\t\t\twhile(h = this._modalconnects.pop()){\n\t\t\t\th.remove();\n\t\t\t}\n\n\t\t\tif(this._relativePosition){\n\t\t\t\tdelete this._relativePosition;\n\t\t\t}\n\t\t\tthis._set(\"open\", false);\n\n\t\t\treturn promise;\n\t\t},\n\n\t\tresize: function(dim){\n\t\t\t// summary:\n\t\t\t//\t\tCalled with no argument when viewport scrolled or viewport size changed.  Adjusts Dialog as\n\t\t\t//\t\tnecessary to keep it visible.\n\t\t\t//\n\t\t\t//\t\tCan also be called with an argument (by dojox/layout/ResizeHandle etc.) to explicitly set the\n\t\t\t//\t\tsize of the dialog.\n\t\t\t// dim: Object?\n\t\t\t//\t\tOptional dimension object like {w: 200, h: 300}\n\n\t\t\tif(this.domNode.style.display != \"none\"){\n\n\t\t\t\tthis._checkIfSingleChild();\n\n\t\t\t\tif(!dim){\n\t\t\t\t\tif(this._shrunk){\n\t\t\t\t\t\t// If we earlier shrunk the dialog to fit in the viewport, reset it to its natural size\n\t\t\t\t\t\tif(this._singleChild){\n\t\t\t\t\t\t\tif(typeof this._singleChildOriginalStyle != \"undefined\"){\n\t\t\t\t\t\t\t\tthis._singleChild.domNode.style.cssText = this._singleChildOriginalStyle;\n\t\t\t\t\t\t\t\tdelete this._singleChildOriginalStyle;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tarray.forEach([this.domNode, this.containerNode, this.titleBar, this.actionBarNode], function(node){\n\t\t\t\t\t\t\tif(node){\t// because titleBar may not be defined\n\t\t\t\t\t\t\t\tdomStyle.set(node, {\n\t\t\t\t\t\t\t\t\tposition: \"static\",\n\t\t\t\t\t\t\t\t\twidth: \"auto\",\n\t\t\t\t\t\t\t\t\theight: \"auto\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.domNode.style.position = \"absolute\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// If necessary, shrink Dialog to fit in viewport and have some space around it\n\t\t\t\t\t// to indicate that it's a popup.  This will also compensate for possible scrollbars on viewport.\n\t\t\t\t\tvar viewport = winUtils.getBox(this.ownerDocument);\n\t\t\t\t\tviewport.w *= this.maxRatio;\n\t\t\t\t\tviewport.h *= this.maxRatio;\n\n\t\t\t\t\tvar bb = domGeometry.position(this.domNode);\n\t\t\t\t\tthis._shrunk = false;\n\t\t\t\t\t// First check and limit width, because limiting the width may increase the height due to word wrapping.\n\t\t\t\t\tif(bb.w >= viewport.w){\n\t\t\t\t\t\tdim = {\n\t\t\t\t\t\t\tw: viewport.w\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdomGeometry.setMarginBox(this.domNode, dim);\n\t\t\t\t\t\tbb = domGeometry.position(this.domNode);\n\t\t\t\t\t\tthis._shrunk = true;\n\t\t\t\t\t}\n\t\t\t\t\t// Now check and limit the height\n\t\t\t\t\tif(bb.h >= viewport.h){\n\t\t\t\t\t\tif(!dim){\n\t\t\t\t\t\t\tdim = {\n\t\t\t\t\t\t\t\tw: bb.w\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdim.h = viewport.h;\n\t\t\t\t\t\tthis._shrunk = true;\n\t\t\t\t\t}\n\t\t\t\t\tif(dim){\n\t\t\t\t\t\tif(!dim.w){\n\t\t\t\t\t\t\tdim.w = bb.w;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!dim.h){\n\t\t\t\t\t\t\tdim.h = bb.h;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Code to run if user has requested an explicit size, or the shrinking code above set an implicit size\n\t\t\t\tif(dim){\n\t\t\t\t\t// Set this.domNode to specified size\n\t\t\t\t\tdomGeometry.setMarginBox(this.domNode, dim);\n\n\t\t\t\t\t// And then size this.containerNode\n\t\t\t\t\tvar layoutNodes = [];\n\t\t\t\t\tif(this.titleBar){\n\t\t\t\t\t\tlayoutNodes.push({domNode: this.titleBar, region: \"top\"});\n\t\t\t\t\t}\n\t\t\t\t\tif(this.actionBarNode){\n\t\t\t\t\t\tlayoutNodes.push({domNode: this.actionBarNode, region: \"bottom\"});\n\t\t\t\t\t}\n\t\t\t\t\tvar centerSize = {domNode: this.containerNode, region: \"center\"};\n\t\t\t\t\tlayoutNodes.push(centerSize);\n\n\t\t\t\t\tvar contentDim = utils.marginBox2contentBox(this.domNode, dim);\n\t\t\t\t\tutils.layoutChildren(this.domNode, contentDim, layoutNodes);\n\n\t\t\t\t\t// And then if this.containerNode has a single layout widget child, size it too.\n\t\t\t\t\t// Otherwise, make this.containerNode show a scrollbar if it's overflowing.\n\t\t\t\t\tif(this._singleChild){\n\t\t\t\t\t\tvar cb = utils.marginBox2contentBox(this.containerNode, centerSize);\n\t\t\t\t\t\t// note: if containerNode has padding singleChildSize will have l and t set,\n\t\t\t\t\t\t// but don't pass them to resize() or it will doubly-offset the child\n\t\t\t\t\t\tthis._singleChild.resize({w: cb.w, h: cb.h});\n\t\t\t\t\t\t// TODO: save original size for restoring it on another show()?\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.containerNode.style.overflow = \"auto\";\n\t\t\t\t\t\tthis._layoutChildren();\t\t// send resize() event to all child widgets\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tthis._layoutChildren();\t\t// send resize() event to all child widgets\n\t\t\t\t}\n\n\t\t\t\tif(!has(\"touch\") && !dim){\n\t\t\t\t\t// If the user has scrolled the viewport then reposition the Dialog.  But don't do it for touch\n\t\t\t\t\t// devices, because it will counteract when a keyboard pops up and then the browser auto-scrolls\n\t\t\t\t\t// the focused node into view.\n\t\t\t\t\tthis._position();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_layoutChildren: function(){\n\t\t\t// Override _ContentPaneResizeMixin._layoutChildren because even when there's just a single layout child\n\t\t\t// widget, sometimes we don't want to size it explicitly (i.e. to pass a dim argument to resize())\n\n\t\t\tarray.forEach(this.getChildren(), function(widget){\n\t\t\t\tif(widget.resize){\n\t\t\t\t\twidget.resize();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tif(this._fadeInDeferred){\n\t\t\t\tthis._fadeInDeferred.cancel();\n\t\t\t}\n\t\t\tif(this._fadeOutDeferred){\n\t\t\t\tthis._fadeOutDeferred.cancel();\n\t\t\t}\n\t\t\tif(this._moveable){\n\t\t\t\tthis._moveable.destroy();\n\t\t\t}\n\t\t\tvar h;\n\t\t\twhile(h = this._modalconnects.pop()){\n\t\t\t\th.remove();\n\t\t\t}\n\n\t\t\tDialogLevelManager.hide(this);\n\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\t_DialogBase = declare(\"dijit._DialogBase\", _DialogBase, {\n\t\t\t_setTitleAttr: function(/*String*/ title){\n\t\t\t\tthis._set(\"title\", title);\n\t\t\t\tthis.titleNode.innerHTML = title;\n\t\t\t\tthis.applyTextDir(this.titleNode);\n\t\t\t},\n\n\t\t\t_setTextDirAttr: function(textDir){\n\t\t\t\tif(this._created && this.textDir != textDir){\n\t\t\t\t\tthis._set(\"textDir\", textDir);\n\t\t\t\t\tthis.set(\"title\", this.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tvar Dialog = declare(\"dijit.Dialog\", [ContentPane, _DialogBase], {\n\t\t// summary:\n\t\t//\t\tA modal dialog Widget.\n\t\t// description:\n\t\t//\t\tPops up a modal dialog window, blocking access to the screen\n\t\t//\t\tand also graying out the screen Dialog is extended from\n\t\t//\t\tContentPane so it supports all the same parameters (href, etc.).\n\t\t// example:\n\t\t// |\t<div data-dojo-type=\"dijit/Dialog\" data-dojo-props=\"href: 'test.html'\"></div>\n\t\t// example:\n\t\t// |\tvar foo = new Dialog({ title: \"test dialog\", content: \"test content\" });\n\t\t// |\tfoo.placeAt(win.body());\n\t\t// |\tfoo.startup();\n\t});\n\tDialog._DialogBase = _DialogBase;\t// for monkey patching and dojox/widget/DialogSimple\n\n\tvar DialogLevelManager = Dialog._DialogLevelManager = {\n\t\t// summary:\n\t\t//\t\tControls the various active \"levels\" on the page, starting with the\n\t\t//\t\tstuff initially visible on the page (at z-index 0), and then having an entry for\n\t\t//\t\teach Dialog shown.\n\n\t\t_beginZIndex: 950,\n\n\t\tshow: function(/*dijit/_WidgetBase*/ dialog, /*Object*/ underlayAttrs){\n\t\t\t// summary:\n\t\t\t//\t\tCall right before fade-in animation for new dialog.\n\t\t\t//\t\tSaves current focus, displays/adjusts underlay for new dialog,\n\t\t\t//\t\tand sets the z-index of the dialog itself.\n\t\t\t//\n\t\t\t//\t\tNew dialog will be displayed on top of all currently displayed dialogs.\n\t\t\t//\n\t\t\t//\t\tCaller is responsible for setting focus in new dialog after the fade-in\n\t\t\t//\t\tanimation completes.\n\n\t\t\t// Save current focus\n\t\t\tds[ds.length - 1].focus = focus.curNode;\n\n\t\t\t// Set z-index a bit above previous dialog\n\t\t\tvar zIndex = ds[ds.length - 1].dialog ? ds[ds.length - 1].zIndex + 2 : Dialog._DialogLevelManager._beginZIndex;\n\t\t\tdomStyle.set(dialog.domNode, 'zIndex', zIndex);\n\n\t\t\t// Display the underlay, or if already displayed then adjust for this new dialog\n\t\t\tDialogUnderlay.show(underlayAttrs, zIndex - 1);\n\n\t\t\tds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex});\n\t\t},\n\n\t\thide: function(/*dijit/_WidgetBase*/ dialog){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the specified dialog is hidden/destroyed, after the fade-out\n\t\t\t//\t\tanimation ends, in order to reset page focus, fix the underlay, etc.\n\t\t\t//\t\tIf the specified dialog isn't open then does nothing.\n\t\t\t//\n\t\t\t//\t\tCaller is responsible for either setting display:none on the dialog domNode,\n\t\t\t//\t\tor calling dijit/popup.hide(), or removing it from the page DOM.\n\n\t\t\tif(ds[ds.length - 1].dialog == dialog){\n\t\t\t\t// Removing the top (or only) dialog in the stack, return focus\n\t\t\t\t// to previous dialog\n\n\t\t\t\tds.pop();\n\n\t\t\t\tvar pd = ds[ds.length - 1];\t// the new active dialog (or the base page itself)\n\n\t\t\t\t// Adjust underlay\n\t\t\t\tif(ds.length == 1){\n\t\t\t\t\t// Returning to original page.  Hide the underlay.\n\t\t\t\t\tDialogUnderlay.hide();\n\t\t\t\t}else{\n\t\t\t\t\t// Popping back to previous dialog, adjust underlay.\n\t\t\t\t\tDialogUnderlay.show(pd.underlayAttrs, pd.zIndex - 1);\n\t\t\t\t}\n\n\t\t\t\t// Adjust focus.\n\t\t\t\t// TODO: regardless of setting of dialog.refocus, if the exeucte() method set focus somewhere,\n\t\t\t\t// don't shift focus back to button.  Note that execute() runs at the start of the fade-out but\n\t\t\t\t// this code runs later, at the end of the fade-out.  Menu has code like this.\n\t\t\t\tif(dialog.refocus){\n\t\t\t\t\t// If we are returning control to a previous dialog but for some reason\n\t\t\t\t\t// that dialog didn't have a focused field, set focus to first focusable item.\n\t\t\t\t\t// This situation could happen if two dialogs appeared at nearly the same time,\n\t\t\t\t\t// since a dialog doesn't set it's focus until the fade-in is finished.\n\t\t\t\t\tvar focus = pd.focus;\n\t\t\t\t\tif(pd.dialog && (!focus || !dom.isDescendant(focus, pd.dialog.domNode))){\n\t\t\t\t\t\tpd.dialog._getFocusItems();\n\t\t\t\t\t\tfocus = pd.dialog._firstFocusItem;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(focus){\n\t\t\t\t\t\t// Refocus the button that spawned the Dialog.   This will fail in corner cases including\n\t\t\t\t\t\t// page unload on IE, because the dijit/form/Button that launched the Dialog may get destroyed\n\t\t\t\t\t\t// before this code runs.  (#15058)\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tfocus.focus();\n\t\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t// Removing a dialog out of order (#9944, #10705).\n\t\t\t\t// Don't need to mess with underlay or z-index or anything.\n\t\t\t\tvar idx = array.indexOf(array.map(ds, function(elem){\n\t\t\t\t\treturn elem.dialog;\n\t\t\t\t}), dialog);\n\t\t\t\tif(idx != -1){\n\t\t\t\t\tds.splice(idx, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tisTop: function(/*dijit/_WidgetBase*/ dialog){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if specified Dialog is the top in the task\n\t\t\treturn ds[ds.length - 1].dialog == dialog;\n\t\t}\n\t};\n\n\t// Stack representing the various active \"levels\" on the page, starting with the\n\t// stuff initially visible on the page (at z-index 0), and then having an entry for\n\t// each Dialog shown.\n\t// Each element in stack has form {\n\t//\t\tdialog: dialogWidget,\n\t//\t\tfocus: returnFromGetFocus(),\n\t//\t\tunderlayAttrs: attributes to set on underlay (when this widget is active)\n\t// }\n\tvar ds = Dialog._dialogStack = [\n\t\t{dialog: null, focus: null, underlayAttrs: null}    // entry for stuff at z-index: 0\n\t];\n\n\t// If focus was accidentally removed from the dialog, such as if the user clicked a blank\n\t// area of the screen, or clicked the browser's address bar and then tabbed into the page,\n\t// then refocus.   Won't do anything if focus was removed because the Dialog was closed, or\n\t// because a new Dialog popped up on top of the old one, or when focus moves to popups\n\tfocus.watch(\"curNode\", function(attr, oldNode, node){\n \t\t// Note: if no dialogs, ds.length==1 but ds[ds.length-1].dialog is null\n\t\tvar topDialog = ds[ds.length - 1].dialog;\n\n\t\t// If a node was focused, and there's a Dialog currently showing, and not in the process of fading out...\n\t\t// Ignore focus events on other document though because it's likely an Editor inside of the Dialog.\n\t\tif(node && topDialog && !topDialog._fadeOutDeferred && node.ownerDocument == topDialog.ownerDocument){\n\t\t\t// If the node that was focused is inside the dialog or in a popup, even a context menu that isn't\n\t\t\t// technically a descendant of the the dialog, don't do anything.\n\t\t\tdo{\n\t\t\t\tif(node == topDialog.domNode || domClass.contains(node, \"dijitPopup\")){ return; }\n\t\t\t}while(node = node.parentNode);\n\n\t\t\t// Otherwise, return focus to the dialog.  Use a delay to avoid confusing dijit/focus code's\n\t\t\t// own tracking of focus.\n\t\t\ttopDialog.focus();\n\t\t}\n\t});\n\n\t// Back compat w/1.6, remove for 2.0\n\tif(has(\"dijit-legacy-requires\")){\n\t\tready(0, function(){\n\t\t\tvar requires = [\"dijit/TooltipDialog\"];\n\t\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t\t});\n\t}\n\n\treturn Dialog;\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/aspect\", // aspect.after\n\t\"dojo/dom-attr\", // domAttr.set\n\t\"dojo/dom-style\", // domStyle.getComputedStyle\n\t\"dojo/on\",\n\t\"dojo/window\", // winUtils.getBox, winUtils.get\n\t\"./_Widget\",\n\t\"./_TemplatedMixin\",\n\t\"./BackgroundIframe\",\n\t\"./Viewport\",\n\t\"./main\" // for back-compat, exporting dijit._underlay (remove in 2.0)\n], function(declare, lang, aspect, domAttr, domStyle, on,\n\t\t\twinUtils, _Widget, _TemplatedMixin, BackgroundIframe, Viewport, dijit){\n\n\t// module:\n\t//\t\tdijit/DialogUnderlay\n\n\tvar DialogUnderlay = declare(\"dijit.DialogUnderlay\", [_Widget, _TemplatedMixin], {\n\t\t// summary:\n\t\t//\t\tA component used to block input behind a `dijit/Dialog`.\n\t\t//\n\t\t//\t\tNormally this class should not be instantiated directly, but rather shown and hidden via\n\t\t//\t\tDialogUnderlay.show() and DialogUnderlay.hide().  And usually the module is not accessed directly\n\t\t//\t\tat all, since the underlay is shown and hidden by Dialog.DialogLevelManager.\n\t\t//\n\t\t//\t\tThe underlay itself can be styled based on and id:\n\t\t//\t|\t#myDialog_underlay { background-color:red; }\n\t\t//\n\t\t//\t\tIn the case of `dijit.Dialog`, this id is based on the id of the Dialog,\n\t\t//\t\tsuffixed with _underlay.\n\n\t\t// Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe.\n\t\t// Inner div has opacity specified in CSS file.\n\t\ttemplateString: \"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' tabIndex='-1' data-dojo-attach-point='node'></div></div>\",\n\n\t\t// Parameters on creation or updatable later\n\n\t\t// dialogId: String\n\t\t//\t\tId of the dialog.... DialogUnderlay's id is based on this id\n\t\tdialogId: \"\",\n\n\t\t// class: String\n\t\t//\t\tThis class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay\n\t\t\"class\": \"\",\n\n\t\t// This will get overwritten as soon as show() is call, but leave an empty array in case hide() or destroy()\n\t\t// is called first.   The array is shared between instances but that's OK because we never write into it.\n\t\t_modalConnects: [],\n\n\t\t_setDialogIdAttr: function(id){\n\t\t\tdomAttr.set(this.node, \"id\", id + \"_underlay\");\n\t\t\tthis._set(\"dialogId\", id);\n\t\t},\n\n\t\t_setClassAttr: function(clazz){\n\t\t\tthis.node.className = \"dijitDialogUnderlay \" + clazz;\n\t\t\tthis._set(\"class\", clazz);\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\t// Append the underlay to the body\n\t\t\tthis.ownerDocumentBody.appendChild(this.domNode);\n\n\t\t\tthis.own(on(this.domNode, \"keydown\", lang.hitch(this, \"_onKeyDown\")));\n\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tlayout: function(){\n\t\t\t// summary:\n\t\t\t//\t\tSets the background to the size of the viewport\n\t\t\t//\n\t\t\t// description:\n\t\t\t//\t\tSets the background to the size of the viewport (rather than the size\n\t\t\t//\t\tof the document) since we need to cover the whole browser window, even\n\t\t\t//\t\tif the document is only a few lines long.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tvar is = this.node.style,\n\t\t\t\tos = this.domNode.style;\n\n\t\t\t// hide the background temporarily, so that the background itself isn't\n\t\t\t// causing scrollbars to appear (might happen when user shrinks browser\n\t\t\t// window and then we are called to resize)\n\t\t\tos.display = \"none\";\n\n\t\t\t// then resize and show\n\t\t\tvar viewport = winUtils.getBox(this.ownerDocument);\n\t\t\tos.top = viewport.t + \"px\";\n\t\t\tos.left = viewport.l + \"px\";\n\t\t\tis.width = viewport.w + \"px\";\n\t\t\tis.height = viewport.h + \"px\";\n\t\t\tos.display = \"block\";\n\t\t},\n\n\t\tshow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tShow the dialog underlay\n\t\t\tthis.domNode.style.display = \"block\";\n\t\t\tthis.open = true;\n\t\t\tthis.layout();\n\t\t\tthis.bgIframe = new BackgroundIframe(this.domNode);\n\n\t\t\tvar win = winUtils.get(this.ownerDocument);\n\t\t\tthis._modalConnects = [\n\t\t\t\tViewport.on(\"resize\", lang.hitch(this, \"layout\")),\n\t\t\t\ton(win, \"scroll\", lang.hitch(this, \"layout\"))\n\t\t\t];\n\n\t\t},\n\n\t\thide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHides the dialog underlay\n\n\t\t\tthis.bgIframe.destroy();\n\t\t\tdelete this.bgIframe;\n\t\t\tthis.domNode.style.display = \"none\";\n\t\t\twhile(this._modalConnects.length){ (this._modalConnects.pop()).remove(); }\n\t\t\tthis.open = false;\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\twhile(this._modalConnects.length){ (this._modalConnects.pop()).remove(); }\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_onKeyDown: function(){\n\t\t\t// summary:\n\t\t\t//\t\tExtension point so Dialog can monitor keyboard events on the underlay.\n\t\t}\n\t});\n\n\tDialogUnderlay.show = function(/*Object*/ attrs, /*Number*/ zIndex){\n\t\t// summary:\n\t\t//\t\tDisplay the underlay with the given attributes set.  If the underlay is already displayed,\n\t\t//\t\tthen adjust it's attributes as specified.\n\t\t// attrs:\n\t\t//\t\tThe parameters to create DialogUnderlay with.\n\t\t// zIndex:\n\t\t//\t\tzIndex of the underlay\n\n\t\tvar underlay = DialogUnderlay._singleton;\n\t\tif(!underlay || underlay._destroyed){\n\t\t\tunderlay = dijit._underlay = DialogUnderlay._singleton = new DialogUnderlay(attrs);\n\t\t}else{\n\t\t\tif(attrs){ underlay.set(attrs); }\n\t\t}\n\t\tdomStyle.set(underlay.domNode, 'zIndex', zIndex);\n\t\tif(!underlay.open){\n\t\t\tunderlay.show();\n\t\t}\n\t};\n\n\tDialogUnderlay.hide = function(){\n\t\t// summary:\n\t\t//\t\tHide the underlay.\n\n\t\t// Guard code in case the underlay widget has already been destroyed\n\t\t// because we are being called during page unload (when all widgets are destroyed)\n\t\tvar underlay = DialogUnderlay._singleton;\n\t\tif(underlay && !underlay._destroyed){\n\t\t\tunderlay.hide();\n\t\t}\n\t};\n\n\treturn DialogUnderlay;\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.indexOf array.map\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/fx\", // fx.fadeIn fx.fadeOut\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/dom-class\", // domClass.add\n\t\"dojo/dom-geometry\", // domGeometry.position\n\t\"dojo/dom-style\", // domStyle.set, domStyle.get\n\t\"dojo/_base/lang\", // lang.hitch lang.isArrayLike\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"ie\"), has(\"trident\")\n\t\"./_base/manager\",\t// manager.defaultDuration\n\t\"./place\",\n\t\"./_Widget\",\n\t\"./_TemplatedMixin\",\n\t\"./BackgroundIframe\",\n\t\"dojo/text!./templates/Tooltip.html\",\n\t\"./main\"\t\t// sets dijit.showTooltip etc. for back-compat\n], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, mouse, on, has,\n\t\t\tmanager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){\n\n\t// module:\n\t//\t\tdijit/Tooltip\n\n\n\t// TODO: Tooltip should really share more positioning code with TooltipDialog, like:\n\t//\t\t- the orient() method\n\t//\t\t- the connector positioning code in show()\n\t//\t\t- the dijitTooltip[Dialog] class\n\t//\n\t// The problem is that Tooltip's implementation supplies it's own <iframe> and interacts directly\n\t// with dijit/place, rather than going through dijit/popup like TooltipDialog and other popups (ex: Menu).\n\n\tvar MasterTooltip = declare(\"dijit._MasterTooltip\", [_Widget, _TemplatedMixin], {\n\t\t// summary:\n\t\t//\t\tInternal widget that holds the actual tooltip markup,\n\t\t//\t\twhich occurs once per page.\n\t\t//\t\tCalled by Tooltip widgets which are just containers to hold\n\t\t//\t\tthe markup\n\t\t// tags:\n\t\t//\t\tprotected\n\n\t\t// duration: Integer\n\t\t//\t\tMilliseconds to fade in/fade out\n\t\tduration: manager.defaultDuration,\n\n\t\ttemplateString: template,\n\n\t\tpostCreate: function(){\n\t\t\tthis.ownerDocumentBody.appendChild(this.domNode);\n\n\t\t\tthis.bgIframe = new BackgroundIframe(this.domNode);\n\n\t\t\t// Setup fade-in and fade-out functions.\n\t\t\tthis.fadeIn = fx.fadeIn({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, \"_onShow\") });\n\t\t\tthis.fadeOut = fx.fadeOut({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, \"_onHide\") });\n\t\t},\n\n\t\tshow: function(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave){\n\t\t\t// summary:\n\t\t\t//\t\tDisplay tooltip w/specified contents to right of specified node\n\t\t\t//\t\t(To left if there's no space on the right, or if rtl == true)\n\t\t\t// innerHTML: String\n\t\t\t//\t\tContents of the tooltip\n\t\t\t// aroundNode: DomNode|dijit/place.__Rectangle\n\t\t\t//\t\tSpecifies that tooltip should be next to this node / area\n\t\t\t// position: String[]?\n\t\t\t//\t\tList of positions to try to position tooltip (ex: [\"right\", \"above\"])\n\t\t\t// rtl: Boolean?\n\t\t\t//\t\tCorresponds to `WidgetBase.dir` attribute, where false means \"ltr\" and true\n\t\t\t//\t\tmeans \"rtl\"; specifies GUI direction, not text direction.\n\t\t\t// textDir: String?\n\t\t\t//\t\tCorresponds to `WidgetBase.textdir` attribute; specifies direction of text.\n\t\t\t// onMouseEnter: Function?\n\t\t\t//\t\tCallback function for mouse enter on tooltip\n\t\t\t// onMouseLeave: Function?\n\t\t\t//\t\tCallback function for mouse leave on tooltip\n\n\t\t\tif(this.aroundNode && this.aroundNode === aroundNode && this.containerNode.innerHTML == innerHTML){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.fadeOut.status() == \"playing\"){\n\t\t\t\t// previous tooltip is being hidden; wait until the hide completes then show new one\n\t\t\t\tthis._onDeck=arguments;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.containerNode.innerHTML=innerHTML;\n\n\t\t\tif(textDir){\n\t\t\t\tthis.set(\"textDir\", textDir);\n\t\t\t}\n\n\t\t\tthis.containerNode.align = rtl? \"right\" : \"left\"; //fix the text alignment\n\n\t\t\tvar pos = place.around(this.domNode, aroundNode,\n\t\t\t\tposition && position.length ? position : Tooltip.defaultPosition, !rtl, lang.hitch(this, \"orient\"));\n\n\t\t\t// Position the tooltip connector for middle alignment.\n\t\t\t// This could not have been done in orient() since the tooltip wasn't positioned at that time.\n\t\t\tvar aroundNodeCoords = pos.aroundNodePos;\n\t\t\tif(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){\n\t\t\t\tthis.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + \"px\";\n\t\t\t\tthis.connectorNode.style.left = \"\";\n\t\t\t}else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){\n\t\t\t\tthis.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + \"px\";\n\t\t\t}else{\n\t\t\t\t// Not *-centered, but just above/below/after/before\n\t\t\t\tthis.connectorNode.style.left = \"\";\n\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t}\n\n\t\t\t// show it\n\t\t\tdomStyle.set(this.domNode, \"opacity\", 0);\n\t\t\tthis.fadeIn.play();\n\t\t\tthis.isShowingNow = true;\n\t\t\tthis.aroundNode = aroundNode;\n\n\t\t\tthis.onMouseEnter = onMouseEnter || noop;\n\t\t\tthis.onMouseLeave = onMouseLeave || noop;\n\t\t},\n\n\t\torient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner, /*Object*/ spaceAvailable, /*Object*/ aroundNodeCoords){\n\t\t\t// summary:\n\t\t\t//\t\tPrivate function to set CSS for tooltip node based on which position it's in.\n\t\t\t//\t\tThis is called by the dijit popup code.   It will also reduce the tooltip's\n\t\t\t//\t\twidth to whatever width is available\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.connectorNode.style.top = \"\"; //reset to default\n\n\t\t\tvar heightAvailable = spaceAvailable.h,\n\t\t\t\twidthAvailable = spaceAvailable.w;\n\n\t\t\tnode.className = \"dijitTooltip \" +\n\t\t\t\t{\n\t\t\t\t\t\"MR-ML\": \"dijitTooltipRight\",\n\t\t\t\t\t\"ML-MR\": \"dijitTooltipLeft\",\n\t\t\t\t\t\"TM-BM\": \"dijitTooltipAbove\",\n\t\t\t\t\t\"BM-TM\": \"dijitTooltipBelow\",\n\t\t\t\t\t\"BL-TL\": \"dijitTooltipBelow dijitTooltipABLeft\",\n\t\t\t\t\t\"TL-BL\": \"dijitTooltipAbove dijitTooltipABLeft\",\n\t\t\t\t\t\"BR-TR\": \"dijitTooltipBelow dijitTooltipABRight\",\n\t\t\t\t\t\"TR-BR\": \"dijitTooltipAbove dijitTooltipABRight\",\n\t\t\t\t\t\"BR-BL\": \"dijitTooltipRight\",\n\t\t\t\t\t\"BL-BR\": \"dijitTooltipLeft\"\n\t\t\t\t}[aroundCorner + \"-\" + tooltipCorner];\n\n\t\t\t// reset width; it may have been set by orient() on a previous tooltip show()\n\t\t\tthis.domNode.style.width = \"auto\";\n\n\t\t\t// Reduce tooltip's width to the amount of width available, so that it doesn't overflow screen.\n\t\t\t// Note that sometimes widthAvailable is negative, but we guard against setting style.width to a\n\t\t\t// negative number since that causes an exception on IE.\n\t\t\tvar size = domGeometry.position(this.domNode);\n\t\t\tif(has(\"ie\") || has(\"trident\")){\n\t\t\t\t// workaround strange IE bug where setting width to offsetWidth causes words to wrap\n\t\t\t\tsize.w += 2;\n\t\t\t}\n\n\t\t\tvar width = Math.min((Math.max(widthAvailable,1)), size.w);\n\n\t\t\tdomGeometry.setMarginBox(this.domNode, {w: width});\n\n\t\t\t// Reposition the tooltip connector.\n\t\t\tif(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){\n\t\t\t\tvar bb = domGeometry.position(node);\n\t\t\t\tvar tooltipConnectorHeight = this.connectorNode.offsetHeight;\n\t\t\t\tif(bb.h > heightAvailable){\n\t\t\t\t\t// The tooltip starts at the top of the page and will extend past the aroundNode\n\t\t\t\t\tvar aroundNodePlacement = heightAvailable - ((aroundNodeCoords.h + tooltipConnectorHeight) >> 1);\n\t\t\t\t\tthis.connectorNode.style.top = aroundNodePlacement + \"px\";\n\t\t\t\t\tthis.connectorNode.style.bottom = \"\";\n\t\t\t\t}else{\n\t\t\t\t\t// Align center of connector with center of aroundNode, except don't let bottom\n\t\t\t\t\t// of connector extend below bottom of tooltip content, or top of connector\n\t\t\t\t\t// extend past top of tooltip content\n\t\t\t\t\tthis.connectorNode.style.bottom = Math.min(\n\t\t\t\t\t\tMath.max(aroundNodeCoords.h/2 - tooltipConnectorHeight/2, 0),\n\t\t\t\t\t\tbb.h - tooltipConnectorHeight) + \"px\";\n\t\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t// reset the tooltip back to the defaults\n\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t\tthis.connectorNode.style.bottom = \"\";\n\t\t\t}\n\n\t\t\treturn Math.max(0, size.w - widthAvailable);\n\t\t},\n\n\t\t_onShow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled at end of fade-in operation\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tif(has(\"ie\")){\n\t\t\t\t// the arrow won't show up on a node w/an opacity filter\n\t\t\t\tthis.domNode.style.filter=\"\";\n\t\t\t}\n\t\t},\n\n\t\thide: function(aroundNode){\n\t\t\t// summary:\n\t\t\t//\t\tHide the tooltip\n\n\t\t\tif(this._onDeck && this._onDeck[1] == aroundNode){\n\t\t\t\t// this hide request is for a show() that hasn't even started yet;\n\t\t\t\t// just cancel the pending show()\n\t\t\t\tthis._onDeck=null;\n\t\t\t}else if(this.aroundNode === aroundNode){\n\t\t\t\t// this hide request is for the currently displayed tooltip\n\t\t\t\tthis.fadeIn.stop();\n\t\t\t\tthis.isShowingNow = false;\n\t\t\t\tthis.aroundNode = null;\n\t\t\t\tthis.fadeOut.play();\n\t\t\t}else{\n\t\t\t\t// just ignore the call, it's for a tooltip that has already been erased\n\t\t\t}\n\n\t\t\tthis.onMouseEnter = this.onMouseLeave = noop;\n\t\t},\n\n\t\t_onHide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled at end of fade-out operation\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.domNode.style.cssText=\"\";\t// to position offscreen again\n\t\t\tthis.containerNode.innerHTML=\"\";\n\t\t\tif(this._onDeck){\n\t\t\t\t// a show request has been queued up; do it now\n\t\t\t\tthis.show.apply(this, this._onDeck);\n\t\t\t\tthis._onDeck=null;\n\t\t\t}\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\tMasterTooltip.extend({\n\t\t\t_setAutoTextDir: function(/*Object*/node){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tResolve \"auto\" text direction for children nodes\n\t\t\t\t// tags:\n\t\t\t\t//\t\tprivate\n\n\t\t\t\tthis.applyTextDir(node);\n\t\t\t\tarray.forEach(node.children, function(child){ this._setAutoTextDir(child); }, this);\n\t\t\t},\n\n\t\t\t_setTextDirAttr: function(/*String*/ textDir){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tSetter for textDir.\n\t\t\t\t// description:\n\t\t\t\t//\t\tUsers shouldn't call this function; they should be calling\n\t\t\t\t//\t\tset('textDir', value)\n\t\t\t\t// tags:\n\t\t\t\t//\t\tprivate\n\n\t\t\t\tthis._set(\"textDir\", textDir);\n\n\t\t\t\tif (textDir == \"auto\"){\n\t\t\t\t\tthis._setAutoTextDir(this.containerNode);\n\t\t\t\t}else{\n\t\t\t\t\tthis.containerNode.dir = this.textDir;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tdijit.showTooltip = function(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave){\n\t\t// summary:\n\t\t//\t\tStatic method to display tooltip w/specified contents in specified position.\n\t\t//\t\tSee description of dijit/Tooltip.defaultPosition for details on position parameter.\n\t\t//\t\tIf position is not specified then dijit/Tooltip.defaultPosition is used.\n\t\t// innerHTML: String\n\t\t//\t\tContents of the tooltip\n\t\t// aroundNode: place.__Rectangle\n\t\t//\t\tSpecifies that tooltip should be next to this node / area\n\t\t// position: String[]?\n\t\t//\t\tList of positions to try to position tooltip (ex: [\"right\", \"above\"])\n\t\t// rtl: Boolean?\n\t\t//\t\tCorresponds to `WidgetBase.dir` attribute, where false means \"ltr\" and true\n\t\t//\t\tmeans \"rtl\"; specifies GUI direction, not text direction.\n\t\t// textDir: String?\n\t\t//\t\tCorresponds to `WidgetBase.textdir` attribute; specifies direction of text.\n\t\t// onMouseEnter: Function?\n\t\t//\t\tCallback function for mouse over on tooltip\n\t\t// onMouseLeave: Function?\n\t\t//\t\tCallback function for mouse leave on tooltip\n\n\t\t// After/before don't work, but for back-compat convert them to the working after-centered, before-centered.\n\t\t// Possibly remove this in 2.0.   Alternately, get before/after to work.\n\t\tif(position){\n\t\t\tposition = array.map(position, function(val){\n\t\t\t\treturn {after: \"after-centered\", before: \"before-centered\"}[val] || val;\n\t\t\t});\n\t\t}\n\n\t\tif(!Tooltip._masterTT){ dijit._masterTT = Tooltip._masterTT = new MasterTooltip(); }\n\t\treturn Tooltip._masterTT.show(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave);\n\t};\n\n\tdijit.hideTooltip = function(aroundNode){\n\t\t// summary:\n\t\t//\t\tStatic method to hide the tooltip displayed via showTooltip()\n\t\treturn Tooltip._masterTT && Tooltip._masterTT.hide(aroundNode);\n\t};\n\n\t// Possible states for a tooltip, see Tooltip.state property for definitions\n\tvar DORMANT = \"DORMANT\",\n\t\tSHOW_TIMER = \"SHOW TIMER\",\n\t\tSHOWING = \"SHOWING\",\n\t\tHIDE_TIMER = \"HIDE TIMER\";\n\n\tfunction noop(){}\n\n\tvar Tooltip = declare(\"dijit.Tooltip\", _Widget, {\n\t\t// summary:\n\t\t//\t\tPops up a tooltip (a help message) when you hover over a node.\n\t\t//\t\tAlso provides static show() and hide() methods that can be used without instantiating a dijit/Tooltip.\n\n\t\t// label: String\n\t\t//\t\tHTML to display in the tooltip.\n\t\t//\t\tSpecified as innerHTML when creating the widget from markup.\n\t\tlabel: \"\",\n\n\t\t// showDelay: Integer\n\t\t//\t\tNumber of milliseconds to wait after hovering over/focusing on the object, before\n\t\t//\t\tthe tooltip is displayed.\n\t\tshowDelay: 400,\n\n\t\t// hideDelay: Integer\n\t\t//\t\tNumber of milliseconds to wait after unhovering the object, before\n\t\t//\t\tthe tooltip is hidden.  Note that blurring an object hides the tooltip immediately.\n\t\thideDelay: 400,\n\n\t\t// connectId: String|String[]|DomNode|DomNode[]\n\t\t//\t\tId of domNode(s) to attach the tooltip to.\n\t\t//\t\tWhen user hovers over specified dom node(s), the tooltip will appear.\n\t\tconnectId: [],\n\n\t\t// position: String[]\n\t\t//\t\tSee description of `dijit/Tooltip.defaultPosition` for details on position parameter.\n\t\tposition: [],\n\n\t\t// selector: String?\n\t\t//\t\tCSS expression to apply this Tooltip to descendants of connectIds, rather than to\n\t\t//\t\tthe nodes specified by connectIds themselves.    Useful for applying a Tooltip to\n\t\t//\t\ta range of rows in a table, tree, etc.   Use in conjunction with getContent() parameter.\n\t\t//\t\tEx: connectId: myTable, selector: \"tr\", getContent: function(node){ return ...; }\n\t\t//\n\t\t//\t\tThe application must require() an appropriate level of dojo/query to handle the selector.\n\t\tselector: \"\",\n\n\t\t// TODO: in 2.0 remove support for multiple connectIds.   selector gives the same effect.\n\t\t// So, change connectId to a \"\", remove addTarget()/removeTarget(), etc.\n\n\t\t_setConnectIdAttr: function(/*String|String[]|DomNode|DomNode[]*/ newId){\n\t\t\t// summary:\n\t\t\t//\t\tConnect to specified node(s)\n\n\t\t\t// Remove connections to old nodes (if there are any)\n\t\t\tarray.forEach(this._connections || [], function(nested){\n\t\t\t\tarray.forEach(nested, function(handle){ handle.remove(); });\n\t\t\t}, this);\n\n\t\t\t// Make array of id's to connect to, excluding entries for nodes that don't exist yet, see startup()\n\t\t\tthis._connectIds = array.filter(lang.isArrayLike(newId) ? newId : (newId ? [newId] : []),\n\t\t\t\t\tfunction(id){ return dom.byId(id, this.ownerDocument); }, this);\n\n\t\t\t// Make connections\n\t\t\tthis._connections = array.map(this._connectIds, function(id){\n\t\t\t\tvar node = dom.byId(id, this.ownerDocument),\n\t\t\t\t\tselector = this.selector,\n\t\t\t\t\tdelegatedEvent = selector ?\n\t\t\t\t\t\tfunction(eventType){ return on.selector(selector, eventType); } :\n\t\t\t\t\t\tfunction(eventType){ return eventType; },\n\t\t\t\t\tself = this;\n\t\t\t\treturn [\n\t\t\t\t\ton(node, delegatedEvent(mouse.enter), function(){\n\t\t\t\t\t\tself._onHover(this);\n\t\t\t\t\t}),\n\t\t\t\t\ton(node, delegatedEvent(\"focusin\"), function(){\n\t\t\t\t\t\tself._onHover(this);\n\t\t\t\t\t}),\n\t\t\t\t\ton(node, delegatedEvent(mouse.leave), lang.hitch(self, \"_onUnHover\")),\n\t\t\t\t\ton(node, delegatedEvent(\"focusout\"), lang.hitch(self, \"set\", \"state\", DORMANT))\n\t\t\t\t];\n\t\t\t}, this);\n\n\t\t\tthis._set(\"connectId\", newId);\n\t\t},\n\n\t\taddTarget: function(/*DomNode|String*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tAttach tooltip to specified node if it's not already connected\n\n\t\t\t// TODO: remove in 2.0 and just use set(\"connectId\", ...) interface\n\n\t\t\tvar id = node.id || node;\n\t\t\tif(array.indexOf(this._connectIds, id) == -1){\n\t\t\t\tthis.set(\"connectId\", this._connectIds.concat(id));\n\t\t\t}\n\t\t},\n\n\t\tremoveTarget: function(/*DomNode|String*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tDetach tooltip from specified node\n\n\t\t\t// TODO: remove in 2.0 and just use set(\"connectId\", ...) interface\n\n\t\t\tvar id = node.id || node,\t// map from DOMNode back to plain id string\n\t\t\t\tidx = array.indexOf(this._connectIds, id);\n\t\t\tif(idx >= 0){\n\t\t\t\t// remove id (modifies original this._connectIds but that's OK in this case)\n\t\t\t\tthis._connectIds.splice(idx, 1);\n\t\t\t\tthis.set(\"connectId\", this._connectIds);\n\t\t\t}\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tdomClass.add(this.domNode,\"dijitTooltipData\");\n\t\t},\n\n\t\tstartup: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// If this tooltip was created in a template, or for some other reason the specified connectId[s]\n\t\t\t// didn't exist during the widget's initialization, then connect now.\n\t\t\tvar ids = this.connectId;\n\t\t\tarray.forEach(lang.isArrayLike(ids) ? ids : [ids], this.addTarget, this);\n\t\t},\n\n\t\tgetContent: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tUser overridable function that return the text to display in the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t\treturn this.label || this.domNode.innerHTML;\n\t\t},\n\n\t\t// state: [private readonly] String\n\t\t//\t\tOne of:\n\t\t//\n\t\t//\t\t- DORMANT: tooltip not SHOWING\n\t\t//\t\t- SHOW TIMER: tooltip not SHOWING but timer set to show it\n\t\t//\t\t- SHOWING: tooltip displayed\n\t\t//\t\t- HIDE TIMER: tooltip displayed, but timer set to hide it\n\t\tstate: DORMANT,\n\t\t_setStateAttr: function(val){\n\t\t\tif(this.state == val ||\n\t\t\t\t(val == SHOW_TIMER && this.state == SHOWING) ||\n\t\t\t\t(val == HIDE_TIMER && this.state == DORMANT)){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this._hideTimer){\n\t\t\t\tthis._hideTimer.remove();\n\t\t\t\tdelete this._hideTimer;\n\t\t\t}\n\t\t\tif(this._showTimer){\n\t\t\t\tthis._showTimer.remove();\n\t\t\t\tdelete this._showTimer;\n\t\t\t}\n\n\t\t\tswitch(val){\n\t\t\t\tcase DORMANT:\n\t\t\t\t\tif(this._connectNode){\n\t\t\t\t\t\tTooltip.hide(this._connectNode);\n\t\t\t\t\t\tdelete this._connectNode;\n\t\t\t\t\t\tthis.onHide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SHOW_TIMER:\t // set timer to show tooltip\n\t\t\t\t\t// should only get here from a DORMANT state, i.e. tooltip can't be already SHOWING\n\t\t\t\t\tif(this.state != SHOWING){\n\t\t\t\t\t\tthis._showTimer = this.defer(function(){ this.set(\"state\", SHOWING); }, this.showDelay);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SHOWING:\t\t// show tooltip and clear timers\n\t\t\t\t\tvar content = this.getContent(this._connectNode);\n\t\t\t\t\tif(!content){\n\t\t\t\t\t\tthis.set(\"state\", DORMANT);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Show tooltip and setup callbacks for mouseenter/mouseleave of tooltip itself\n\t\t\t\t\tTooltip.show(content, this._connectNode, this.position, !this.isLeftToRight(), this.textDir,\n\t\t\t\t\t\tlang.hitch(this, \"set\", \"state\", SHOWING), lang.hitch(this, \"set\", \"state\", HIDE_TIMER));\n\n\t\t\t\t\tthis.onShow(this._connectNode, this.position);\n\t\t\t\t\tbreak;\n\t\t\t\tcase HIDE_TIMER:\t// set timer set to hide tooltip\n\t\t\t\t\tthis._hideTimer = this.defer(function(){ this.set(\"state\", DORMANT); }, this.hideDelay);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._set(\"state\", val);\n\t\t},\n\n\t\t_onHover: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tDespite the name of this method, it actually handles both hover and focus\n\t\t\t//\t\tevents on the target node, setting a timer to show the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tif(this._connectNode && target != this._connectNode){\n\t\t\t\t// Tooltip is displaying for another node\n\t\t\t\tthis.set(\"state\", DORMANT);\n\t\t\t}\n\t\t\tthis._connectNode = target;\t\t// _connectNode means \"tooltip currently displayed for this node\"\n\n\t\t\tthis.set(\"state\", SHOW_TIMER);\t// no-op if show-timer already set, or if already showing\n\t\t},\n\n\t\t_onUnHover: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tHandles mouseleave event on the target node, hiding the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", HIDE_TIMER);\t\t// no-op if already dormant, or if hide-timer already set\n\t\t},\n\n\t\t// open() and close() aren't used anymore, except from the _BidiSupport/misc/Tooltip test.\n\t\t// Should probably remove for 2.0, but leaving for now.\n\t\topen: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tDisplay the tooltip; usually not called directly.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", DORMANT);\n\t\t\tthis._connectNode = target;\t\t// _connectNode means \"tooltip currently displayed for this node\"\n\t\t\tthis.set(\"state\", SHOWING);\n\t\t},\n\n\t\tclose: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHide the tooltip or cancel timer for show of tooltip\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", DORMANT);\n\t\t},\n\n\t\tonShow: function(/*===== target, position =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the tooltip is shown\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonHide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the tooltip is hidden\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tthis.set(\"state\", DORMANT);\n\n\t\t\t// Remove connections manually since they aren't registered to be removed by _WidgetBase\n\t\t\tarray.forEach(this._connections || [], function(nested){\n\t\t\t\tarray.forEach(nested, function(handle){ handle.remove(); });\n\t\t\t}, this);\n\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\tTooltip._MasterTooltip = MasterTooltip;\t\t// for monkey patching\n\tTooltip.show = dijit.showTooltip;\t\t// export function through module return value\n\tTooltip.hide = dijit.hideTooltip;\t\t// export function through module return value\n\n\tTooltip.defaultPosition = [\"after-centered\", \"before-centered\"];\n\n\t/*=====\n\tlang.mixin(Tooltip, {\n\t\t // defaultPosition: String[]\n\t\t //\t\tThis variable controls the position of tooltips, if the position is not specified to\n\t\t //\t\tthe Tooltip widget or *TextBox widget itself.  It's an array of strings with the values\n\t\t //\t\tpossible for `dijit/place.around()`.   The recommended values are:\n\t\t //\n\t\t //\t\t- before-centered: centers tooltip to the left of the anchor node/widget, or to the right\n\t\t //\t\t  in the case of RTL scripts like Hebrew and Arabic\n\t\t //\t\t- after-centered: centers tooltip to the right of the anchor node/widget, or to the left\n\t\t //\t\t  in the case of RTL scripts like Hebrew and Arabic\n\t\t //\t\t- above-centered: tooltip is centered above anchor node\n\t\t //\t\t- below-centered: tooltip is centered above anchor node\n\t\t //\n\t\t //\t\tThe list is positions is tried, in order, until a position is found where the tooltip fits\n\t\t //\t\twithin the viewport.\n\t\t //\n\t\t //\t\tBe careful setting this parameter.  A value of \"above-centered\" may work fine until the user scrolls\n\t\t //\t\tthe screen so that there's no room above the target node.   Nodes with drop downs, like\n\t\t //\t\tDropDownButton or FilteringSelect, are especially problematic, in that you need to be sure\n\t\t //\t\tthat the drop down and tooltip don't overlap, even when the viewport is scrolled so that there\n\t\t //\t\tis only room below (or above) the target node, but not both.\n\t });\n\t=====*/\n\treturn Tooltip;\n});\n","define([\n\t\"dojo/Evented\",\n\t\"dojo/on\",\n\t\"dojo/domReady\",\n\t\"dojo/sniff\",\t// has(\"ie\"), has(\"ios\")\n\t\"dojo/window\" // getBox()\n], function(Evented, on, domReady, has, winUtils){\n\n\t// module:\n\t//\t\tdijit/Viewport\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tUtility singleton to watch for viewport resizes, avoiding duplicate notifications\n\t\t//\t\twhich can lead to infinite loops.\n\t\t// description:\n\t\t//\t\tUsage: Viewport.on(\"resize\", myCallback).\n\t\t//\n\t\t//\t\tmyCallback() is called without arguments in case it's _WidgetBase.resize(),\n\t\t//\t\twhich would interpret the argument as the size to make the widget.\n\t};\n\t=====*/\n\n\tvar Viewport = new Evented();\n\n\tvar focusedNode;\n\n\tdomReady(function(){\n\t\tvar oldBox = winUtils.getBox();\n\t\tViewport._rlh = on(window, \"resize\", function(){\n\t\t\tvar newBox = winUtils.getBox();\n\t\t\tif(oldBox.h == newBox.h && oldBox.w == newBox.w){ return; }\n\t\t\toldBox = newBox;\n\t\t\tViewport.emit(\"resize\");\n\t\t});\n\n\t\t// Also catch zoom changes on IE8, since they don't naturally generate resize events\n\t\tif(has(\"ie\") == 8){\n\t\t\tvar deviceXDPI = screen.deviceXDPI;\n\t\t\tsetInterval(function(){\n\t\t\t\tif(screen.deviceXDPI != deviceXDPI){\n\t\t\t\t\tdeviceXDPI = screen.deviceXDPI;\n\t\t\t\t\tViewport.emit(\"resize\");\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t}\n\n\t\t// On iOS, keep track of the focused node so we can guess when the keyboard is/isn't being displayed.\n\t\tif(has(\"ios\")){\n\t\t\ton(document, \"focusin\", function(evt){\n\t\t\t\tfocusedNode = evt.target;\n\t\t\t});\n\t\t\ton(document, \"focusout\", function(evt){\n\t\t\t\tfocusedNode = null;\n\t\t\t});\n\t\t}\n\t});\n\n\tViewport.getEffectiveBox = function(/*Document*/ doc){\n\t\t// summary:\n\t\t//\t\tGet the size of the viewport, or on mobile devices, the part of the viewport not obscured by the\n\t\t//\t\tvirtual keyboard.\n\n\t\tvar box = winUtils.getBox(doc);\n\n\t\t// Account for iOS virtual keyboard, if it's being shown.  Unfortunately no direct way to check or measure.\n\t\tvar tag = focusedNode && focusedNode.tagName && focusedNode.tagName.toLowerCase();\n\t\tif(has(\"ios\") && focusedNode && !focusedNode.readOnly && (tag == \"textarea\" || (tag == \"input\" &&\n\t\t\t/^(color|email|number|password|search|tel|text|url)$/.test(focusedNode.type)))){\n\n\t\t\t// Box represents the size of the viewport.  Some of the viewport is likely covered by the keyboard.\n\t\t\t// Estimate height of visible viewport assuming viewport goes to bottom of screen, but is covered by keyboard.\n\t\t\tbox.h *= (orientation == 0 || orientation == 180 ? 0.66 : 0.40);\n\n\t\t\t// Above measurement will be inaccurate if viewport was scrolled up so far that it ends before the bottom\n\t\t\t// of the screen.   In this case, keyboard isn't covering as much of the viewport as we thought.\n\t\t\t// We know the visible size is at least the distance from the top of the viewport to the focused node.\n\t\t\tvar rect = focusedNode.getBoundingClientRect();\n\t\t\tbox.h = Math.max(box.h, rect.top + rect.height);\n\t\t}\n\n\t\treturn box;\n\t};\n\n\treturn Viewport;\n});\n","define([\n\t\"require\",\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/_base/connect\",\t// remove for 2.0\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/lang\", // lang.getObject\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/touch\",\n\t\"./_WidgetBase\"\n], function(require, array, connect, declare, lang, mouse, on, touch, _WidgetBase){\n\n\t// module:\n\t//\t\tdijit/_AttachMixin\n\n\t// Map from string name like \"mouseenter\" to synthetic event like mouse.enter\n\tvar synthEvents = lang.delegate(touch, {\n\t\t\"mouseenter\": mouse.enter,\n\t\t\"mouseleave\": mouse.leave,\n\t\t\"keypress\": connect._keypress\t// remove for 2.0\n\t});\n\n\t// To be lightweight, _AttachMixin doesn't require() dijit/a11yclick.\n\t// If the subclass has a template using \"ondijitclick\", it must load dijit/a11yclick itself.\n\t// In that case, the a11yclick variable below will get set to point to that synthetic event.\n\tvar a11yclick;\n\n\tvar _AttachMixin = declare(\"dijit._AttachMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets to attach to dom nodes and setup events via\n\t\t//\t\tconvenient data-dojo-attach-point and data-dojo-attach-event DOM attributes.\n\t\t//\n\t\t//\t\tSuperclass of _TemplatedMixin, and can also be used standalone when templates are pre-rendered on the\n\t\t//\t\tserver.\n\t\t//\n\t\t//\t\tDoes not [yet] handle widgets like ContentPane with this.containerNode set.   It should skip\n\t\t//\t\tscanning for data-dojo-attach-point and data-dojo-attach-event inside this.containerNode, but it\n\t\t//\t\tdoesn't.\n\n/*=====\n\t\t// _attachPoints: [private] String[]\n\t\t//\t\tList of widget attribute names associated with data-dojo-attach-point=... in the\n\t\t//\t\ttemplate, ex: [\"containerNode\", \"labelNode\"]\n\t\t_attachPoints: [],\n\n\t\t// _attachEvents: [private] Handle[]\n\t\t//\t\tList of connections associated with data-dojo-attach-event=... in the\n\t\t//\t\ttemplate\n\t\t_attachEvents: [],\n\n\t\t// attachScope: [public] Object\n\t\t//\t\tObject to which attach points and events will be scoped.  Defaults\n\t\t//\t\tto 'this'.\n\t\tattachScope: undefined,\n\n\t\t// searchContainerNode: [protected] Boolean\n\t\t//\t\tSearch descendants of this.containerNode for data-dojo-attach-point and data-dojo-attach-event.\n\t\t//\t\tShould generally be left false (the default value) both for performance and to avoid failures when\n\t\t//\t\tthis.containerNode holds other _AttachMixin instances with their own attach points and events.\n \t\tsearchContainerNode: false,\n =====*/\n\n\t\tconstructor: function(/*===== params, srcNodeRef =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCreate the widget.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.\n\n\t\t\tthis._attachPoints = [];\n\t\t\tthis._attachEvents = [];\n\t\t},\n\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tAttach to DOM nodes marked with special attributes.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// recurse through the node, looking for, and attaching to, our\n\t\t\t// attachment points and events, which should be defined on the template node.\n\t\t\tthis._attachTemplateNodes(this.domNode);\n\n\t\t\tthis._beforeFillContent();\t\t// hook for _WidgetsInTemplateMixin\n\t\t},\n\n\t\t_beforeFillContent: function(){\n\t\t},\n\n\t\t_attachTemplateNodes: function(rootNode){\n\t\t\t// summary:\n\t\t\t//\t\tIterate through the dom nodes and attach functions and nodes accordingly.\n\t\t\t// description:\n\t\t\t//\t\tMap widget properties and functions to the handlers specified in\n\t\t\t//\t\tthe dom node and it's descendants. This function iterates over all\n\t\t\t//\t\tnodes and looks for these properties:\n\t\t\t//\n\t\t\t//\t\t- dojoAttachPoint/data-dojo-attach-point\n\t\t\t//\t\t- dojoAttachEvent/data-dojo-attach-event\n\t\t\t// rootNode: DomNode\n\t\t\t//\t\tThe node to search for properties. All descendants will be searched.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// DFS to process all nodes except those inside of this.containerNode\n\t\t\tvar node = rootNode;\n\t\t\twhile(true){\n\t\t\t\tif(node.nodeType == 1 && (this._processTemplateNode(node, function(n,p){ return n.getAttribute(p); },\n\t\t\t\t\t\tthis._attach) || this.searchContainerNode) && node.firstChild){\n\t\t\t\t\tnode = node.firstChild;\n\t\t\t\t}else{\n\t\t\t\t\tif(node == rootNode){ return; }\n\t\t\t\t\twhile(!node.nextSibling){\n\t\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t\t\tif(node == rootNode){ return; }\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){\n\t\t\t// summary:\n\t\t\t//\t\tProcess data-dojo-attach-point and data-dojo-attach-event for given node or widget.\n\t\t\t//\t\tReturns true if caller should process baseNode's children too.\n\n\t\t\tvar ret = true;\n\n\t\t\t// Process data-dojo-attach-point\n\t\t\tvar _attachScope = this.attachScope || this,\n\t\t\t\tattachPoint = getAttrFunc(baseNode, \"dojoAttachPoint\") || getAttrFunc(baseNode, \"data-dojo-attach-point\");\n\t\t\tif(attachPoint){\n\t\t\t\tvar point, points = attachPoint.split(/\\s*,\\s*/);\n\t\t\t\twhile((point = points.shift())){\n\t\t\t\t\tif(lang.isArray(_attachScope[point])){\n\t\t\t\t\t\t_attachScope[point].push(baseNode);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t_attachScope[point] = baseNode;\n\t\t\t\t\t}\n\t\t\t\t\tret = (point != \"containerNode\");\n\t\t\t\t\tthis._attachPoints.push(point);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process data-dojo-attach-event\n\t\t\tvar attachEvent = getAttrFunc(baseNode, \"dojoAttachEvent\") || getAttrFunc(baseNode, \"data-dojo-attach-event\");\n\t\t\tif(attachEvent){\n\t\t\t\t// NOTE: we want to support attributes that have the form\n\t\t\t\t// \"domEvent: nativeEvent, ...\"\n\t\t\t\tvar event, events = attachEvent.split(/\\s*,\\s*/);\n\t\t\t\tvar trim = lang.trim;\n\t\t\t\twhile((event = events.shift())){\n\t\t\t\t\tif(event){\n\t\t\t\t\t\tvar thisFunc = null;\n\t\t\t\t\t\tif(event.indexOf(\":\") != -1){\n\t\t\t\t\t\t\t// oh, if only JS had tuple assignment\n\t\t\t\t\t\t\tvar funcNameArr = event.split(\":\");\n\t\t\t\t\t\t\tevent = trim(funcNameArr[0]);\n\t\t\t\t\t\t\tthisFunc = trim(funcNameArr[1]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tevent = trim(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!thisFunc){\n\t\t\t\t\t\t\tthisFunc = event;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._attachEvents.push(attachFunc(baseNode, event, lang.hitch(_attachScope, thisFunc)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t},\n\n\t\t_attach: function(node, type, func){\n\t\t\t// summary:\n\t\t\t//\t\tRoughly corresponding to dojo/on, this is the default function for processing a\n\t\t\t//\t\tdata-dojo-attach-event.  Meant to attach to DOMNodes, not to widgets.\n\t\t\t// node: DOMNode\n\t\t\t//\t\tThe node to setup a listener on.\n\t\t\t// type: String\n\t\t\t//\t\tEvent name like \"click\".\n\t\t\t// getAttrFunc: Function\n\t\t\t//\t\tFunction to get the specified property for a given DomNode/Widget.\n\t\t\t// attachFunc: Function?\n\t\t\t//\t\tAttaches an event handler from the specified node/widget to specified function.\n\n\t\t\t// Map special type names like \"mouseenter\" to synthetic events.\n\t\t\t// Subclasses are responsible to require() dijit/a11yclick if they want to use it.\n\t\t\ttype = type.replace(/^on/, \"\").toLowerCase();\n\t\t\tif(type == \"dijitclick\"){\n\t\t\t\ttype = a11yclick || (a11yclick = require(\"./a11yclick\"));\n\t\t\t}else{\n\t\t\t\ttype = synthEvents[type] || type;\n\t\t\t}\n\n\t\t\treturn on(node, type, func);\n\t\t},\n\n\t\t_detachTemplateNodes: function() {\n\t\t\t// summary:\n\t\t\t//\t\tDetach and clean up the attachments made in _attachtempalteNodes.\n\n\t\t\t// Delete all attach points to prevent IE6 memory leaks.\n\t\t\tvar _attachScope = this.attachScope || this;\n\t\t\tarray.forEach(this._attachPoints, function(point){\n\t\t\t\tdelete _attachScope[point];\n\t\t\t});\n\t\t\tthis._attachPoints = [];\n\n\t\t\t// And same for event handlers\n\t\t\tarray.forEach(this._attachEvents, function(handle){ handle.remove(); });\n\t\t\tthis._attachEvents = [];\n\t\t},\n\n\t\tdestroyRendering: function(){\n\t\t\tthis._detachTemplateNodes();\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\t// These arguments can be specified for widgets which are used in templates.\n\t// Since any widget can be specified as sub widgets in template, mix it\n\t// into the base widget class.  (This is a hack, but it's effective.).\n\t// Remove for 2.0.   Also, hide from API doc parser.\n\tlang.extend(_WidgetBase, /*===== {} || =====*/ {\n\t\tdojoAttachEvent: \"\",\n\t\tdojoAttachPoint: \"\"\n\t});\n\t\n\treturn _AttachMixin;\n});\n","define([], function(){\n\n\t// module:\n\t//\t\tdijit/_BidiMixin\n\n\t// UCC - constants that will be used by bidi support.\n\tvar bidi_const = {\n\t\tLRM : '\\u200E',\n\t\tLRE : '\\u202A',\n\t\tPDF : '\\u202C',\n\t\tRLM : '\\u200f',\n\t\tRLE : '\\u202B'\n\t};\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tWhen has(\"dojo-bidi\") is true, _WidgetBase will mixin this class.   It enables support for the textdir\n\t\t//\t\tproperty to control text direction independently from the GUI direction.\n\t\t// description:\n\t\t//\t\tThere's a special need for displaying BIDI text in rtl direction\n\t\t//\t\tin ltr GUI, sometimes needed auto support.\n\t\t//\t\tIn creation of widget, if it's want to activate this class,\n\t\t//\t\tthe widget should define the \"textDir\".\n\n\t\tgetTextDir: function(/*String*/ text){\n\t\t\t// summary:\n\t\t\t//\t\tGets the right direction of text.\n\t\t\t// description:\n\t\t\t//\t\tIf textDir is ltr or rtl returns the value.\n\t\t\t//\t\tIf it's auto, calls to another function that responsible\n\t\t\t//\t\tfor checking the value, and defining the direction.\n\t\t\t// tags:\n\t\t\t//\t\tprotected.\n\t\t\treturn this.textDir == \"auto\" ? this._checkContextual(text) : this.textDir;\n\t\t},\n\n\t\t_checkContextual: function(text){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the first strong (directional) character, return ltr if isLatin\n\t\t\t//\t\tor rtl if isBidiChar.\n\t\t\t// tags:\n\t\t\t//\t\tprivate.\n\n\t\t\t// look for strong (directional) characters\n\t\t\tvar fdc = /[A-Za-z\\u05d0-\\u065f\\u066a-\\u06ef\\u06fa-\\u07ff\\ufb1d-\\ufdff\\ufe70-\\ufefc]/.exec(text);\n\t\t\t// if found return the direction that defined by the character, else return widgets dir as defult.\n\t\t\treturn fdc ? ( fdc[0] <= 'z' ? \"ltr\" : \"rtl\" ) : this.dir ? this.dir : this.isLeftToRight() ? \"ltr\" : \"rtl\";\n\t\t},\n\n\t\tapplyTextDir: function(/*DOMNode*/ element, /*String?*/ text){\n\t\t\t// summary:\n\t\t\t//\t\tSet element.dir according to this.textDir, assuming this.textDir has a value.\n\t\t\t// element:\n\t\t\t//\t\tThe text element to be set. Should have dir property.\n\t\t\t// text:\n\t\t\t//\t\tIf specified, and this.textDir is \"auto\", for calculating the right transformation\n\t\t\t//\t\tOtherwise text read from element.\n\t\t\t// description:\n\t\t\t//\t\tIf textDir is ltr or rtl returns the value.\n\t\t\t//\t\tIf it's auto, calls to another function that responsible\n\t\t\t//\t\tfor checking the value, and defining the direction.\n\t\t\t// tags:\n\t\t\t//\t\tprotected.\n\n\t\t\tif(this.textDir){\n\t\t\t\tvar textDir = this.textDir;\n\t\t\t\tif(textDir == \"auto\"){\n\t\t\t\t\t// convert \"auto\" to either \"ltr\" or \"rtl\"\n\t\t\t\t\tif(typeof text === \"undefined\"){\n\t\t\t\t\t\t// text not specified, get text from element\n\t\t\t\t\t\tvar tagName = element.tagName.toLowerCase();\n\t\t\t\t\t\ttext = (tagName == \"input\" || tagName == \"textarea\") ? element.value :\n\t\t\t\t\t\t\telement.innerText || element.textContent || \"\";\n\t\t\t\t\t}\n\t\t\t\t\ttextDir = this._checkContextual(text);\n\t\t\t\t}\n\n\t\t\t\tif(element.dir != textDir){\n\t\t\t\t\t// set element's dir to match textDir, but not when textDir is null and not when it already matches\n\t\t\t\t\telement.dir = textDir;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tenforceTextDirWithUcc: function(option, text){\n\t\t\t// summary:\n\t\t\t//\t\tWraps by UCC (Unicode control characters) option's text according to this.textDir\n\t\t\t// option:\n\t\t\t//\t\tThe element (`<option>`) we wrapping the text for.\n\t\t\t// text:\n\t\t\t//\t\tThe text to be wrapped.\n\t\t\t// description:\n\t\t\t//\t\tThere's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`)\n\t\t\t//\t\tdefining the dir in different direction then the GUI orientation, won't display correctly.\n\t\t\t//\t\tFF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text\n\t\t\t//\t\tshould be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`.\n\t\t\t//\t\tTherefore the only solution is to use UCC (Unicode  control characters) to display the text in correct orientation.\n\t\t\t//\t\tThis function saves the original text value for later restoration if needed, for example if the textDir will change etc.\n\t\t\tif(this.textDir){\n\t\t\t\tif(option){\n\t\t\t\t\toption.originalText = text;\n\t\t\t\t}\n\t\t\t\tvar dir = this.textDir == \"auto\" ? this._checkContextual(text) : this.textDir;\n\t\t\t\treturn (dir == \"ltr\" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF;\n\t\t\t}\n\t\t\treturn text;\n\t\t},\n\n\t\trestoreOriginalText: function(origObj){\n\t\t\t// summary:\n\t\t\t//\t\tRestores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set(\"textDir\", textDir).\n\t\t\t// origObj:\n\t\t\t//\t\tThe element (`<option>`) to restore.\n\t\t\t// description:\n\t\t\t//\t\tSets the text of origObj to origObj.originalText, which is the original text, without the UCCs.\n\t\t\t//\t\tThe function than removes the originalText from origObj!\n\t\t\tif(origObj.originalText){\n\t\t\t\torigObj.text = origObj.originalText;\n\t\t\t\tdelete origObj.originalText;\n\t\t\t}\n\t\t\treturn origObj;\n\t\t},\n\n\t\t_setTextDirAttr: function(/*String*/ textDir){\n\t\t\t// summary:\n\t\t\t//\t\tSetter for textDir.\n\t\t\t// description:\n\t\t\t//\t\tUsers shouldn't call this function; they should be calling\n\t\t\t//\t\tset('textDir', value)\n\t\t\tif(!this._created || this.textDir != textDir){\n\t\t\t\tthis._set(\"textDir\", textDir);\n\t\t\t\tvar node = null;\n\t\t\t\tif(this.displayNode){\n\t\t\t\t\tnode = this.displayNode;\n\t\t\t\t\tthis.displayNode.align = this.dir == \"rtl\" ? \"right\" : \"left\";\n\t\t\t\t}else{\n\t\t\t\t\tnode = this.textDirNode || this.focusNode || this.textbox;\n\t\t\t\t}\n\t\t\t\tif(node){\n\t\t\t\t\tthis.applyTextDir(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.indexOf\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-construct\", // domConstruct.place\n\t\"dojo/_base/kernel\" // kernel.deprecated\n], function(array, declare, domConstruct, kernel){\n\n\t// module:\n\t//\t\tdijit/_Container\n\n\treturn declare(\"dijit._Container\", null, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets that contain HTML and/or a set of widget children.\n\n\t\tbuildRendering: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tif(!this.containerNode){\n\t\t\t\t// All widgets with descendants must set containerNode.\n\t\t\t\t// NB: this code doesn't quite work right because for TabContainer it runs before\n\t\t\t\t// _TemplatedMixin::buildRendering(), and thus\n\t\t\t\t// sets this.containerNode to this.domNode, later to be overridden by the assignment in the template.\n\t\t\t\tthis.containerNode = this.domNode;\n\t\t\t}\n\t\t},\n\n\t\taddChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){\n\t\t\t// summary:\n\t\t\t//\t\tMakes the given widget a child of this widget.\n\t\t\t// description:\n\t\t\t//\t\tInserts specified child widget's dom node as a child of this widget's\n\t\t\t//\t\tcontainer node, and possibly does other processing (such as layout).\n\n\t\t\t// I want to just call domConstruct.place(widget.domNode, this.containerNode, insertIndex), but the counting\n\t\t\t// is thrown off by text nodes and comment nodes that show up when constructed by markup.\n\t\t\t// In the future consider stripping those nodes on construction, either in the parser or this widget code.\n\t\t\tvar refNode = this.containerNode;\n\t\t\tif(insertIndex > 0){\n\t\t\t\t// Old-school way to get nth child; dojo.query would be easier but _Container was weened from dojo.query\n\t\t\t\t// in #10087 to minimize download size.   Not sure if that's still and issue with new smaller dojo/query.\n\t\t\t\trefNode = refNode.firstChild;\n\t\t\t\twhile(insertIndex > 0){\n\t\t\t\t\tif(refNode.nodeType == 1){ insertIndex--; }\n\t\t\t\t\trefNode = refNode.nextSibling;\n\t\t\t\t}\n\t\t\t\tif(refNode){\n\t\t\t\t\tinsertIndex = \"before\";\n\t\t\t\t}else{\n\t\t\t\t\t// to support addChild(child, n-1) where there are n children (should add child at end)\n\t\t\t\t\trefNode = this.containerNode;\n\t\t\t\t\tinsertIndex = \"last\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdomConstruct.place(widget.domNode, refNode, insertIndex);\n\n\t\t\t// If I've been started but the child widget hasn't been started,\n\t\t\t// start it now.  Make sure to do this after widget has been\n\t\t\t// inserted into the DOM tree, so it can see that it's being controlled by me,\n\t\t\t// so it doesn't try to size itself.\n\t\t\tif(this._started && !widget._started){\n\t\t\t\twidget.startup();\n\t\t\t}\n\t\t},\n\n\t\tremoveChild: function(/*Widget|int*/ widget){\n\t\t\t// summary:\n\t\t\t//\t\tRemoves the passed widget instance from this widget but does\n\t\t\t//\t\tnot destroy it.  You can also pass in an integer indicating\n\t\t\t//\t\tthe index within the container to remove (ie, removeChild(5) removes the sixth widget).\n\n\t\t\tif(typeof widget == \"number\"){\n\t\t\t\twidget = this.getChildren()[widget];\n\t\t\t}\n\n\t\t\tif(widget){\n\t\t\t\tvar node = widget.domNode;\n\t\t\t\tif(node && node.parentNode){\n\t\t\t\t\tnode.parentNode.removeChild(node); // detach but don't destroy\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thasChildren: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if widget has child widgets, i.e. if this.containerNode contains widgets.\n\t\t\treturn this.getChildren().length > 0;\t// Boolean\n\t\t},\n\n\t\t_getSiblingOfChild: function(/*dijit/_WidgetBase*/ child, /*int*/ dir){\n\t\t\t// summary:\n\t\t\t//\t\tGet the next or previous widget sibling of child\n\t\t\t// dir:\n\t\t\t//\t\tif 1, get the next sibling\n\t\t\t//\t\tif -1, get the previous sibling\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\t\t\tvar children = this.getChildren(),\n\t\t\t\tidx = array.indexOf(children, child);\t// int\n\t\t\treturn children[idx + dir];\n\t\t},\n\n\t\tgetIndexOfChild: function(/*dijit/_WidgetBase*/ child){\n\t\t\t// summary:\n\t\t\t//\t\tGets the index of the child in this container or -1 if not found\n\t\t\treturn array.indexOf(this.getChildren(), child);\t// int\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // dom.isDescendant()\n\t\"dojo/dom-class\", // domClass.toggle\n\t\"dojo/has\",\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/on\",\n\t\"dojo/domReady\",\n\t\"dojo/touch\",\n\t\"dojo/_base/window\", // win.body\n\t\"./a11yclick\",\n\t\"./registry\"\n], function(array, declare, dom, domClass, has, lang, on, domReady, touch, win, a11yclick, registry){\n\n\t// module:\n\t//\t\tdijit/_CssStateMixin\n\n\tvar CssStateMixin = declare(\"dijit._CssStateMixin\", [], {\n\t\t// summary:\n\t\t//\t\tMixin for widgets to set CSS classes on the widget DOM nodes depending on hover/mouse press/focus\n\t\t//\t\tstate changes, and also higher-level state changes such becoming disabled or selected.\n\t\t//\n\t\t// description:\n\t\t//\t\tBy mixing this class into your widget, and setting the this.baseClass attribute, it will automatically\n\t\t//\t\tmaintain CSS classes on the widget root node (this.domNode) depending on hover,\n\t\t//\t\tactive, focus, etc. state.   Ex: with a baseClass of dijitButton, it will apply the classes\n\t\t//\t\tdijitButtonHovered and dijitButtonActive, as the user moves the mouse over the widget and clicks it.\n\t\t//\n\t\t//\t\tIt also sets CSS like dijitButtonDisabled based on widget semantic state.\n\t\t//\n\t\t//\t\tBy setting the cssStateNodes attribute, a widget can also track events on subnodes (like buttons\n\t\t//\t\twithin the widget).\n\n\t\t/*=====\n\t\t // cssStateNodes: [protected] Object\n\t\t //\t\tSubclasses may define a cssStateNodes property that lists sub-nodes within the widget that\n\t\t //\t\tneed CSS classes applied on mouse hover/press and focus.\n\t\t //\n\t\t //\t\tEach entry in this optional hash is a an attach-point name (like \"upArrowButton\") mapped to a CSS class name\n\t\t //\t\t(like \"dijitUpArrowButton\"). Example:\n\t\t //\t|\t\t{\n\t\t //\t|\t\t\t\"upArrowButton\": \"dijitUpArrowButton\",\n\t\t //\t|\t\t\t\"downArrowButton\": \"dijitDownArrowButton\"\n\t\t //\t|\t\t}\n\t\t //\t\tThe above will set the CSS class dijitUpArrowButton to the this.upArrowButton DOMNode when it\n\t\t //\t\tis hovered, etc.\n\t\t cssStateNodes: {},\n\t\t =====*/\n\n\t\t// hovering: [readonly] Boolean\n\t\t//\t\tTrue if cursor is over this widget\n\t\thovering: false,\n\n\t\t// active: [readonly] Boolean\n\t\t//\t\tTrue if mouse was pressed while over this widget, and hasn't been released yet\n\t\tactive: false,\n\n\t\t_applyAttributes: function(){\n\t\t\t// This code would typically be in postCreate(), but putting in _applyAttributes() for\n\t\t\t// performance: so the class changes happen before DOM is inserted into the document.\n\t\t\t// Change back to postCreate() in 2.0.  See #11635.\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node\n\t\t\tarray.forEach([\"disabled\", \"readOnly\", \"checked\", \"selected\", \"focused\", \"state\", \"hovering\", \"active\", \"_opened\"], function(attr){\n\t\t\t\tthis.watch(attr, lang.hitch(this, \"_setStateClass\"));\n\t\t\t}, this);\n\n\t\t\t// Track hover and active mouse events on widget root node, plus possibly on subnodes\n\t\t\tfor(var ap in this.cssStateNodes || {}){\n\t\t\t\tthis._trackMouseState(this[ap], this.cssStateNodes[ap]);\n\t\t\t}\n\t\t\tthis._trackMouseState(this.domNode, this.baseClass);\n\n\t\t\t// Set state initially; there's probably no hover/active/focus state but widget might be\n\t\t\t// disabled/readonly/checked/selected so we want to set CSS classes for those conditions.\n\t\t\tthis._setStateClass();\n\t\t},\n\n\t\t_cssMouseEvent: function(/*Event*/ event){\n\t\t\t// summary:\n\t\t\t//\t\tHandler for CSS event on this.domNode. Sets hovering and active properties depending on mouse state,\n\t\t\t//\t\twhich triggers _setStateClass() to set appropriate CSS classes for this.domNode.\n\n\t\t\tif(!this.disabled){\n\t\t\t\tswitch(event.type){\n\t\t\t\t\tcase \"mouseover\":\n\t\t\t\t\tcase \"MSPointerOver\":\n\t\t\t\t\tcase \"pointerover\":\n\t\t\t\t\t\tthis._set(\"hovering\", true);\n\t\t\t\t\t\tthis._set(\"active\", this._mouseDown);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mouseout\":\n\t\t\t\t\tcase \"MSPointerOut\":\n\t\t\t\t\tcase \"pointerout\":\n\t\t\t\t\t\tthis._set(\"hovering\", false);\n\t\t\t\t\t\tthis._set(\"active\", false);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mousedown\":\n\t\t\t\t\tcase \"touchstart\":\n\t\t\t\t\tcase \"MSPointerDown\":\n\t\t\t\t\tcase \"pointerdown\":\n\t\t\t\t\tcase \"keydown\":\n\t\t\t\t\t\tthis._set(\"active\", true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mouseup\":\n\t\t\t\t\tcase \"dojotouchend\":\n\t\t\t\t\tcase \"MSPointerUp\":\n\t\t\t\t\tcase \"pointerup\":\n\t\t\t\t\tcase \"keyup\":\n\t\t\t\t\t\tthis._set(\"active\", false);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_setStateClass: function(){\n\t\t\t// summary:\n\t\t\t//\t\tUpdate the visual state of the widget by setting the css classes on this.domNode\n\t\t\t//\t\t(or this.stateNode if defined) by combining this.baseClass with\n\t\t\t//\t\tvarious suffixes that represent the current widget state(s).\n\t\t\t//\n\t\t\t// description:\n\t\t\t//\t\tIn the case where a widget has multiple\n\t\t\t//\t\tstates, it sets the class based on all possible\n\t\t\t//\t\tcombinations.  For example, an invalid form widget that is being hovered\n\t\t\t//\t\twill be \"dijitInput dijitInputInvalid dijitInputHover dijitInputInvalidHover\".\n\t\t\t//\n\t\t\t//\t\tThe widget may have one or more of the following states, determined\n\t\t\t//\t\tby this.state, this.checked, this.valid, and this.selected:\n\t\t\t//\n\t\t\t//\t\t- Error - ValidationTextBox sets this.state to \"Error\" if the current input value is invalid\n\t\t\t//\t\t- Incomplete - ValidationTextBox sets this.state to \"Incomplete\" if the current input value is not finished yet\n\t\t\t//\t\t- Checked - ex: a checkmark or a ToggleButton in a checked state, will have this.checked==true\n\t\t\t//\t\t- Selected - ex: currently selected tab will have this.selected==true\n\t\t\t//\n\t\t\t//\t\tIn addition, it may have one or more of the following states,\n\t\t\t//\t\tbased on this.disabled and flags set in _onMouse (this.active, this.hovering) and from focus manager (this.focused):\n\t\t\t//\n\t\t\t//\t\t- Disabled\t- if the widget is disabled\n\t\t\t//\t\t- Active\t\t- if the mouse (or space/enter key?) is being pressed down\n\t\t\t//\t\t- Focused\t\t- if the widget has focus\n\t\t\t//\t\t- Hover\t\t- if the mouse is over the widget\n\n\t\t\t// Compute new set of classes\n\t\t\tvar newStateClasses = this.baseClass.split(\" \");\n\n\t\t\tfunction multiply(modifier){\n\t\t\t\tnewStateClasses = newStateClasses.concat(array.map(newStateClasses, function(c){\n\t\t\t\t\treturn c + modifier;\n\t\t\t\t}), \"dijit\" + modifier);\n\t\t\t}\n\n\t\t\tif(!this.isLeftToRight()){\n\t\t\t\t// For RTL mode we need to set an addition class like dijitTextBoxRtl.\n\t\t\t\tmultiply(\"Rtl\");\n\t\t\t}\n\n\t\t\tvar checkedState = this.checked == \"mixed\" ? \"Mixed\" : (this.checked ? \"Checked\" : \"\");\n\t\t\tif(this.checked){\n\t\t\t\tmultiply(checkedState);\n\t\t\t}\n\t\t\tif(this.state){\n\t\t\t\tmultiply(this.state);\n\t\t\t}\n\t\t\tif(this.selected){\n\t\t\t\tmultiply(\"Selected\");\n\t\t\t}\n\t\t\tif(this._opened){\n\t\t\t\tmultiply(\"Opened\");\n\t\t\t}\n\n\t\t\tif(this.disabled){\n\t\t\t\tmultiply(\"Disabled\");\n\t\t\t}else if(this.readOnly){\n\t\t\t\tmultiply(\"ReadOnly\");\n\t\t\t}else{\n\t\t\t\tif(this.active){\n\t\t\t\t\tmultiply(\"Active\");\n\t\t\t\t}else if(this.hovering){\n\t\t\t\t\tmultiply(\"Hover\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(this.focused){\n\t\t\t\tmultiply(\"Focused\");\n\t\t\t}\n\n\t\t\t// Remove old state classes and add new ones.\n\t\t\t// For performance concerns we only write into domNode.className once.\n\t\t\tvar tn = this.stateNode || this.domNode,\n\t\t\t\tclassHash = {};\t// set of all classes (state and otherwise) for node\n\n\t\t\tarray.forEach(tn.className.split(\" \"), function(c){\n\t\t\t\tclassHash[c] = true;\n\t\t\t});\n\n\t\t\tif(\"_stateClasses\" in this){\n\t\t\t\tarray.forEach(this._stateClasses, function(c){\n\t\t\t\t\tdelete classHash[c];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tarray.forEach(newStateClasses, function(c){\n\t\t\t\tclassHash[c] = true;\n\t\t\t});\n\n\t\t\tvar newClasses = [];\n\t\t\tfor(var c in classHash){\n\t\t\t\tnewClasses.push(c);\n\t\t\t}\n\t\t\ttn.className = newClasses.join(\" \");\n\n\t\t\tthis._stateClasses = newStateClasses;\n\t\t},\n\n\t\t_subnodeCssMouseEvent: function(node, clazz, evt){\n\t\t\t// summary:\n\t\t\t//\t\tHandler for hover/active mouse event on widget's subnode\n\t\t\tif(this.disabled || this.readOnly){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfunction hover(isHovering){\n\t\t\t\tdomClass.toggle(node, clazz + \"Hover\", isHovering);\n\t\t\t}\n\n\t\t\tfunction active(isActive){\n\t\t\t\tdomClass.toggle(node, clazz + \"Active\", isActive);\n\t\t\t}\n\n\t\t\tfunction focused(isFocused){\n\t\t\t\tdomClass.toggle(node, clazz + \"Focused\", isFocused);\n\t\t\t}\n\n\t\t\tswitch(evt.type){\n\t\t\t\tcase \"mouseover\":\n\t\t\t\tcase \"MSPointerOver\":\n\t\t\t\tcase \"pointerover\":\n\t\t\t\t\thover(true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"mouseout\":\n\t\t\t\tcase \"MSPointerOut\":\n\t\t\t\tcase \"pointerout\":\n\t\t\t\t\thover(false);\n\t\t\t\t\tactive(false);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"mousedown\":\n\t\t\t\tcase \"touchstart\":\n\t\t\t\tcase \"MSPointerDown\":\n\t\t\t\tcase \"pointerdown\":\n\t\t\t\tcase \"keydown\":\n\t\t\t\t\tactive(true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"mouseup\":\n\t\t\t\tcase \"MSPointerUp\":\n\t\t\t\tcase \"pointerup\":\n\t\t\t\tcase \"dojotouchend\":\n\t\t\t\tcase \"keyup\":\n\t\t\t\t\tactive(false);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"focus\":\n\t\t\t\tcase \"focusin\":\n\t\t\t\t\tfocused(true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"blur\":\n\t\t\t\tcase \"focusout\":\n\t\t\t\t\tfocused(false);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\t_trackMouseState: function(/*DomNode*/ node, /*String*/ clazz){\n\t\t\t// summary:\n\t\t\t//\t\tTrack mouse/focus events on specified node and set CSS class on that node to indicate\n\t\t\t//\t\tcurrent state.   Usually not called directly, but via cssStateNodes attribute.\n\t\t\t// description:\n\t\t\t//\t\tGiven class=foo, will set the following CSS class on the node\n\t\t\t//\n\t\t\t//\t\t- fooActive: if the user is currently pressing down the mouse button while over the node\n\t\t\t//\t\t- fooHover: if the user is hovering the mouse over the node, but not pressing down a button\n\t\t\t//\t\t- fooFocus: if the node is focused\n\t\t\t//\n\t\t\t//\t\tNote that it won't set any classes if the widget is disabled.\n\t\t\t// node: DomNode\n\t\t\t//\t\tShould be a sub-node of the widget, not the top node (this.domNode), since the top node\n\t\t\t//\t\tis handled specially and automatically just by mixing in this class.\n\t\t\t// clazz: String\n\t\t\t//\t\tCSS class name (ex: dijitSliderUpArrow)\n\n\t\t\t// Flag for listener code below to call this._cssMouseEvent() or this._subnodeCssMouseEvent()\n\t\t\t// when node is hovered/active\n\t\t\tnode._cssState = clazz;\n\t\t}\n\t});\n\n\tdomReady(function(){\n\t\t// Document level listener to catch hover etc. events on widget root nodes and subnodes.\n\t\t// Note that when the mouse is moved quickly, a single onmouseenter event could signal that multiple widgets\n\t\t// have been hovered or unhovered (try test_Accordion.html)\n\n\t\tfunction pointerHandler(evt, target, relatedTarget){\n\t\t\t// Handler for mouseover, mouseout, a11yclick.press and a11click.release events\n\n\t\t\t// Poor man's event propagation.  Don't propagate event to ancestors of evt.relatedTarget,\n\t\t\t// to avoid processing mouseout events moving from a widget's domNode to a descendant node;\n\t\t\t// such events shouldn't be interpreted as a mouseleave on the widget.\n\t\t\tif(relatedTarget && dom.isDescendant(relatedTarget, target)){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor(var node = target; node && node != relatedTarget; node = node.parentNode){\n\t\t\t\t// Process any nodes with _cssState property.   They are generally widget root nodes,\n\t\t\t\t// but could also be sub-nodes within a widget\n\t\t\t\tif(node._cssState){\n\t\t\t\t\tvar widget = registry.getEnclosingWidget(node);\n\t\t\t\t\tif(widget){\n\t\t\t\t\t\tif(node == widget.domNode){\n\t\t\t\t\t\t\t// event on the widget's root node\n\t\t\t\t\t\t\twidget._cssMouseEvent(evt);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// event on widget's sub-node\n\t\t\t\t\t\t\twidget._subnodeCssMouseEvent(node, node._cssState, evt);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar body = win.body(), activeNode;\n\n\t\t// Handle pointer related events (i.e. mouse or touch)\n\t\ton(body, touch.over, function(evt){\n\t\t\t// Using touch.over rather than mouseover mainly to ignore phantom mouse events on iOS.\n\t\t\tpointerHandler(evt, evt.target, evt.relatedTarget);\n\t\t});\n\t\ton(body, touch.out, function(evt){\n\t\t\t// Using touch.out rather than mouseout mainly to ignore phantom mouse events on iOS.\n\t\t\tpointerHandler(evt, evt.target, evt.relatedTarget);\n\t\t});\n\t\ton(body, a11yclick.press, function(evt){\n\t\t\t// Save the a11yclick.press target to reference when the a11yclick.release comes.\n\t\t\tactiveNode = evt.target;\n\t\t\tpointerHandler(evt, activeNode)\n\t\t});\n\t\ton(body, a11yclick.release, function(evt){\n\t\t\t// The release event could come on a separate node than the press event, if for example user slid finger.\n\t\t\t// Reference activeNode to reset the state of the node that got state set in the a11yclick.press handler.\n\t\t\tpointerHandler(evt, activeNode);\n\t\t\tactiveNode = null;\n\t\t});\n\n\t\t// Track focus events on widget sub-nodes that have been registered via _trackMouseState().\n\t\t// However, don't track focus events on the widget root nodes, because focus is tracked via the\n\t\t// focus manager (and it's not really tracking focus, but rather tracking that focus is on one of the widget's\n\t\t// nodes or a subwidget's node or a popup node, etc.)\n\t\t// Remove for 2.0 (if focus CSS needed, just use :focus pseudo-selector).\n\t\ton(body, \"focusin, focusout\", function(evt){\n\t\t\tvar node = evt.target;\n\t\t\tif(node._cssState && !node.getAttribute(\"widgetId\")){\n\t\t\t\tvar widget = registry.getEnclosingWidget(node);\n\t\t\t\tif(widget){\n\t\t\t\t\twidget._subnodeCssMouseEvent(node, node._cssState, evt);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\treturn CssStateMixin;\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"./a11y\"\t// _getTabNavigable\n], function(declare, a11y){\n\n\t// module:\n\t//\t\tdijit/_DialogMixin\n\n\treturn declare(\"dijit._DialogMixin\", null, {\n\t\t// summary:\n\t\t//\t\tThis provides functions useful to Dialog and TooltipDialog\n\n\t\t// actionBarTemplate: String\n\t\t//\t\tHTML snippet to show the action bar (gray bar with OK/cancel buttons).\n\t\t//\t\tBlank by default, but used by ConfirmDialog/ConfirmTooltipDialog subclasses.\n\t\tactionBarTemplate: \"\",\n\n\t\texecute: function(/*Object*/ /*===== formContents =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when the user hits the submit button.\n\t\t\t//\t\tOverride this method to handle Dialog execution.\n\t\t\t// description:\n\t\t\t//\t\tAfter the user has pressed the submit button, the Dialog\n\t\t\t//\t\tfirst calls onExecute() to notify the container to hide the\n\t\t\t//\t\tdialog and restore focus to wherever it used to be.\n\t\t\t//\n\t\t\t//\t\t*Then* this method is called.\n\t\t\t// type:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonCancel: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when user has pressed the Dialog's cancel button, to notify container.\n\t\t\t// description:\n\t\t\t//\t\tDeveloper shouldn't override or connect to this method;\n\t\t\t//\t\tit's a private communication device between the TooltipDialog\n\t\t\t//\t\tand the thing that opened it (ex: `dijit/form/DropDownButton`)\n\t\t\t// type:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\tonExecute: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when user has pressed the dialog's OK button, to notify container.\n\t\t\t// description:\n\t\t\t//\t\tDeveloper shouldn't override or connect to this method;\n\t\t\t//\t\tit's a private communication device between the TooltipDialog\n\t\t\t//\t\tand the thing that opened it (ex: `dijit/form/DropDownButton`)\n\t\t\t// type:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\t_onSubmit: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when user hits submit button\n\t\t\t// type:\n\t\t\t//\t\tprotected\n\t\t\tthis.onExecute();\t// notify container that we are about to execute\n\t\t\tthis.execute(this.get('value'));\n\t\t},\n\n\t\t_getFocusItems: function(){\n\t\t\t// summary:\n\t\t\t//\t\tFinds focusable items in dialog,\n\t\t\t//\t\tand sets this._firstFocusItem and this._lastFocusItem\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tvar elems = a11y._getTabNavigable(this.domNode);\n\t\t\tthis._firstFocusItem = elems.lowest || elems.first || this.closeButtonNode || this.domNode;\n\t\t\tthis._lastFocusItem = elems.last || elems.highest || this._firstFocusItem;\n\t\t}\n\t});\n});\n","define([\n\t\"./focus\",\n\t\"./_WidgetBase\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/lang\" // lang.extend\n], function(focus, _WidgetBase, declare, lang){\n\n\t// module:\n\t//\t\tdijit/_FocusMixin\n\n\t// We don't know where _FocusMixin will occur in the inheritance chain, but we need the _onFocus()/_onBlur() below\n\t// to be last in the inheritance chain, so mixin to _WidgetBase.\n\tlang.extend(_WidgetBase, {\n\t\t// focused: [readonly] Boolean\n\t\t//\t\tThis widget or a widget it contains has focus, or is \"active\" because\n\t\t//\t\tit was recently clicked.\n\t\tfocused: false,\n\n\t\tonFocus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the widget becomes \"active\" because\n\t\t\t//\t\tit or a widget inside of it either has focus, or has recently\n\t\t\t//\t\tbeen clicked.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonBlur: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the widget stops being \"active\" because\n\t\t\t//\t\tfocus moved to something outside of it, or the user\n\t\t\t//\t\tclicked somewhere outside of it, or the widget was\n\t\t\t//\t\thidden.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\t_onFocus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tThis is where widgets do processing for when they are active,\n\t\t\t//\t\tsuch as changing CSS classes.  See onFocus() for more details.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tthis.onFocus();\n\t\t},\n\n\t\t_onBlur: function(){\n\t\t\t// summary:\n\t\t\t//\t\tThis is where widgets do processing for when they stop being active,\n\t\t\t//\t\tsuch as changing CSS classes.  See onBlur() for more details.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tthis.onBlur();\n\t\t}\n\t});\n\n\treturn declare(\"dijit._FocusMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin to widget to provide _onFocus() and _onBlur() methods that\n\t\t//\t\tfire when a widget or its descendants get/lose focus\n\n\t\t// flag that I want _onFocus()/_onBlur() notifications from focus manager\n\t\t_focusManager: focus\n\t});\n\n});\n","define([\n\t\"dojo/on\",\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/keys\", // keys.ENTER keys.SPACE\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/has\", // has(\"dom-addeventlistener\")\n\t\"./a11yclick\"\n], function(on, array, keys, declare, has, a11yclick){\n\n\t// module:\n\t//\t\tdijit/_OnDijitClickMixin\n\n\tvar ret = declare(\"dijit._OnDijitClickMixin\", null, {\n\t\t// summary:\n\t\t//\t\tDeprecated.   New code should access the dijit/a11yclick event directly, ex:\n\t\t//\t\t|\tthis.own(on(node, a11yclick, function(){ ... }));\n\t\t//\n\t\t//\t\tMixing in this class will make _WidgetBase.connect(node, \"ondijitclick\", ...) work.\n\t\t//\t\tIt also used to be necessary to make templates with ondijitclick work, but now you can just require\n\t\t//\t\tdijit/a11yclick.\n\n\t\tconnect: function(obj, event, method){\n\t\t\t// override _WidgetBase.connect() to make this.connect(node, \"ondijitclick\", ...) work\n\t\t\treturn this.inherited(arguments, [obj, event == \"ondijitclick\" ? a11yclick : event, method]);\n\t\t}\n\t});\n\n\tret.a11yclick = a11yclick;\t// back compat\n\n\treturn ret;\n});\n","define([\n\t\"dojo/cache\",\t// dojo.cache\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-construct\", // domConstruct.destroy, domConstruct.toDom\n\t\"dojo/_base/lang\", // lang.getObject\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"dojo/string\", // string.substitute string.trim\n\t\"./_AttachMixin\"\n], function(cache, declare, domConstruct, lang, on, has, string, _AttachMixin){\n\n\t// module:\n\t//\t\tdijit/_TemplatedMixin\n\n\tvar _TemplatedMixin = declare(\"dijit._TemplatedMixin\", _AttachMixin, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets that are instantiated from a template\n\n\t\t// templateString: [protected] String\n\t\t//\t\tA string that represents the widget template.\n\t\t//\t\tUse in conjunction with dojo.cache() to load from a file.\n\t\ttemplateString: null,\n\n\t\t// templatePath: [protected deprecated] String\n\t\t//\t\tPath to template (HTML file) for this widget relative to dojo.baseUrl.\n\t\t//\t\tDeprecated: use templateString with require([... \"dojo/text!...\"], ...) instead\n\t\ttemplatePath: null,\n\n\t\t// skipNodeCache: [protected] Boolean\n\t\t//\t\tIf using a cached widget template nodes poses issues for a\n\t\t//\t\tparticular widget class, it can set this property to ensure\n\t\t//\t\tthat its template is always re-built from a string\n\t\t_skipNodeCache: false,\n\n/*=====\n\t\t// _rendered: Boolean\n\t\t//\t\tNot normally use, but this flag can be set by the app if the server has already rendered the template,\n\t\t//\t\ti.e. already inlining the template for the widget into the main page.   Reduces _TemplatedMixin to\n\t\t//\t\tjust function like _AttachMixin.\n\t\t_rendered: false,\n=====*/\n\n\t\t// Set _AttachMixin.searchContainerNode to true for back-compat for widgets that have data-dojo-attach-point's\n\t\t// and events inside this.containerNode.   Remove for 2.0.\n\t\tsearchContainerNode: true,\n\n\t\t_stringRepl: function(tmpl){\n\t\t\t// summary:\n\t\t\t//\t\tDoes substitution of ${foo} type properties in template string\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\t\t\tvar className = this.declaredClass, _this = this;\n\t\t\t// Cache contains a string because we need to do property replacement\n\t\t\t// do the property replacement\n\t\t\treturn string.substitute(tmpl, this, function(value, key){\n\t\t\t\tif(key.charAt(0) == '!'){ value = lang.getObject(key.substr(1), false, _this); }\n\t\t\t\tif(typeof value == \"undefined\"){ throw new Error(className+\" template:\"+key); } // a debugging aide\n\t\t\t\tif(value == null){ return \"\"; }\n\n\t\t\t\t// Substitution keys beginning with ! will skip the transform step,\n\t\t\t\t// in case a user wishes to insert unescaped markup, e.g. ${!foo}\n\t\t\t\treturn key.charAt(0) == \"!\" ? value : this._escapeValue(\"\" + value);\n\t\t\t}, this);\n\t\t},\n\n\t\t_escapeValue: function(/*String*/ val){\n\t\t\t// summary:\n\t\t\t//\t\tEscape a value to be inserted into the template, either into an attribute value\n\t\t\t//\t\t(ex: foo=\"${bar}\") or as inner text of an element (ex: <span>${foo}</span>)\n\n\t\t\t// Safer substitution, see heading \"Attribute values\" in\n\t\t\t// http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2\n\t\t\t// and also https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content\n\t\t\treturn val.replace(/[\"'<>&]/g, function(val){\n\t\t\t\treturn {\n\t\t\t\t\t\"&\": \"&amp;\",\n\t\t\t\t\t\"<\": \"&lt;\",\n\t\t\t\t\t\">\": \"&gt;\",\n\t\t\t\t\t\"\\\"\": \"&quot;\",\n\t\t\t\t\t\"'\": \"&#x27;\"\n\t\t\t\t}[val];\n\t\t\t});\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConstruct the UI for this widget from a template, setting this.domNode.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(!this._rendered){\n\t\t\t\tif(!this.templateString){\n\t\t\t\t\tthis.templateString = cache(this.templatePath, {sanitize: true});\n\t\t\t\t}\n\n\t\t\t\t// Lookup cached version of template, and download to cache if it\n\t\t\t\t// isn't there already.  Returns either a DomNode or a string, depending on\n\t\t\t\t// whether or not the template contains ${foo} replacement parameters.\n\t\t\t\tvar cached = _TemplatedMixin.getCachedTemplate(this.templateString, this._skipNodeCache, this.ownerDocument);\n\n\t\t\t\tvar node;\n\t\t\t\tif(lang.isString(cached)){\n\t\t\t\t\tnode = domConstruct.toDom(this._stringRepl(cached), this.ownerDocument);\n\t\t\t\t\tif(node.nodeType != 1){\n\t\t\t\t\t\t// Flag common problems such as templates with multiple top level nodes (nodeType == 11)\n\t\t\t\t\t\tthrow new Error(\"Invalid template: \" + cached);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t// if it's a node, all we have to do is clone it\n\t\t\t\t\tnode = cached.cloneNode(true);\n\t\t\t\t}\n\n\t\t\t\tthis.domNode = node;\n\t\t\t}\n\n\t\t\t// Call down to _WidgetBase.buildRendering() to get base classes assigned\n\t\t\t// TODO: change the baseClass assignment to _setBaseClassAttr\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif(!this._rendered){\n\t\t\t\tthis._fillContent(this.srcNodeRef);\n\t\t\t}\n\n\t\t\tthis._rendered = true;\n\t\t},\n\n\t\t_fillContent: function(/*DomNode*/ source){\n\t\t\t// summary:\n\t\t\t//\t\tRelocate source contents to templated container node.\n\t\t\t//\t\tthis.containerNode must be able to receive children, or exceptions will be thrown.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tvar dest = this.containerNode;\n\t\t\tif(source && dest){\n\t\t\t\twhile(source.hasChildNodes()){\n\t\t\t\t\tdest.appendChild(source.firstChild);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\t// key is templateString; object is either string or DOM tree\n\t_TemplatedMixin._templateCache = {};\n\n\t_TemplatedMixin.getCachedTemplate = function(templateString, alwaysUseString, doc){\n\t\t// summary:\n\t\t//\t\tStatic method to get a template based on the templatePath or\n\t\t//\t\ttemplateString key\n\t\t// templateString: String\n\t\t//\t\tThe template\n\t\t// alwaysUseString: Boolean\n\t\t//\t\tDon't cache the DOM tree for this template, even if it doesn't have any variables\n\t\t// doc: Document?\n\t\t//\t\tThe target document.   Defaults to document global if unspecified.\n\t\t// returns: Mixed\n\t\t//\t\tEither string (if there are ${} variables that need to be replaced) or just\n\t\t//\t\ta DOM tree (if the node can be cloned directly)\n\n\t\t// is it already cached?\n\t\tvar tmplts = _TemplatedMixin._templateCache;\n\t\tvar key = templateString;\n\t\tvar cached = tmplts[key];\n\t\tif(cached){\n\t\t\ttry{\n\t\t\t\t// if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the\n\t\t\t\t// current document, then use the current cached value\n\t\t\t\tif(!cached.ownerDocument || cached.ownerDocument == (doc || document)){\n\t\t\t\t\t// string or node of the same document\n\t\t\t\t\treturn cached;\n\t\t\t\t}\n\t\t\t}catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded\n\t\t\tdomConstruct.destroy(cached);\n\t\t}\n\n\t\ttemplateString = string.trim(templateString);\n\n\t\tif(alwaysUseString || templateString.match(/\\$\\{([^\\}]+)\\}/g)){\n\t\t\t// there are variables in the template so all we can do is cache the string\n\t\t\treturn (tmplts[key] = templateString); //String\n\t\t}else{\n\t\t\t// there are no variables in the template so we can cache the DOM tree\n\t\t\tvar node = domConstruct.toDom(templateString, doc);\n\t\t\tif(node.nodeType != 1){\n\t\t\t\tthrow new Error(\"Invalid template: \" + templateString);\n\t\t\t}\n\t\t\treturn (tmplts[key] = node); //Node\n\t\t}\n\t};\n\n\tif(has(\"ie\")){\n\t\ton(window, \"unload\", function(){\n\t\t\tvar cache = _TemplatedMixin._templateCache;\n\t\t\tfor(var key in cache){\n\t\t\t\tvar value = cache[key];\n\t\t\t\tif(typeof value == \"object\"){ // value is either a string or a DOM node template\n\t\t\t\t\tdomConstruct.destroy(value);\n\t\t\t\t}\n\t\t\t\tdelete cache[key];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn _TemplatedMixin;\n});\n","define([\n\t\"dojo/aspect\",\t// aspect.around\n\t\"dojo/_base/config\",\t// config.isDebug\n\t\"dojo/_base/connect\",\t// connect.connect\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/has\",\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/query\",\n\t\"dojo/ready\",\n\t\"./registry\",\t// registry.byNode\n\t\"./_WidgetBase\",\n\t\"./_OnDijitClickMixin\",\n\t\"./_FocusMixin\",\n\t\"dojo/uacss\",\t\t// browser sniffing (included for back-compat; subclasses may be using)\n\t\"./hccss\"\t\t// high contrast mode sniffing (included to set CSS classes on <body>, module ret value unused)\n], function(aspect, config, connect, declare, has, kernel, lang, query, ready,\n\t\t\tregistry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){\n\n\n// module:\n//\t\tdijit/_Widget\n\n\nfunction connectToDomNode(){\n\t// summary:\n\t//\t\tIf user connects to a widget method === this function, then they will\n\t//\t\tinstead actually be connecting the equivalent event on this.domNode\n}\n\n// Trap dojo.connect() calls to connectToDomNode methods, and redirect to _Widget.on()\nfunction aroundAdvice(originalConnect){\n\treturn function(obj, event, scope, method){\n\t\tif(obj && typeof event == \"string\" && obj[event] == connectToDomNode){\n\t\t\treturn obj.on(event.substring(2).toLowerCase(), lang.hitch(scope, method));\n\t\t}\n\t\treturn originalConnect.apply(connect, arguments);\n\t};\n}\naspect.around(connect, \"connect\", aroundAdvice);\nif(kernel.connect){\n\taspect.around(kernel, \"connect\", aroundAdvice);\n}\n\nvar _Widget = declare(\"dijit._Widget\", [_WidgetBase, _OnDijitClickMixin, _FocusMixin], {\n\t// summary:\n\t//\t\tOld base class for widgets.   New widgets should extend `dijit/_WidgetBase` instead\n\t// description:\n\t//\t\tOld Base class for Dijit widgets.\n\t//\n\t//\t\tExtends _WidgetBase, adding support for:\n\t//\n\t//\t\t- declaratively/programatically specifying widget initialization parameters like\n\t//\t\t\tonMouseMove=\"foo\" that call foo when this.domNode gets a mousemove event\n\t//\t\t- ondijitclick:\n\t//\t\t\tSupport new data-dojo-attach-event=\"ondijitclick: ...\" that is triggered by a mouse click or a SPACE/ENTER keypress\n\t//\t\t- focus related functions:\n\t//\t\t\tIn particular, the onFocus()/onBlur() callbacks.   Driven internally by\n\t//\t\t\tdijit/_base/focus.js.\n\t//\t\t- deprecated methods\n\t//\t\t- onShow(), onHide(), onClose()\n\t//\n\t//\t\tAlso, by loading code in dijit/_base, turns on:\n\t//\n\t//\t\t- browser sniffing (putting browser class like `dj_ie` on `<html>` node)\n\t//\t\t- high contrast mode sniffing (add `dijit_a11y` class to `<body>` if machine is in high contrast mode)\n\n\n\t////////////////// DEFERRED CONNECTS ///////////////////\n\n\tonClick: connectToDomNode,\n\t/*=====\n\tonClick: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of mouse click events.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonDblClick: connectToDomNode,\n\t/*=====\n\tonDblClick: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of mouse double click events.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyDown: connectToDomNode,\n\t/*=====\n\tonKeyDown: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of keys being pressed down.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyPress: connectToDomNode,\n\t/*=====\n\tonKeyPress: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of printable keys being typed.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyUp: connectToDomNode,\n\t/*=====\n\tonKeyUp: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of keys being released.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseDown: connectToDomNode,\n\t/*=====\n\tonMouseDown: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse button is pressed down.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseMove: connectToDomNode,\n\t/*=====\n\tonMouseMove: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves over nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseOut: connectToDomNode,\n\t/*=====\n\tonMouseOut: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseOver: connectToDomNode,\n\t/*=====\n\tonMouseOver: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseLeave: connectToDomNode,\n\t/*=====\n\tonMouseLeave: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves off of this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseEnter: connectToDomNode,\n\t/*=====\n\tonMouseEnter: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves onto this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseUp: connectToDomNode,\n\t/*=====\n\tonMouseUp: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse button is released.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\n\tconstructor: function(params /*===== ,srcNodeRef =====*/){\n\t\t// summary:\n\t\t//\t\tCreate the widget.\n\t\t// params: Object|null\n\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t// srcNodeRef: DOMNode|String?\n\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t//\n\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\n\t\t// extract parameters like onMouseMove that should connect directly to this.domNode\n\t\tthis._toConnect = {};\n\t\tfor(var name in params){\n\t\t\tif(this[name] === connectToDomNode){\n\t\t\t\tthis._toConnect[name.replace(/^on/, \"\").toLowerCase()] = params[name];\n\t\t\t\tdelete params[name];\n\t\t\t}\n\t\t}\n\t},\n\n\tpostCreate: function(){\n\t\tthis.inherited(arguments);\n\n\t\t// perform connection from this.domNode to user specified handlers (ex: onMouseMove)\n\t\tfor(var name in this._toConnect){\n\t\t\tthis.on(name, this._toConnect[name]);\n\t\t}\n\t\tdelete this._toConnect;\n\t},\n\n\ton: function(/*String|Function*/ type, /*Function*/ func){\n\t\tif(this[this._onMap(type)] === connectToDomNode){\n\t\t\t// Use connect.connect() rather than on() to get handling for \"onmouseenter\" on non-IE,\n\t\t\t// normalization of onkeypress/onkeydown to behave like firefox, etc.\n\t\t\t// Also, need to specify context as \"this\" rather than the default context of the DOMNode\n\t\t\t// Remove in 2.0.\n\t\t\treturn connect.connect(this.domNode, type.toLowerCase(), this, func);\n\t\t}\n\t\treturn this.inherited(arguments);\n\t},\n\n\t_setFocusedAttr: function(val){\n\t\t// Remove this method in 2.0 (or sooner), just here to set _focused == focused, for back compat\n\t\t// (but since it's a private variable we aren't required to keep supporting it).\n\t\tthis._focused = val;\n\t\tthis._set(\"focused\", val);\n\t},\n\n\t////////////////// DEPRECATED METHODS ///////////////////\n\n\tsetAttribute: function(/*String*/ attr, /*anything*/ value){\n\t\t// summary:\n\t\t//\t\tDeprecated.  Use set() instead.\n\t\t// tags:\n\t\t//\t\tdeprecated\n\t\tkernel.deprecated(this.declaredClass+\"::setAttribute(attr, value) is deprecated. Use set() instead.\", \"\", \"2.0\");\n\t\tthis.set(attr, value);\n\t},\n\n\tattr: function(/*String|Object*/name, /*Object?*/value){\n\t\t// summary:\n\t\t//\t\tThis method is deprecated, use get() or set() directly.\n\t\t// name:\n\t\t//\t\tThe property to get or set. If an object is passed here and not\n\t\t//\t\ta string, its keys are used as names of attributes to be set\n\t\t//\t\tand the value of the object as values to set in the widget.\n\t\t// value:\n\t\t//\t\tOptional. If provided, attr() operates as a setter. If omitted,\n\t\t//\t\tthe current value of the named property is returned.\n\t\t// tags:\n\t\t//\t\tdeprecated\n\n\t\tvar args = arguments.length;\n\t\tif(args >= 2 || typeof name === \"object\"){ // setter\n\t\t\treturn this.set.apply(this, arguments);\n\t\t}else{ // getter\n\t\t\treturn this.get(name);\n\t\t}\n\t},\n\n\tgetDescendants: function(){\n\t\t// summary:\n\t\t//\t\tReturns all the widgets contained by this, i.e., all widgets underneath this.containerNode.\n\t\t//\t\tThis method should generally be avoided as it returns widgets declared in templates, which are\n\t\t//\t\tsupposed to be internal/hidden, but it's left here for back-compat reasons.\n\n\t\tkernel.deprecated(this.declaredClass+\"::getDescendants() is deprecated. Use getChildren() instead.\", \"\", \"2.0\");\n\t\treturn this.containerNode ? query('[widgetId]', this.containerNode).map(registry.byNode) : []; // dijit/_WidgetBase[]\n\t},\n\n\t////////////////// MISCELLANEOUS METHODS ///////////////////\n\n\t_onShow: function(){\n\t\t// summary:\n\t\t//\t\tInternal method called when this widget is made visible.\n\t\t//\t\tSee `onShow` for details.\n\t\tthis.onShow();\n\t},\n\n\tonShow: function(){\n\t\t// summary:\n\t\t//\t\tCalled when this widget becomes the selected pane in a\n\t\t//\t\t`dijit/layout/TabContainer`, `dijit/layout/StackContainer`,\n\t\t//\t\t`dijit/layout/AccordionContainer`, etc.\n\t\t//\n\t\t//\t\tAlso called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\n\tonHide: function(){\n\t\t// summary:\n\t\t//\t\tCalled when another widget becomes the selected pane in a\n\t\t//\t\t`dijit/layout/TabContainer`, `dijit/layout/StackContainer`,\n\t\t//\t\t`dijit/layout/AccordionContainer`, etc.\n\t\t//\n\t\t//\t\tAlso called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\n\tonClose: function(){\n\t\t// summary:\n\t\t//\t\tCalled when this widget is being displayed as a popup (ex: a Calendar popped\n\t\t//\t\tup from a DateTextBox), and it is hidden.\n\t\t//\t\tThis is called from the dijit.popup code, and should not be called directly.\n\t\t//\n\t\t//\t\tAlso used as a parameter for children of `dijit/layout/StackContainer` or subclasses.\n\t\t//\t\tCallback if a user tries to close the child.   Child will be closed if this function returns true.\n\t\t// tags:\n\t\t//\t\textension\n\n\t\treturn true;\t\t// Boolean\n\t}\n});\n\n// For back-compat, remove in 2.0.\nif(has(\"dijit-legacy-requires\")){\n\tready(0, function(){\n\t\tvar requires = [\"dijit/_base\"];\n\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t});\n}\nreturn _Widget;\n});\n","define([\n\t\"require\", // require.toUrl\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/aspect\",\n\t\"dojo/_base/config\", // config.blankGif\n\t\"dojo/_base/connect\", // connect.connect\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/dom-attr\", // domAttr.set domAttr.remove\n\t\"dojo/dom-class\", // domClass.add domClass.replace\n\t\"dojo/dom-construct\", // domConstruct.destroy domConstruct.place\n\t\"dojo/dom-geometry\", // isBodyLtr\n\t\"dojo/dom-style\", // domStyle.set, domStyle.get\n\t\"dojo/has\",\n\t\"dojo/_base/kernel\",\n\t\"dojo/_base/lang\", // mixin(), isArray(), etc.\n\t\"dojo/on\",\n\t\"dojo/ready\",\n\t\"dojo/Stateful\", // Stateful\n\t\"dojo/topic\",\n\t\"dojo/_base/window\", // win.body()\n\t\"./Destroyable\",\n\t\"dojo/has!dojo-bidi?./_BidiMixin\",\n\t\"./registry\"    // registry.getUniqueId(), registry.findWidgets()\n], function(require, array, aspect, config, connect, declare,\n\t\t\tdom, domAttr, domClass, domConstruct, domGeometry, domStyle, has, kernel,\n\t\t\tlang, on, ready, Stateful, topic, win, Destroyable, _BidiMixin, registry){\n\n\t// module:\n\t//\t\tdijit/_WidgetBase\n\n\t// Flag to make dijit load modules the app didn't explicitly request, for backwards compatibility\n\thas.add(\"dijit-legacy-requires\", !kernel.isAsync);\n\n\t// Flag to enable support for textdir attribute\n\thas.add(\"dojo-bidi\", false);\n\n\n\t// For back-compat, remove in 2.0.\n\tif(has(\"dijit-legacy-requires\")){\n\t\tready(0, function(){\n\t\t\tvar requires = [\"dijit/_base/manager\"];\n\t\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t\t});\n\t}\n\n\t// Nested hash listing attributes for each tag, all strings in lowercase.\n\t// ex: {\"div\": {\"style\": true, \"tabindex\" true}, \"form\": { ...\n\tvar tagAttrs = {};\n\n\tfunction getAttrs(obj){\n\t\tvar ret = {};\n\t\tfor(var attr in obj){\n\t\t\tret[attr.toLowerCase()] = true;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction nonEmptyAttrToDom(attr){\n\t\t// summary:\n\t\t//\t\tReturns a setter function that copies the attribute to this.domNode,\n\t\t//\t\tor removes the attribute from this.domNode, depending on whether the\n\t\t//\t\tvalue is defined or not.\n\t\treturn function(val){\n\t\t\tdomAttr[val ? \"set\" : \"remove\"](this.domNode, attr, val);\n\t\t\tthis._set(attr, val);\n\t\t};\n\t}\n\n\tfunction isEqual(a, b){\n\t\t//\tsummary:\n\t\t//\t\tFunction that determines whether two values are identical,\n\t\t//\t\ttaking into account that NaN is not normally equal to itself\n\t\t//\t\tin JS.\n\n\t\treturn a === b || (/* a is NaN */ a !== a && /* b is NaN */ b !== b);\n\t}\n\n\tvar _WidgetBase = declare(\"dijit._WidgetBase\", [Stateful, Destroyable], {\n\t\t// summary:\n\t\t//\t\tFuture base class for all Dijit widgets.\n\t\t// description:\n\t\t//\t\tFuture base class for all Dijit widgets.\n\t\t//\t\t_Widget extends this class adding support for various features needed by desktop.\n\t\t//\n\t\t//\t\tProvides stubs for widget lifecycle methods for subclasses to extend, like postMixInProperties(), buildRendering(),\n\t\t//\t\tpostCreate(), startup(), and destroy(), and also public API methods like set(), get(), and watch().\n\t\t//\n\t\t//\t\tWidgets can provide custom setters/getters for widget attributes, which are called automatically by set(name, value).\n\t\t//\t\tFor an attribute XXX, define methods _setXXXAttr() and/or _getXXXAttr().\n\t\t//\n\t\t//\t\t_setXXXAttr can also be a string/hash/array mapping from a widget attribute XXX to the widget's DOMNodes:\n\t\t//\n\t\t//\t\t- DOM node attribute\n\t\t// |\t\t_setFocusAttr: {node: \"focusNode\", type: \"attribute\"}\n\t\t// |\t\t_setFocusAttr: \"focusNode\"\t(shorthand)\n\t\t// |\t\t_setFocusAttr: \"\"\t\t(shorthand, maps to this.domNode)\n\t\t//\t\tMaps this.focus to this.focusNode.focus, or (last example) this.domNode.focus\n\t\t//\n\t\t//\t\t- DOM node innerHTML\n\t\t//\t|\t\t_setTitleAttr: { node: \"titleNode\", type: \"innerHTML\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerHTML\n\t\t//\n\t\t//\t\t- DOM node innerText\n\t\t//\t|\t\t_setTitleAttr: { node: \"titleNode\", type: \"innerText\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerText\n\t\t//\n\t\t//\t\t- DOM node CSS class\n\t\t// |\t\t_setMyClassAttr: { node: \"domNode\", type: \"class\" }\n\t\t//\t\tMaps this.myClass to this.domNode.className\n\t\t//\n\t\t//\t\t- Toggle DOM node CSS class\n\t\t// |\t\t_setMyClassAttr: { node: \"domNode\", type: \"toggleClass\" }\n\t\t//\t\tToggles myClass on this.domNode by this.myClass\n\t\t//\n\t\t//\t\tIf the value of _setXXXAttr is an array, then each element in the array matches one of the\n\t\t//\t\tformats of the above list.\n\t\t//\n\t\t//\t\tIf the custom setter is null, no action is performed other than saving the new value\n\t\t//\t\tin the widget (in this).\n\t\t//\n\t\t//\t\tIf no custom setter is defined for an attribute, then it will be copied\n\t\t//\t\tto this.focusNode (if the widget defines a focusNode), or this.domNode otherwise.\n\t\t//\t\tThat's only done though for attributes that match DOMNode attributes (title,\n\t\t//\t\talt, aria-labelledby, etc.)\n\n\t\t// id: [const] String\n\t\t//\t\tA unique, opaque ID string that can be assigned by users or by the\n\t\t//\t\tsystem. If the developer passes an ID which is known not to be\n\t\t//\t\tunique, the specified ID is ignored and the system-generated ID is\n\t\t//\t\tused instead.\n\t\tid: \"\",\n\t\t_setIdAttr: \"domNode\", // to copy to this.domNode even for auto-generated id's\n\n\t\t// lang: [const] String\n\t\t//\t\tRarely used.  Overrides the default Dojo locale used to render this widget,\n\t\t//\t\tas defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute.\n\t\t//\t\tValue must be among the list of locales specified during by the Dojo bootstrap,\n\t\t//\t\tformatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us).\n\t\tlang: \"\",\n\t\t// set on domNode even when there's a focus node.\tbut don't set lang=\"\", since that's invalid.\n\t\t_setLangAttr: nonEmptyAttrToDom(\"lang\"),\n\n\t\t// dir: [const] String\n\t\t//\t\tBi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir)\n\t\t//\t\tattribute. Either left-to-right \"ltr\" or right-to-left \"rtl\".  If undefined, widgets renders in page's\n\t\t//\t\tdefault direction.\n\t\tdir: \"\",\n\t\t// set on domNode even when there's a focus node.\tbut don't set dir=\"\", since that's invalid.\n\t\t_setDirAttr: nonEmptyAttrToDom(\"dir\"), // to set on domNode even when there's a focus node\n\n\t\t// class: String\n\t\t//\t\tHTML class attribute\n\t\t\"class\": \"\",\n\t\t_setClassAttr: { node: \"domNode\", type: \"class\" },\n\n\t\t// Override automatic assigning type --> focusNode, it causes exception on IE6-8.\n\t\t// Instead, type must be specified as ${type} in the template, as part of the original DOM.\n\t\t_setTypeAttr: null,\n\n\t\t// style: String||Object\n\t\t//\t\tHTML style attributes as cssText string or name/value hash\n\t\tstyle: \"\",\n\n\t\t// title: String\n\t\t//\t\tHTML title attribute.\n\t\t//\n\t\t//\t\tFor form widgets this specifies a tooltip to display when hovering over\n\t\t//\t\tthe widget (just like the native HTML title attribute).\n\t\t//\n\t\t//\t\tFor TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,\n\t\t//\t\tetc., it's used to specify the tab label, accordion pane title, etc.  In this case it's\n\t\t//\t\tinterpreted as HTML.\n\t\ttitle: \"\",\n\n\t\t// tooltip: String\n\t\t//\t\tWhen this widget's title attribute is used to for a tab label, accordion pane title, etc.,\n\t\t//\t\tthis specifies the tooltip to appear when the mouse is hovered over that text.\n\t\ttooltip: \"\",\n\n\t\t// baseClass: [protected] String\n\t\t//\t\tRoot CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate\n\t\t//\t\twidget state.\n\t\tbaseClass: \"\",\n\n\t\t// srcNodeRef: [readonly] DomNode\n\t\t//\t\tpointer to original DOM node\n\t\tsrcNodeRef: null,\n\n\t\t// domNode: [readonly] DomNode\n\t\t//\t\tThis is our visible representation of the widget! Other DOM\n\t\t//\t\tNodes may by assigned to other properties, usually through the\n\t\t//\t\ttemplate system's data-dojo-attach-point syntax, but the domNode\n\t\t//\t\tproperty is the canonical \"top level\" node in widget UI.\n\t\tdomNode: null,\n\n\t\t// containerNode: [readonly] DomNode\n\t\t//\t\tDesignates where children of the source DOM node will be placed.\n\t\t//\t\t\"Children\" in this case refers to both DOM nodes and widgets.\n\t\t//\t\tFor example, for myWidget:\n\t\t//\n\t\t//\t\t|\t<div data-dojo-type=myWidget>\n\t\t//\t\t|\t\t<b> here's a plain DOM node\n\t\t//\t\t|\t\t<span data-dojo-type=subWidget>and a widget</span>\n\t\t//\t\t|\t\t<i> and another plain DOM node </i>\n\t\t//\t\t|\t</div>\n\t\t//\n\t\t//\t\tcontainerNode would point to:\n\t\t//\n\t\t//\t\t|\t\t<b> here's a plain DOM node\n\t\t//\t\t|\t\t<span data-dojo-type=subWidget>and a widget</span>\n\t\t//\t\t|\t\t<i> and another plain DOM node </i>\n\t\t//\n\t\t//\t\tIn templated widgets, \"containerNode\" is set via a\n\t\t//\t\tdata-dojo-attach-point assignment.\n\t\t//\n\t\t//\t\tcontainerNode must be defined for any widget that accepts innerHTML\n\t\t//\t\t(like ContentPane or BorderContainer or even Button), and conversely\n\t\t//\t\tis null for widgets that don't, like TextBox.\n\t\tcontainerNode: null,\n\n\t\t// ownerDocument: [const] Document?\n\t\t//\t\tThe document this widget belongs to.  If not specified to constructor, will default to\n\t\t//\t\tsrcNodeRef.ownerDocument, or if no sourceRef specified, then to the document global\n\t\townerDocument: null,\n\t\t_setOwnerDocumentAttr: function(val){\n\t\t\t// this setter is merely to avoid automatically trying to set this.domNode.ownerDocument\n\t\t\tthis._set(\"ownerDocument\", val);\n\t\t},\n\n\t\t/*=====\n\t\t// _started: [readonly] Boolean\n\t\t//\t\tstartup() has completed.\n\t\t_started: false,\n\t\t=====*/\n\n\t\t// attributeMap: [protected] Object\n\t\t//\t\tDeprecated.\tInstead of attributeMap, widget should have a _setXXXAttr attribute\n\t\t//\t\tfor each XXX attribute to be mapped to the DOM.\n\t\t//\n\t\t//\t\tattributeMap sets up a \"binding\" between attributes (aka properties)\n\t\t//\t\tof the widget and the widget's DOM.\n\t\t//\t\tChanges to widget attributes listed in attributeMap will be\n\t\t//\t\treflected into the DOM.\n\t\t//\n\t\t//\t\tFor example, calling set('title', 'hello')\n\t\t//\t\ton a TitlePane will automatically cause the TitlePane's DOM to update\n\t\t//\t\twith the new title.\n\t\t//\n\t\t//\t\tattributeMap is a hash where the key is an attribute of the widget,\n\t\t//\t\tand the value reflects a binding to a:\n\t\t//\n\t\t//\t\t- DOM node attribute\n\t\t// |\t\tfocus: {node: \"focusNode\", type: \"attribute\"}\n\t\t//\t\tMaps this.focus to this.focusNode.focus\n\t\t//\n\t\t//\t\t- DOM node innerHTML\n\t\t//\t|\t\ttitle: { node: \"titleNode\", type: \"innerHTML\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerHTML\n\t\t//\n\t\t//\t\t- DOM node innerText\n\t\t//\t|\t\ttitle: { node: \"titleNode\", type: \"innerText\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerText\n\t\t//\n\t\t//\t\t- DOM node CSS class\n\t\t// |\t\tmyClass: { node: \"domNode\", type: \"class\" }\n\t\t//\t\tMaps this.myClass to this.domNode.className\n\t\t//\n\t\t//\t\tIf the value is an array, then each element in the array matches one of the\n\t\t//\t\tformats of the above list.\n\t\t//\n\t\t//\t\tThere are also some shorthands for backwards compatibility:\n\t\t//\n\t\t//\t\t- string --> { node: string, type: \"attribute\" }, for example:\n\t\t//\n\t\t//\t|\t\"focusNode\" ---> { node: \"focusNode\", type: \"attribute\" }\n\t\t//\n\t\t//\t\t- \"\" --> { node: \"domNode\", type: \"attribute\" }\n\t\tattributeMap: {},\n\n\t\t// _blankGif: [protected] String\n\t\t//\t\tPath to a blank 1x1 image.\n\t\t//\t\tUsed by `<img>` nodes in templates that really get their image via CSS background-image.\n\t\t_blankGif: config.blankGif || require.toUrl(\"dojo/resources/blank.gif\"),\n\n\t\t// textDir: String\n\t\t//\t\tBi-directional support,\tthe main variable which is responsible for the direction of the text.\n\t\t//\t\tThe text direction can be different than the GUI direction by using this parameter in creation\n\t\t//\t\tof a widget.\n\t\t//\n\t\t//\t\tThis property is only effective when `has(\"dojo-bidi\")` is defined to be true.\n\t\t//\n\t\t//\t\tAllowed values:\n\t\t//\n\t\t//\t\t1. \"\" - default value; text is same direction as widget\n\t\t//\t\t2. \"ltr\"\n\t\t//\t\t3. \"rtl\"\n\t\t//\t\t4. \"auto\" - contextual the direction of a text defined by first strong letter.\n\t\ttextDir: \"\",\n\n\t\t//////////// INITIALIZATION METHODS ///////////////////////////////////////\n\n\t\t/*=====\n\t\tconstructor: function(params, srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tCreate the widget.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t\t//\n\t\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\t\t},\n\t\t=====*/\n\n\t\t_introspect: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCollect metadata about this widget (only once per class, not once per instance):\n\t\t\t//\n\t\t\t//\t\t\t- list of attributes with custom setters, storing in this.constructor._setterAttrs\n\t\t\t//\t\t\t- generate this.constructor._onMap, mapping names like \"mousedown\" to functions like onMouseDown\n\n\t\t\tvar ctor = this.constructor;\n\t\t\tif(!ctor._setterAttrs){\n\t\t\t\tvar proto = ctor.prototype,\n\t\t\t\t\tattrs = ctor._setterAttrs = [], // attributes with custom setters\n\t\t\t\t\tonMap = (ctor._onMap = {});\n\n\t\t\t\t// Items in this.attributeMap are like custom setters.  For back-compat, remove for 2.0.\n\t\t\t\tfor(var name in proto.attributeMap){\n\t\t\t\t\tattrs.push(name);\n\t\t\t\t}\n\n\t\t\t\t// Loop over widget properties, collecting properties with custom setters and filling in ctor._onMap.\n\t\t\t\tfor(name in proto){\n\t\t\t\t\tif(/^on/.test(name)){\n\t\t\t\t\t\tonMap[name.substring(2).toLowerCase()] = name;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(/^_set[A-Z](.*)Attr$/.test(name)){\n\t\t\t\t\t\tname = name.charAt(4).toLowerCase() + name.substr(5, name.length - 9);\n\t\t\t\t\t\tif(!proto.attributeMap || !(name in proto.attributeMap)){\n\t\t\t\t\t\t\tattrs.push(name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Note: this isn't picking up info on properties like aria-label and role, that don't have custom setters\n\t\t\t\t// but that set() maps to attributes on this.domNode or this.focusNode\n\t\t\t}\n\t\t},\n\n\t\tpostscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tKicks off widget instantiation.  See create() for details.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// Note that we skip calling this.inherited(), i.e. dojo/Stateful::postscript(), because 1.x widgets don't\n\t\t\t// expect their custom setters to get called until after buildRendering().  Consider changing for 2.0.\n\n\t\t\tthis.create(params, srcNodeRef);\n\t\t},\n\n\t\tcreate: function(params, srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tKick off the life-cycle of a widget\n\t\t\t// description:\n\t\t\t//\t\tCreate calls a number of widget methods (postMixInProperties, buildRendering, postCreate,\n\t\t\t//\t\tetc.), some of which of you'll want to override. See http://dojotoolkit.org/reference-guide/dijit/_WidgetBase.html\n\t\t\t//\t\tfor a discussion of the widget creation lifecycle.\n\t\t\t//\n\t\t\t//\t\tOf course, adventurous developers could override create entirely, but this should\n\t\t\t//\t\tonly be done as a last resort.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t\t//\n\t\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// First time widget is instantiated, scan prototype to figure out info about custom setters etc.\n\t\t\tthis._introspect();\n\n\t\t\t// store pointer to original DOM tree\n\t\t\tthis.srcNodeRef = dom.byId(srcNodeRef);\n\n\t\t\t// No longer used, remove for 2.0.\n\t\t\tthis._connects = [];\n\t\t\tthis._supportingWidgets = [];\n\n\t\t\t// this is here for back-compat, remove in 2.0 (but check NodeList-instantiate.html test)\n\t\t\tif(this.srcNodeRef && this.srcNodeRef.id  && (typeof this.srcNodeRef.id == \"string\")){\n\t\t\t\tthis.id = this.srcNodeRef.id;\n\t\t\t}\n\n\t\t\t// mix in our passed parameters\n\t\t\tif(params){\n\t\t\t\tthis.params = params;\n\t\t\t\tlang.mixin(this, params);\n\t\t\t}\n\t\t\tthis.postMixInProperties();\n\n\t\t\t// Generate an id for the widget if one wasn't specified, or it was specified as id: undefined.\n\t\t\t// Do this before buildRendering() because it might expect the id to be there.\n\t\t\tif(!this.id){\n\t\t\t\tthis.id = registry.getUniqueId(this.declaredClass.replace(/\\./g, \"_\"));\n\t\t\t\tif(this.params){\n\t\t\t\t\t// if params contains {id: undefined}, prevent _applyAttributes() from processing it\n\t\t\t\t\tdelete this.params.id;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The document and <body> node this widget is associated with\n\t\t\tthis.ownerDocument = this.ownerDocument || (this.srcNodeRef ? this.srcNodeRef.ownerDocument : document);\n\t\t\tthis.ownerDocumentBody = win.body(this.ownerDocument);\n\n\t\t\tregistry.add(this);\n\n\t\t\tthis.buildRendering();\n\n\t\t\tvar deleteSrcNodeRef;\n\n\t\t\tif(this.domNode){\n\t\t\t\t// Copy attributes listed in attributeMap into the [newly created] DOM for the widget.\n\t\t\t\t// Also calls custom setters for all attributes with custom setters.\n\t\t\t\tthis._applyAttributes();\n\n\t\t\t\t// If srcNodeRef was specified, then swap out original srcNode for this widget's DOM tree.\n\t\t\t\t// For 2.0, move this after postCreate().  postCreate() shouldn't depend on the\n\t\t\t\t// widget being attached to the DOM since it isn't when a widget is created programmatically like\n\t\t\t\t// new MyWidget({}).\tSee #11635.\n\t\t\t\tvar source = this.srcNodeRef;\n\t\t\t\tif(source && source.parentNode && this.domNode !== source){\n\t\t\t\t\tsource.parentNode.replaceChild(this.domNode, source);\n\t\t\t\t\tdeleteSrcNodeRef = true;\n\t\t\t\t}\n\n\t\t\t\t// Note: for 2.0 may want to rename widgetId to dojo._scopeName + \"_widgetId\",\n\t\t\t\t// assuming that dojo._scopeName even exists in 2.0\n\t\t\t\tthis.domNode.setAttribute(\"widgetId\", this.id);\n\t\t\t}\n\t\t\tthis.postCreate();\n\n\t\t\t// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.\n\t\t\t// I think for back-compatibility it isn't deleting srcNodeRef until after postCreate() has run.\n\t\t\tif(deleteSrcNodeRef){\n\t\t\t\tdelete this.srcNodeRef;\n\t\t\t}\n\n\t\t\tthis._created = true;\n\t\t},\n\n\t\t_applyAttributes: function(){\n\t\t\t// summary:\n\t\t\t//\t\tStep during widget creation to copy  widget attributes to the\n\t\t\t//\t\tDOM according to attributeMap and _setXXXAttr objects, and also to call\n\t\t\t//\t\tcustom _setXXXAttr() methods.\n\t\t\t//\n\t\t\t//\t\tSkips over blank/false attribute values, unless they were explicitly specified\n\t\t\t//\t\tas parameters to the widget, since those are the default anyway,\n\t\t\t//\t\tand setting tabIndex=\"\" is different than not setting tabIndex at all.\n\t\t\t//\n\t\t\t//\t\tFor backwards-compatibility reasons attributeMap overrides _setXXXAttr when\n\t\t\t//\t\t_setXXXAttr is a hash/string/array, but _setXXXAttr as a functions override attributeMap.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// Call this.set() for each property that was either specified as parameter to constructor,\n\t\t\t// or is in the list found above.\tFor correlated properties like value and displayedValue, the one\n\t\t\t// specified as a parameter should take precedence.\n\t\t\t// Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is\n\t\t\t// NaN and thus is not ignored like a default value of \"\".\n\n\t\t\t// Step 1: Save the current values of the widget properties that were specified as parameters to the constructor.\n\t\t\t// Generally this.foo == this.params.foo, except if postMixInProperties() changed the value of this.foo.\n\t\t\tvar params = {};\n\t\t\tfor(var key in this.params || {}){\n\t\t\t\tparams[key] = this._get(key);\n\t\t\t}\n\n\t\t\t// Step 2: Call set() for each property with a non-falsy value that wasn't passed as a parameter to the constructor\n\t\t\tarray.forEach(this.constructor._setterAttrs, function(key){\n\t\t\t\tif(!(key in params)){\n\t\t\t\t\tvar val = this._get(key);\n\t\t\t\t\tif(val){\n\t\t\t\t\t\tthis.set(key, val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, this);\n\n\t\t\t// Step 3: Call set() for each property that was specified as parameter to constructor.\n\t\t\t// Use params hash created above to ignore side effects from step #2 above.\n\t\t\tfor(key in params){\n\t\t\t\tthis.set(key, params[key]);\n\t\t\t}\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled after the parameters to the widget have been read-in,\n\t\t\t//\t\tbut before the widget template is instantiated. Especially\n\t\t\t//\t\tuseful to set properties that are referenced in the widget\n\t\t\t//\t\ttemplate.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConstruct the UI for this widget, setting this.domNode.\n\t\t\t//\t\tMost widgets will mixin `dijit._TemplatedMixin`, which implements this method.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(!this.domNode){\n\t\t\t\t// Create root node if it wasn't created by _TemplatedMixin\n\t\t\t\tthis.domNode = this.srcNodeRef || this.ownerDocument.createElement(\"div\");\n\t\t\t}\n\n\t\t\t// baseClass is a single class name or occasionally a space-separated list of names.\n\t\t\t// Add those classes to the DOMNode.  If RTL mode then also add with Rtl suffix.\n\t\t\t// TODO: make baseClass custom setter\n\t\t\tif(this.baseClass){\n\t\t\t\tvar classes = this.baseClass.split(\" \");\n\t\t\t\tif(!this.isLeftToRight()){\n\t\t\t\t\tclasses = classes.concat(array.map(classes, function(name){\n\t\t\t\t\t\treturn name + \"Rtl\";\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\tdomClass.add(this.domNode, classes);\n\t\t\t}\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\t// summary:\n\t\t\t//\t\tProcessing after the DOM fragment is created\n\t\t\t// description:\n\t\t\t//\t\tCalled after the DOM fragment has been created, but not necessarily\n\t\t\t//\t\tadded to the document.  Do not include any operations which rely on\n\t\t\t//\t\tnode dimensions or placement.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\tstartup: function(){\n\t\t\t// summary:\n\t\t\t//\t\tProcessing after the DOM fragment is added to the document\n\t\t\t// description:\n\t\t\t//\t\tCalled after a widget and its children have been created and added to the page,\n\t\t\t//\t\tand all related widgets have finished their create() cycle, up through postCreate().\n\t\t\t//\n\t\t\t//\t\tNote that startup() may be called while the widget is still hidden, for example if the widget is\n\t\t\t//\t\tinside a hidden dijit/Dialog or an unselected tab of a dijit/layout/TabContainer.\n\t\t\t//\t\tFor widgets that need to do layout, it's best to put that layout code inside resize(), and then\n\t\t\t//\t\textend dijit/layout/_LayoutWidget so that resize() is called when the widget is visible.\n\t\t\tif(this._started){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._started = true;\n\t\t\tarray.forEach(this.getChildren(), function(obj){\n\t\t\t\tif(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){\n\t\t\t\t\tobj.startup();\n\t\t\t\t\tobj._started = true;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t//////////// DESTROY FUNCTIONS ////////////////////////////////\n\n\t\tdestroyRecursive: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this widget and its descendants\n\t\t\t// description:\n\t\t\t//\t\tThis is the generic \"destructor\" function that all widget users\n\t\t\t//\t\tshould call to cleanly discard with a widget. Once a widget is\n\t\t\t//\t\tdestroyed, it is removed from the manager object.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, this method will leave the original DOM structure\n\t\t\t//\t\talone of descendant Widgets. Note: This will NOT work with\n\t\t\t//\t\tdijit._TemplatedMixin widgets.\n\n\t\t\tthis._beingDestroyed = true;\n\t\t\tthis.destroyDescendants(preserveDom);\n\t\t\tthis.destroy(preserveDom);\n\t\t},\n\n\t\tdestroy: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this widget, but not its descendants.  Descendants means widgets inside of\n\t\t\t//\t\tthis.containerNode.   Will also destroy any resources (including widgets) registered via this.own().\n\t\t\t//\n\t\t\t//\t\tThis method will also destroy internal widgets such as those created from a template,\n\t\t\t//\t\tassuming those widgets exist inside of this.domNode but outside of this.containerNode.\n\t\t\t//\n\t\t\t//\t\tFor 2.0 it's planned that this method will also destroy descendant widgets, so apps should not\n\t\t\t//\t\tdepend on the current ability to destroy a widget without destroying its descendants.   Generally\n\t\t\t//\t\tthey should use destroyRecursive() for widgets with children.\n\t\t\t// preserveDom: Boolean\n\t\t\t//\t\tIf true, this method will leave the original DOM structure alone.\n\t\t\t//\t\tNote: This will not yet work with _TemplatedMixin widgets\n\n\t\t\tthis._beingDestroyed = true;\n\t\t\tthis.uninitialize();\n\n\t\t\tfunction destroy(w){\n\t\t\t\tif(w.destroyRecursive){\n\t\t\t\t\tw.destroyRecursive(preserveDom);\n\t\t\t\t}else if(w.destroy){\n\t\t\t\t\tw.destroy(preserveDom);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Back-compat, remove for 2.0\n\t\t\tarray.forEach(this._connects, lang.hitch(this, \"disconnect\"));\n\t\t\tarray.forEach(this._supportingWidgets, destroy);\n\n\t\t\t// Destroy supporting widgets, but not child widgets under this.containerNode (for 2.0, destroy child widgets\n\t\t\t// here too).   if() statement is to guard against exception if destroy() called multiple times (see #15815).\n\t\t\tif(this.domNode){\n\t\t\t\tarray.forEach(registry.findWidgets(this.domNode, this.containerNode), destroy);\n\t\t\t}\n\n\t\t\tthis.destroyRendering(preserveDom);\n\t\t\tregistry.remove(this.id);\n\t\t\tthis._destroyed = true;\n\t\t},\n\n\t\tdestroyRendering: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroys the DOM nodes associated with this widget.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, this method will leave the original DOM structure alone\n\t\t\t//\t\tduring tear-down. Note: this will not work with _Templated\n\t\t\t//\t\twidgets yet.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(this.bgIframe){\n\t\t\t\tthis.bgIframe.destroy(preserveDom);\n\t\t\t\tdelete this.bgIframe;\n\t\t\t}\n\n\t\t\tif(this.domNode){\n\t\t\t\tif(preserveDom){\n\t\t\t\t\tdomAttr.remove(this.domNode, \"widgetId\");\n\t\t\t\t}else{\n\t\t\t\t\tdomConstruct.destroy(this.domNode);\n\t\t\t\t}\n\t\t\t\tdelete this.domNode;\n\t\t\t}\n\n\t\t\tif(this.srcNodeRef){\n\t\t\t\tif(!preserveDom){\n\t\t\t\t\tdomConstruct.destroy(this.srcNodeRef);\n\t\t\t\t}\n\t\t\t\tdelete this.srcNodeRef;\n\t\t\t}\n\t\t},\n\n\t\tdestroyDescendants: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tRecursively destroy the children of this widget and their\n\t\t\t//\t\tdescendants.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, the preserveDom attribute is passed to all descendant\n\t\t\t//\t\twidget's .destroy() method. Not for use with _Templated\n\t\t\t//\t\twidgets.\n\n\t\t\t// get all direct descendants and destroy them recursively\n\t\t\tarray.forEach(this.getChildren(), function(widget){\n\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\twidget.destroyRecursive(preserveDom);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tuninitialize: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated. Override destroy() instead to implement custom widget tear-down\n\t\t\t//\t\tbehavior.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn false;\n\t\t},\n\n\t\t////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////\n\n\t\t_setStyleAttr: function(/*String||Object*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tSets the style attribute of the widget according to value,\n\t\t\t//\t\twhich is either a hash like {height: \"5px\", width: \"3px\"}\n\t\t\t//\t\tor a plain string\n\t\t\t// description:\n\t\t\t//\t\tDetermines which node to set the style on based on style setting\n\t\t\t//\t\tin attributeMap.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tvar mapNode = this.domNode;\n\n\t\t\t// Note: technically we should revert any style setting made in a previous call\n\t\t\t// to his method, but that's difficult to keep track of.\n\n\t\t\tif(lang.isObject(value)){\n\t\t\t\tdomStyle.set(mapNode, value);\n\t\t\t}else{\n\t\t\t\tif(mapNode.style.cssText){\n\t\t\t\t\tmapNode.style.cssText += \"; \" + value;\n\t\t\t\t}else{\n\t\t\t\t\tmapNode.style.cssText = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._set(\"style\", value);\n\t\t},\n\n\t\t_attrToDom: function(/*String*/ attr, /*String*/ value, /*Object?*/ commands){\n\t\t\t// summary:\n\t\t\t//\t\tReflect a widget attribute (title, tabIndex, duration etc.) to\n\t\t\t//\t\tthe widget DOM, as specified by commands parameter.\n\t\t\t//\t\tIf commands isn't specified then it's looked up from attributeMap.\n\t\t\t//\t\tNote some attributes like \"type\"\n\t\t\t//\t\tcannot be processed this way as they are not mutable.\n\t\t\t// attr:\n\t\t\t//\t\tName of member variable (ex: \"focusNode\" maps to this.focusNode) pointing\n\t\t\t//\t\tto DOMNode inside the widget, or alternately pointing to a subwidget\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tcommands = arguments.length >= 3 ? commands : this.attributeMap[attr];\n\n\t\t\tarray.forEach(lang.isArray(commands) ? commands : [commands], function(command){\n\n\t\t\t\t// Get target node and what we are doing to that node\n\t\t\t\tvar mapNode = this[command.node || command || \"domNode\"];\t// DOM node\n\t\t\t\tvar type = command.type || \"attribute\";\t// class, innerHTML, innerText, or attribute\n\n\t\t\t\tswitch(type){\n\t\t\t\t\tcase \"attribute\":\n\t\t\t\t\t\tif(lang.isFunction(value)){ // functions execute in the context of the widget\n\t\t\t\t\t\t\tvalue = lang.hitch(this, value);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get the name of the DOM node attribute; usually it's the same\n\t\t\t\t\t\t// as the name of the attribute in the widget (attr), but can be overridden.\n\t\t\t\t\t\t// Also maps handler names to lowercase, like onSubmit --> onsubmit\n\t\t\t\t\t\tvar attrName = command.attribute ? command.attribute :\n\t\t\t\t\t\t\t(/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);\n\n\t\t\t\t\t\tif(mapNode.tagName){\n\t\t\t\t\t\t\t// Normal case, mapping to a DOMNode.  Note that modern browsers will have a mapNode.set()\n\t\t\t\t\t\t\t// method, but for consistency we still call domAttr\n\t\t\t\t\t\t\tdomAttr.set(mapNode, attrName, value);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// mapping to a sub-widget\n\t\t\t\t\t\t\tmapNode.set(attrName, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"innerText\":\n\t\t\t\t\t\t// Deprecated, use \"textContent\" instead.\n\t\t\t\t\t\tmapNode.innerHTML = \"\";\n\t\t\t\t\t\tmapNode.appendChild(this.ownerDocument.createTextNode(value));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"textContent\":\n\t\t\t\t\t\tmapNode.textContent = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"innerHTML\":\n\t\t\t\t\t\tmapNode.innerHTML = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"class\":\n\t\t\t\t\t\tdomClass.replace(mapNode, value, this[attr]);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"toggleClass\":\n\t\t\t\t\t\tdomClass.toggle(mapNode, command.className || attr, value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}, this);\n\t\t},\n\n\t\tget: function(name){\n\t\t\t// summary:\n\t\t\t//\t\tGet a property from a widget.\n\t\t\t// name:\n\t\t\t//\t\tThe property to get.\n\t\t\t// description:\n\t\t\t//\t\tGet a named property from a widget. The property may\n\t\t\t//\t\tpotentially be retrieved via a getter method. If no getter is defined, this\n\t\t\t//\t\tjust retrieves the object's property.\n\t\t\t//\n\t\t\t//\t\tFor example, if the widget has properties `foo` and `bar`\n\t\t\t//\t\tand a method named `_getFooAttr()`, calling:\n\t\t\t//\t\t`myWidget.get(\"foo\")` would be equivalent to calling\n\t\t\t//\t\t`widget._getFooAttr()` and `myWidget.get(\"bar\")`\n\t\t\t//\t\twould be equivalent to the expression\n\t\t\t//\t\t`widget.bar2`\n\t\t\tvar names = this._getAttrNames(name);\n\t\t\treturn this[names.g] ? this[names.g]() : this._get(name);\n\t\t},\n\n\t\tset: function(name, value){\n\t\t\t// summary:\n\t\t\t//\t\tSet a property on a widget\n\t\t\t// name:\n\t\t\t//\t\tThe property to set.\n\t\t\t// value:\n\t\t\t//\t\tThe value to set in the property.\n\t\t\t// description:\n\t\t\t//\t\tSets named properties on a widget which may potentially be handled by a\n\t\t\t//\t\tsetter in the widget.\n\t\t\t//\n\t\t\t//\t\tFor example, if the widget has properties `foo` and `bar`\n\t\t\t//\t\tand a method named `_setFooAttr()`, calling\n\t\t\t//\t\t`myWidget.set(\"foo\", \"Howdy!\")` would be equivalent to calling\n\t\t\t//\t\t`widget._setFooAttr(\"Howdy!\")` and `myWidget.set(\"bar\", 3)`\n\t\t\t//\t\twould be equivalent to the statement `widget.bar = 3;`\n\t\t\t//\n\t\t\t//\t\tset() may also be called with a hash of name/value pairs, ex:\n\t\t\t//\n\t\t\t//\t|\tmyWidget.set({\n\t\t\t//\t|\t\tfoo: \"Howdy\",\n\t\t\t//\t|\t\tbar: 3\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t//\tThis is equivalent to calling `set(foo, \"Howdy\")` and `set(bar, 3)`\n\n\t\t\tif(typeof name === \"object\"){\n\t\t\t\tfor(var x in name){\n\t\t\t\t\tthis.set(x, name[x]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar names = this._getAttrNames(name),\n\t\t\t\tsetter = this[names.s];\n\t\t\tif(lang.isFunction(setter)){\n\t\t\t\t// use the explicit setter\n\t\t\t\tvar result = setter.apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}else{\n\t\t\t\t// Mapping from widget attribute to DOMNode/subwidget attribute/value/etc.\n\t\t\t\t// Map according to:\n\t\t\t\t//\t\t1. attributeMap setting, if one exists (TODO: attributeMap deprecated, remove in 2.0)\n\t\t\t\t//\t\t2. _setFooAttr: {...} type attribute in the widget (if one exists)\n\t\t\t\t//\t\t3. apply to focusNode or domNode if standard attribute name, excluding funcs like onClick.\n\t\t\t\t// Checks if an attribute is a \"standard attribute\" by whether the DOMNode JS object has a similar\n\t\t\t\t// attribute name (ex: accept-charset attribute matches jsObject.acceptCharset).\n\t\t\t\t// Note also that Tree.focusNode() is a function not a DOMNode, so test for that.\n\t\t\t\tvar defaultNode = this.focusNode && !lang.isFunction(this.focusNode) ? \"focusNode\" : \"domNode\",\n\t\t\t\t\ttag = this[defaultNode] && this[defaultNode].tagName,\n\t\t\t\t\tattrsForTag = tag && (tagAttrs[tag] || (tagAttrs[tag] = getAttrs(this[defaultNode]))),\n\t\t\t\t\tmap = name in this.attributeMap ? this.attributeMap[name] :\n\t\t\t\t\t\tnames.s in this ? this[names.s] :\n\t\t\t\t\t\t\t((attrsForTag && names.l in attrsForTag && typeof value != \"function\") ||\n\t\t\t\t\t\t\t\t/^aria-|^data-|^role$/.test(name)) ? defaultNode : null;\n\t\t\t\tif(map != null){\n\t\t\t\t\tthis._attrToDom(name, value, map);\n\t\t\t\t}\n\t\t\t\tthis._set(name, value);\n\t\t\t}\n\t\t\treturn result || this;\n\t\t},\n\n\t\t_attrPairNames: {}, // shared between all widgets\n\t\t_getAttrNames: function(name){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function for get() and set().\n\t\t\t//\t\tCaches attribute name values so we don't do the string ops every time.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tvar apn = this._attrPairNames;\n\t\t\tif(apn[name]){\n\t\t\t\treturn apn[name];\n\t\t\t}\n\t\t\tvar uc = name.replace(/^[a-z]|-[a-zA-Z]/g, function(c){\n\t\t\t\treturn c.charAt(c.length - 1).toUpperCase();\n\t\t\t});\n\t\t\treturn (apn[name] = {\n\t\t\t\tn: name + \"Node\",\n\t\t\t\ts: \"_set\" + uc + \"Attr\", // converts dashes to camel case, ex: accept-charset --> _setAcceptCharsetAttr\n\t\t\t\tg: \"_get\" + uc + \"Attr\",\n\t\t\t\tl: uc.toLowerCase()        // lowercase name w/out dashes, ex: acceptcharset\n\t\t\t});\n\t\t},\n\n\t\t_set: function(/*String*/ name, /*anything*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function to set new value for specified property, and call handlers\n\t\t\t//\t\tregistered with watch() if the value has changed.\n\t\t\tvar oldValue = this[name];\n\t\t\tthis[name] = value;\n\t\t\tif(this._created && !isEqual(oldValue, value)){\n\t\t\t\tif(this._watchCallbacks){\n\t\t\t\t\tthis._watchCallbacks(name, oldValue, value);\n\t\t\t\t}\n\t\t\t\tthis.emit(\"attrmodified-\" + name, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tprevValue: oldValue,\n\t\t\t\t\t\tnewValue: value\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t_get: function(/*String*/ name){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function to get value for specified property stored by this._set(),\n\t\t\t//\t\ti.e. for properties with custom setters.  Used mainly by custom getters.\n\t\t\t//\n\t\t\t//\t\tFor example, CheckBox._getValueAttr() calls this._get(\"value\").\n\n\t\t\t// future: return name in this.props ? this.props[name] : this[name];\n\t\t\treturn this[name];\n\t\t},\n\n\t\temit: function(/*String*/ type, /*Object?*/ eventObj, /*Array?*/ callbackArgs){\n\t\t\t// summary:\n\t\t\t//\t\tUsed by widgets to signal that a synthetic event occurred, ex:\n\t\t\t//\t|\tmyWidget.emit(\"attrmodified-selectedChildWidget\", {}).\n\t\t\t//\n\t\t\t//\t\tEmits an event on this.domNode named type.toLowerCase(), based on eventObj.\n\t\t\t//\t\tAlso calls onType() method, if present, and returns value from that method.\n\t\t\t//\t\tBy default passes eventObj to callback, but will pass callbackArgs instead, if specified.\n\t\t\t//\t\tModifies eventObj by adding missing parameters (bubbles, cancelable, widget).\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\t// Specify fallback values for bubbles, cancelable in case they are not set in eventObj.\n\t\t\t// Also set pointer to widget, although since we can't add a pointer to the widget for native events\n\t\t\t// (see #14729), maybe we shouldn't do it here?\n\t\t\teventObj = eventObj || {};\n\t\t\tif(eventObj.bubbles === undefined){\n\t\t\t\teventObj.bubbles = true;\n\t\t\t}\n\t\t\tif(eventObj.cancelable === undefined){\n\t\t\t\teventObj.cancelable = true;\n\t\t\t}\n\t\t\tif(!eventObj.detail){\n\t\t\t\teventObj.detail = {};\n\t\t\t}\n\t\t\teventObj.detail.widget = this;\n\n\t\t\tvar ret, callback = this[\"on\" + type];\n\t\t\tif(callback){\n\t\t\t\tret = callback.apply(this, callbackArgs ? callbackArgs : [eventObj]);\n\t\t\t}\n\n\t\t\t// Emit event, but avoid spurious emit()'s as parent sets properties on child during startup/destroy\n\t\t\tif(this._started && !this._beingDestroyed){\n\t\t\t\ton.emit(this.domNode, type.toLowerCase(), eventObj);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t},\n\n\t\ton: function(/*String|Function*/ type, /*Function*/ func){\n\t\t\t// summary:\n\t\t\t//\t\tCall specified function when event occurs, ex: myWidget.on(\"click\", function(){ ... }).\n\t\t\t// type:\n\t\t\t//\t\tName of event (ex: \"click\") or extension event like touch.press.\n\t\t\t// description:\n\t\t\t//\t\tCall specified function when event `type` occurs, ex: `myWidget.on(\"click\", function(){ ... })`.\n\t\t\t//\t\tNote that the function is not run in any particular scope, so if (for example) you want it to run in the\n\t\t\t//\t\twidget's scope you must do `myWidget.on(\"click\", lang.hitch(myWidget, func))`.\n\n\t\t\t// For backwards compatibility, if there's an onType() method in the widget then connect to that.\n\t\t\t// Remove in 2.0.\n\t\t\tvar widgetMethod = this._onMap(type);\n\t\t\tif(widgetMethod){\n\t\t\t\treturn aspect.after(this, widgetMethod, func, true);\n\t\t\t}\n\n\t\t\t// Otherwise, just listen for the event on this.domNode.\n\t\t\treturn this.own(on(this.domNode, type, func))[0];\n\t\t},\n\n\t\t_onMap: function(/*String|Function*/ type){\n\t\t\t// summary:\n\t\t\t//\t\tMaps on() type parameter (ex: \"mousemove\") to method name (ex: \"onMouseMove\").\n\t\t\t//\t\tIf type is a synthetic event like touch.press then returns undefined.\n\t\t\tvar ctor = this.constructor, map = ctor._onMap;\n\t\t\tif(!map){\n\t\t\t\tmap = (ctor._onMap = {});\n\t\t\t\tfor(var attr in ctor.prototype){\n\t\t\t\t\tif(/^on/.test(attr)){\n\t\t\t\t\t\tmap[attr.replace(/^on/, \"\").toLowerCase()] = attr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn map[typeof type == \"string\" && type.toLowerCase()];\t// String\n\t\t},\n\n\t\ttoString: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a string that represents the widget.\n\t\t\t// description:\n\t\t\t//\t\tWhen a widget is cast to a string, this method will be used to generate the\n\t\t\t//\t\toutput. Currently, it does not implement any sort of reversible\n\t\t\t//\t\tserialization.\n\t\t\treturn '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String\n\t\t},\n\n\t\tgetChildren: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns all direct children of this widget, i.e. all widgets underneath this.containerNode whose parent\n\t\t\t//\t\tis this widget.   Note that it does not return all descendants, but rather just direct children.\n\t\t\t//\t\tAnalogous to [Node.childNodes](https://developer.mozilla.org/en-US/docs/DOM/Node.childNodes),\n\t\t\t//\t\texcept containing widgets rather than DOMNodes.\n\t\t\t//\n\t\t\t//\t\tThe result intentionally excludes internally created widgets (a.k.a. supporting widgets)\n\t\t\t//\t\toutside of this.containerNode.\n\t\t\t//\n\t\t\t//\t\tNote that the array returned is a simple array.  Application code should not assume\n\t\t\t//\t\texistence of methods like forEach().\n\n\t\t\treturn this.containerNode ? registry.findWidgets(this.containerNode) : []; // dijit/_WidgetBase[]\n\t\t},\n\n\t\tgetParent: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the parent widget of this widget.\n\n\t\t\treturn registry.getEnclosingWidget(this.domNode.parentNode);\n\t\t},\n\n\t\tconnect: function(/*Object|null*/ obj, /*String|Function*/ event, /*String|Function*/ method){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead.\n\t\t\t//\n\t\t\t//\t\tConnects specified obj/event to specified method of this object\n\t\t\t//\t\tand registers for disconnect() on widget destroy.\n\t\t\t//\n\t\t\t//\t\tProvide widget-specific analog to dojo.connect, except with the\n\t\t\t//\t\timplicit use of this widget as the target object.\n\t\t\t//\t\tEvents connected with `this.connect` are disconnected upon\n\t\t\t//\t\tdestruction.\n\t\t\t// returns:\n\t\t\t//\t\tA handle that can be passed to `disconnect` in order to disconnect before\n\t\t\t//\t\tthe widget is destroyed.\n\t\t\t// example:\n\t\t\t//\t|\tvar btn = new Button();\n\t\t\t//\t|\t// when foo.bar() is called, call the listener we're going to\n\t\t\t//\t|\t// provide in the scope of btn\n\t\t\t//\t|\tbtn.connect(foo, \"bar\", function(){\n\t\t\t//\t|\t\tconsole.debug(this.toString());\n\t\t\t//\t|\t});\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\treturn this.own(connect.connect(obj, event, this, method))[0];\t// handle\n\t\t},\n\n\t\tdisconnect: function(handle){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use handle.remove() instead.\n\t\t\t//\n\t\t\t//\t\tDisconnects handle created by `connect`.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\thandle.remove();\n\t\t},\n\n\t\tsubscribe: function(t, method){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead.\n\t\t\t//\n\t\t\t//\t\tSubscribes to the specified topic and calls the specified method\n\t\t\t//\t\tof this object and registers for unsubscribe() on widget destroy.\n\t\t\t//\n\t\t\t//\t\tProvide widget-specific analog to dojo.subscribe, except with the\n\t\t\t//\t\timplicit use of this widget as the target object.\n\t\t\t// t: String\n\t\t\t//\t\tThe topic\n\t\t\t// method: Function\n\t\t\t//\t\tThe callback\n\t\t\t// example:\n\t\t\t//\t|\tvar btn = new Button();\n\t\t\t//\t|\t// when /my/topic is published, this button changes its label to\n\t\t\t//\t|\t// be the parameter of the topic.\n\t\t\t//\t|\tbtn.subscribe(\"/my/topic\", function(v){\n\t\t\t//\t|\t\tthis.set(\"label\", v);\n\t\t\t//\t|\t});\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.own(topic.subscribe(t, lang.hitch(this, method)))[0];\t// handle\n\t\t},\n\n\t\tunsubscribe: function(/*Object*/ handle){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use handle.remove() instead.\n\t\t\t//\n\t\t\t//\t\tUnsubscribes handle created by this.subscribe.\n\t\t\t//\t\tAlso removes handle from this widget's list of subscriptions\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\thandle.remove();\n\t\t},\n\n\t\tisLeftToRight: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturn this widget's explicit or implicit orientation (true for LTR, false for RTL)\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.dir ? (this.dir.toLowerCase() == \"ltr\") : domGeometry.isBodyLtr(this.ownerDocument); //Boolean\n\t\t},\n\n\t\tisFocusable: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturn true if this widget can currently be focused\n\t\t\t//\t\tand false if not\n\t\t\treturn this.focus && (domStyle.get(this.domNode, \"display\") != \"none\");\n\t\t},\n\n\t\tplaceAt: function(/*String|DomNode|DocumentFragment|dijit/_WidgetBase*/ reference, /*String|Int?*/ position){\n\t\t\t// summary:\n\t\t\t//\t\tPlace this widget somewhere in the DOM based\n\t\t\t//\t\ton standard domConstruct.place() conventions.\n\t\t\t// description:\n\t\t\t//\t\tA convenience function provided in all _Widgets, providing a simple\n\t\t\t//\t\tshorthand mechanism to put an existing (or newly created) Widget\n\t\t\t//\t\tsomewhere in the dom, and allow chaining.\n\t\t\t// reference:\n\t\t\t//\t\tWidget, DOMNode, DocumentFragment, or id of widget or DOMNode\n\t\t\t// position:\n\t\t\t//\t\tIf reference is a widget (or id of widget), and that widget has an \".addChild\" method,\n\t\t\t//\t\tit will be called passing this widget instance into that method, supplying the optional\n\t\t\t//\t\tposition index passed.  In this case position (if specified) should be an integer.\n\t\t\t//\n\t\t\t//\t\tIf reference is a DOMNode (or id matching a DOMNode but not a widget),\n\t\t\t//\t\tthe position argument can be a numeric index or a string\n\t\t\t//\t\t\"first\", \"last\", \"before\", or \"after\", same as dojo/dom-construct::place().\n\t\t\t// returns: dijit/_WidgetBase\n\t\t\t//\t\tProvides a useful return of the newly created dijit._Widget instance so you\n\t\t\t//\t\tcan \"chain\" this function by instantiating, placing, then saving the return value\n\t\t\t//\t\tto a variable.\n\t\t\t// example:\n\t\t\t//\t|\t// create a Button with no srcNodeRef, and place it in the body:\n\t\t\t//\t|\tvar button = new Button({ label:\"click\" }).placeAt(win.body());\n\t\t\t//\t|\t// now, 'button' is still the widget reference to the newly created button\n\t\t\t//\t|\tbutton.on(\"click\", function(e){ console.log('click'); }));\n\t\t\t// example:\n\t\t\t//\t|\t// create a button out of a node with id=\"src\" and append it to id=\"wrapper\":\n\t\t\t//\t|\tvar button = new Button({},\"src\").placeAt(\"wrapper\");\n\t\t\t// example:\n\t\t\t//\t|\t// place a new button as the first element of some div\n\t\t\t//\t|\tvar button = new Button({ label:\"click\" }).placeAt(\"wrapper\",\"first\");\n\t\t\t// example:\n\t\t\t//\t|\t// create a contentpane and add it to a TabContainer\n\t\t\t//\t|\tvar tc = dijit.byId(\"myTabs\");\n\t\t\t//\t|\tnew ContentPane({ href:\"foo.html\", title:\"Wow!\" }).placeAt(tc)\n\n\t\t\tvar refWidget = !reference.tagName && registry.byId(reference);\n\t\t\tif(refWidget && refWidget.addChild && (!position || typeof position === \"number\")){\n\t\t\t\t// Adding this to refWidget and can use refWidget.addChild() to handle everything.\n\t\t\t\trefWidget.addChild(this, position);\n\t\t\t}else{\n\t\t\t\t// \"reference\" is a plain DOMNode, or we can't use refWidget.addChild().   Use domConstruct.place() and\n\t\t\t\t// target refWidget.containerNode for nested placement (position==number, \"first\", \"last\", \"only\"), and\n\t\t\t\t// refWidget.domNode otherwise (\"after\"/\"before\"/\"replace\").  (But not supported officially, see #14946.)\n\t\t\t\tvar ref = refWidget && (\"domNode\" in refWidget) ?\n\t\t\t\t\t(refWidget.containerNode && !/after|before|replace/.test(position || \"\") ?\n\t\t\t\t\t\trefWidget.containerNode : refWidget.domNode) : dom.byId(reference, this.ownerDocument);\n\t\t\t\tdomConstruct.place(this.domNode, ref, position);\n\n\t\t\t\t// Start this iff it has a parent widget that's already started.\n\t\t\t\t// TODO: for 2.0 maybe it should also start the widget when this.getParent() returns null??\n\t\t\t\tif(!this._started && (this.getParent() || {})._started){\n\t\t\t\t\tthis.startup();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\tdefer: function(fcn, delay){\n\t\t\t// summary:\n\t\t\t//\t\tWrapper to setTimeout to avoid deferred functions executing\n\t\t\t//\t\tafter the originating widget has been destroyed.\n\t\t\t//\t\tReturns an object handle with a remove method (that returns null) (replaces clearTimeout).\n\t\t\t// fcn: Function\n\t\t\t//\t\tFunction reference.\n\t\t\t// delay: Number?\n\t\t\t//\t\tDelay, defaults to 0.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tvar timer = setTimeout(lang.hitch(this,\n\t\t\t\tfunction(){\n\t\t\t\t\tif(!timer){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttimer = null;\n\t\t\t\t\tif(!this._destroyed){\n\t\t\t\t\t\tlang.hitch(this, fcn)();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tdelay || 0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tremove: function(){\n\t\t\t\t\tif(timer){\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\ttimer = null;\n\t\t\t\t\t}\n\t\t\t\t\treturn null; // so this works well: handle = handle.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\t_WidgetBase.extend(_BidiMixin);\n\t}\n\n\treturn _WidgetBase;\n});\n","define([\n\t\"dojo/_base/array\",\n\t\"dojo/_base/config\", // defaultDuration\n\t\"dojo/_base/lang\",\n\t\"../registry\",\n\t\"../main\"\t// for setting exports to dijit namespace\n], function(array, config, lang, registry, dijit){\n\n\t// module:\n\t//\t\tdijit/_base/manager\n\n\tvar exports = {\n\t\t// summary:\n\t\t//\t\tDeprecated.  Shim to methods on registry, plus a few other declarations.\n\t\t//\t\tNew code should access dijit/registry directly when possible.\n\t};\n\n\tarray.forEach([\"byId\", \"getUniqueId\", \"findWidgets\", \"_destroyAll\", \"byNode\", \"getEnclosingWidget\"], function(name){\n\t\texports[name] = registry[name];\n\t});\n\n\t lang.mixin(exports, {\n\t\t // defaultDuration: Integer\n\t\t //\t\tThe default fx.animation speed (in ms) to use for all Dijit\n\t\t //\t\ttransitional fx.animations, unless otherwise specified\n\t\t //\t\ton a per-instance basis. Defaults to 200, overrided by\n\t\t //\t\t`djConfig.defaultDuration`\n\t\t defaultDuration: config[\"defaultDuration\"] || 200\n\t });\n\n\tlang.mixin(dijit, exports);\n\n\t/*===== return exports; =====*/\n\treturn dijit;\t// for back compat :-(\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/dom\",\t\t\t// dom.byId\n\t\"dojo/dom-attr\", // domAttr.attr domAttr.has\n\t\"dojo/dom-style\", // domStyle.style\n\t\"dojo/_base/lang\", // lang.mixin()\n\t\"dojo/sniff\", // has(\"ie\") has(\"extend-dojo\")\n\t\"./main\"\t// for exporting methods to dijit namespace\n], function(array, dom, domAttr, domStyle, lang, has, dijit){\n\n\t// module:\n\t//\t\tdijit/a11y\n\n\tvar undefined;\n\n\tvar a11y = {\n\t\t// summary:\n\t\t//\t\tAccessibility utility functions (keyboard, tab stops, etc.)\n\n\t\t_isElementShown: function(/*Element*/ elem){\n\t\t\tvar s = domStyle.get(elem);\n\t\t\treturn (s.visibility != \"hidden\")\n\t\t\t\t&& (s.visibility != \"collapsed\")\n\t\t\t\t&& (s.display != \"none\")\n\t\t\t\t&& (domAttr.get(elem, \"type\") != \"hidden\");\n\t\t},\n\n\t\thasDefaultTabStop: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if element is tab-navigable even without an explicit tabIndex setting\n\n\t\t\t// No explicit tabIndex setting, need to investigate node type\n\t\t\tswitch(elem.nodeName.toLowerCase()){\n\t\t\t\tcase \"a\":\n\t\t\t\t\t// An <a> w/out a tabindex is only navigable if it has an href\n\t\t\t\t\treturn domAttr.has(elem, \"href\");\n\t\t\t\tcase \"area\":\n\t\t\t\tcase \"button\":\n\t\t\t\tcase \"input\":\n\t\t\t\tcase \"object\":\n\t\t\t\tcase \"select\":\n\t\t\t\tcase \"textarea\":\n\t\t\t\t\t// These are navigable by default\n\t\t\t\t\treturn true;\n\t\t\t\tcase \"iframe\":\n\t\t\t\t\t// If it's an editor <iframe> then it's tab navigable.\n\t\t\t\t\tvar body;\n\t\t\t\t\ttry{\n\t\t\t\t\t\t// non-IE\n\t\t\t\t\t\tvar contentDocument = elem.contentDocument;\n\t\t\t\t\t\tif(\"designMode\" in contentDocument && contentDocument.designMode == \"on\"){\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbody = contentDocument.body;\n\t\t\t\t\t}catch(e1){\n\t\t\t\t\t\t// contentWindow.document isn't accessible within IE7/8\n\t\t\t\t\t\t// if the iframe.src points to a foreign url and this\n\t\t\t\t\t\t// page contains an element, that could get focus\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tbody = elem.contentWindow.document.body;\n\t\t\t\t\t\t}catch(e2){\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn body && (body.contentEditable == 'true' ||\n\t\t\t\t\t\t(body.firstChild && body.firstChild.contentEditable == 'true'));\n\t\t\t\tdefault:\n\t\t\t\t\treturn elem.contentEditable == 'true';\n\t\t\t}\n\t\t},\n\n\t\teffectiveTabIndex: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tReturns effective tabIndex of an element, either a number, or undefined if element isn't focusable.\n\n\t\t\tif(domAttr.get(elem, \"disabled\")){\n\t\t\t\treturn undefined;\n\t\t\t}else if(domAttr.has(elem, \"tabIndex\")){\n\t\t\t\t// Explicit tab index setting\n\t\t\t\treturn +domAttr.get(elem, \"tabIndex\");// + to convert string --> number\n\t\t\t}else{\n\t\t\t\t// No explicit tabIndex setting, so depends on node type\n\t\t\t\treturn a11y.hasDefaultTabStop(elem) ? 0 : undefined;\n\t\t\t}\n\t\t},\n\n\t\tisTabNavigable: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if an element is tab-navigable\n\n\t\t\treturn a11y.effectiveTabIndex(elem) >= 0;\n\t\t},\n\n\t\tisFocusable: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if an element is focusable by tabbing to it, or clicking it with the mouse.\n\n\t\t\treturn a11y.effectiveTabIndex(elem) >= -1;\n\t\t},\n\n\t\t_getTabNavigable: function(/*DOMNode*/ root){\n\t\t\t// summary:\n\t\t\t//\t\tFinds descendants of the specified root node.\n\t\t\t// description:\n\t\t\t//\t\tFinds the following descendants of the specified root node:\n\t\t\t//\n\t\t\t//\t\t- the first tab-navigable element in document order\n\t\t\t//\t\t  without a tabIndex or with tabIndex=\"0\"\n\t\t\t//\t\t- the last tab-navigable element in document order\n\t\t\t//\t\t  without a tabIndex or with tabIndex=\"0\"\n\t\t\t//\t\t- the first element in document order with the lowest\n\t\t\t//\t\t  positive tabIndex value\n\t\t\t//\t\t- the last element in document order with the highest\n\t\t\t//\t\t  positive tabIndex value\n\t\t\tvar first, last, lowest, lowestTabindex, highest, highestTabindex, radioSelected = {};\n\n\t\t\tfunction radioName(node){\n\t\t\t\t// If this element is part of a radio button group, return the name for that group.\n\t\t\t\treturn node && node.tagName.toLowerCase() == \"input\" &&\n\t\t\t\t\tnode.type && node.type.toLowerCase() == \"radio\" &&\n\t\t\t\t\tnode.name && node.name.toLowerCase();\n\t\t\t}\n\n\t\t\tvar shown = a11y._isElementShown, effectiveTabIndex = a11y.effectiveTabIndex;\n\t\t\tvar walkTree = function(/*DOMNode*/ parent){\n\t\t\t\tfor(var child = parent.firstChild; child; child = child.nextSibling){\n\t\t\t\t\t// Skip text elements, hidden elements, and also non-HTML elements (those in custom namespaces) in IE,\n\t\t\t\t\t// since show() invokes getAttribute(\"type\"), which crash on VML nodes in IE.\n\t\t\t\t\tif(child.nodeType != 1 || (has(\"ie\") <= 9 && child.scopeName !== \"HTML\") || !shown(child)){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tabindex = effectiveTabIndex(child);\n\t\t\t\t\tif(tabindex >= 0){\n\t\t\t\t\t\tif(tabindex == 0){\n\t\t\t\t\t\t\tif(!first){\n\t\t\t\t\t\t\t\tfirst = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlast = child;\n\t\t\t\t\t\t}else if(tabindex > 0){\n\t\t\t\t\t\t\tif(!lowest || tabindex < lowestTabindex){\n\t\t\t\t\t\t\t\tlowestTabindex = tabindex;\n\t\t\t\t\t\t\t\tlowest = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(!highest || tabindex >= highestTabindex){\n\t\t\t\t\t\t\t\thighestTabindex = tabindex;\n\t\t\t\t\t\t\t\thighest = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar rn = radioName(child);\n\t\t\t\t\t\tif(domAttr.get(child, \"checked\") && rn){\n\t\t\t\t\t\t\tradioSelected[rn] = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(child.nodeName.toUpperCase() != 'SELECT'){\n\t\t\t\t\t\twalkTree(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tif(shown(root)){\n\t\t\t\twalkTree(root);\n\t\t\t}\n\t\t\tfunction rs(node){\n\t\t\t\t// substitute checked radio button for unchecked one, if there is a checked one with the same name.\n\t\t\t\treturn radioSelected[radioName(node)] || node;\n\t\t\t}\n\n\t\t\treturn { first: rs(first), last: rs(last), lowest: rs(lowest), highest: rs(highest) };\n\t\t},\n\n\t\tgetFirstInTabbingOrder: function(/*String|DOMNode*/ root, /*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the descendant of the specified root node\n\t\t\t//\t\tthat is first in the tabbing order\n\t\t\tvar elems = a11y._getTabNavigable(dom.byId(root, doc));\n\t\t\treturn elems.lowest ? elems.lowest : elems.first; // DomNode\n\t\t},\n\n\t\tgetLastInTabbingOrder: function(/*String|DOMNode*/ root, /*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the descendant of the specified root node\n\t\t\t//\t\tthat is last in the tabbing order\n\t\t\tvar elems = a11y._getTabNavigable(dom.byId(root, doc));\n\t\t\treturn elems.last ? elems.last : elems.highest; // DomNode\n\t\t}\n\t};\n\n\thas(\"extend-dojo\") && lang.mixin(dijit, a11y);\n\n\treturn a11y;\n});\n","define([\n\t\"dojo/keys\", // keys.ENTER keys.SPACE\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/touch\" // touch support for click is now there\n], function(keys, mouse, on, touch){\n\n\t// module:\n\t//\t\tdijit/a11yclick\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tCustom press, release, and click synthetic events\n\t\t//\t\twhich trigger on a left mouse click, touch, or space/enter keyup.\n\n\t\tclick: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tLogical click operation for mouse, touch, or keyboard (space/enter key)\n\t\t},\n\t\tpress: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMousedown (left button), touchstart, or keydown (space or enter) corresponding to logical click operation.\n\t\t},\n\t\trelease: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMouseup (left button), touchend, or keyup (space or enter) corresponding to logical click operation.\n\t\t},\n\t\tmove: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMouse cursor or a finger is dragged over the given node.\n\t\t}\n\t};\n\t=====*/\n\n\tfunction clickKey(/*Event*/ e){\n\t\t// Test if this keyboard event should be tracked as the start (if keydown) or end (if keyup) of a click event.\n\t\t// Only track for nodes marked to be tracked, and not for buttons or inputs,\n\t\t// since buttons handle keyboard click natively, and text inputs should not\n\t\t// prevent typing spaces or newlines.\n\t\tif((e.keyCode === keys.ENTER || e.keyCode === keys.SPACE) && !/input|button|textarea/i.test(e.target.nodeName)){\n\n\t\t\t// Test if a node or its ancestor has been marked with the dojoClick property to indicate special processing\n\t\t\tfor(var node = e.target; node; node = node.parentNode){\n\t\t\t\tif(node.dojoClick){ return true; }\n\t\t\t}\n\t\t}\n\t}\n\n\tvar lastKeyDownNode;\n\n\ton(document, \"keydown\", function(e){\n\t\t//console.log(\"a11yclick: onkeydown, e.target = \", e.target, \", lastKeyDownNode was \", lastKeyDownNode, \", equality is \", (e.target === lastKeyDownNode));\n\t\tif(clickKey(e)){\n\t\t\t// needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work\n\t\t\tlastKeyDownNode = e.target;\n\n\t\t\t// Prevent viewport scrolling on space key in IE<9.\n\t\t\t// (Reproducible on test_Button.html on any of the first dijit/form/Button examples)\n\t\t\te.preventDefault();\n\t\t}else{\n\t\t\tlastKeyDownNode = null;\n\t\t}\n\t});\n\n\ton(document, \"keyup\", function(e){\n\t\t//console.log(\"a11yclick: onkeyup, e.target = \", e.target, \", lastKeyDownNode was \", lastKeyDownNode, \", equality is \", (e.target === lastKeyDownNode));\n\t\tif(clickKey(e) && e.target == lastKeyDownNode){\t// === breaks greasemonkey\n\t\t\t//need reset here or have problems in FF when focus returns to trigger element after closing popup/alert\n\t\t\tlastKeyDownNode = null;\n\n\t\t\ton.emit(e.target, \"click\", {\n\t\t\t\tcancelable: true,\n\t\t\t\tbubbles: true,\n\t\t\t\tctrlKey: e.ctrlKey,\n\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\taltKey: e.altKey,\n\t\t\t\t_origType: e.type\n\t\t\t});\n\t\t}\n\t});\n\n\t// I want to return a hash of the synthetic events, but for backwards compatibility the main return value\n\t// needs to be the click event.   Change for 2.0.\n\n\tvar click = function(node, listener){\n\t\t// Set flag on node so that keydown/keyup above emits click event.\n\t\t// Also enables fast click processing from dojo/touch.\n\t\tnode.dojoClick = true;\n\n\t\treturn on(node, \"click\", listener);\n\t};\n\tclick.click = click;\t// forward compatibility with 2.0\n\n\tclick.press =  function(node, listener){\n\t\tvar touchListener = on(node, touch.press, function(evt){\n\t\t\tif(evt.type == \"mousedown\" && !mouse.isLeft(evt)){\n\t\t\t\t// Ignore right click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlistener(evt);\n\t\t}), keyListener = on(node, \"keydown\", function(evt){\n\t\t\tif(evt.keyCode === keys.ENTER || evt.keyCode === keys.SPACE){\n\t\t\t\tlistener(evt);\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\tremove: function(){\n\t\t\t\ttouchListener.remove();\n\t\t\t\tkeyListener.remove();\n\t\t\t}\n\t\t};\n\t};\n\n\tclick.release =  function(node, listener){\n\t\tvar touchListener = on(node, touch.release, function(evt){\n\t\t\tif(evt.type == \"mouseup\" && !mouse.isLeft(evt)){\n\t\t\t\t// Ignore right click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlistener(evt);\n\t\t}), keyListener = on(node, \"keyup\", function(evt){\n\t\t\tif(evt.keyCode === keys.ENTER || evt.keyCode === keys.SPACE){\n\t\t\t\tlistener(evt);\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\tremove: function(){\n\t\t\t\ttouchListener.remove();\n\t\t\t\tkeyListener.remove();\n\t\t\t}\n\t\t};\n\t};\n\n\tclick.move = touch.move;\t// just for convenience\n\n\treturn click;\n});\n","define([\n\t\"dojo/aspect\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // domAttr.get dom.isDescendant\n\t\"dojo/dom-attr\", // domAttr.get dom.isDescendant\n\t\"dojo/dom-class\",\n\t\"dojo/dom-construct\", // connect to domConstruct.empty, domConstruct.destroy\n\t\"dojo/Evented\",\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/on\",\n\t\"dojo/domReady\",\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"dojo/Stateful\",\n\t\"dojo/_base/window\", // win.body\n\t\"dojo/window\", // winUtils.get\n\t\"./a11y\",\t// a11y.isTabNavigable\n\t\"./registry\",\t// registry.byId\n\t\"./main\"\t\t// to set dijit.focus\n], function(aspect, declare, dom, domAttr, domClass, domConstruct, Evented, lang, on, domReady, has, Stateful, win, winUtils,\n\t\t\ta11y, registry, dijit){\n\n\t// module:\n\t//\t\tdijit/focus\n\n\t// Time of the last focusin event\n\tvar lastFocusin;\n\n\t// Time of the last touch/mousedown or focusin event\n\tvar lastTouchOrFocusin;\n\n\tvar FocusManager = declare([Stateful, Evented], {\n\t\t// summary:\n\t\t//\t\tTracks the currently focused node, and which widgets are currently \"active\".\n\t\t//\t\tAccess via require([\"dijit/focus\"], function(focus){ ... }).\n\t\t//\n\t\t//\t\tA widget is considered active if it or a descendant widget has focus,\n\t\t//\t\tor if a non-focusable node of this widget or a descendant was recently clicked.\n\t\t//\n\t\t//\t\tCall focus.watch(\"curNode\", callback) to track the current focused DOMNode,\n\t\t//\t\tor focus.watch(\"activeStack\", callback) to track the currently focused stack of widgets.\n\t\t//\n\t\t//\t\tCall focus.on(\"widget-blur\", func) or focus.on(\"widget-focus\", ...) to monitor when\n\t\t//\t\twhen widgets become active/inactive\n\t\t//\n\t\t//\t\tFinally, focus(node) will focus a node, suppressing errors if the node doesn't exist.\n\n\t\t// curNode: DomNode\n\t\t//\t\tCurrently focused item on screen\n\t\tcurNode: null,\n\n\t\t// activeStack: dijit/_WidgetBase[]\n\t\t//\t\tList of currently active widgets (focused widget and it's ancestors)\n\t\tactiveStack: [],\n\n\t\tconstructor: function(){\n\t\t\t// Don't leave curNode/prevNode pointing to bogus elements\n\t\t\tvar check = lang.hitch(this, function(node){\n\t\t\t\tif(dom.isDescendant(this.curNode, node)){\n\t\t\t\t\tthis.set(\"curNode\", null);\n\t\t\t\t}\n\t\t\t\tif(dom.isDescendant(this.prevNode, node)){\n\t\t\t\t\tthis.set(\"prevNode\", null);\n\t\t\t\t}\n\t\t\t});\n\t\t\taspect.before(domConstruct, \"empty\", check);\n\t\t\taspect.before(domConstruct, \"destroy\", check);\n\t\t},\n\n\t\tregisterIframe: function(/*DomNode*/ iframe){\n\t\t\t// summary:\n\t\t\t//\t\tRegisters listeners on the specified iframe so that any click\n\t\t\t//\t\tor focus event on that iframe (or anything in it) is reported\n\t\t\t//\t\tas a focus/click event on the `<iframe>` itself.\n\t\t\t// description:\n\t\t\t//\t\tCurrently only used by editor.\n\t\t\t// returns:\n\t\t\t//\t\tHandle with remove() method to deregister.\n\t\t\treturn this.registerWin(iframe.contentWindow, iframe);\n\t\t},\n\n\t\tregisterWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){\n\t\t\t// summary:\n\t\t\t//\t\tRegisters listeners on the specified window (either the main\n\t\t\t//\t\twindow or an iframe's window) to detect when the user has clicked somewhere\n\t\t\t//\t\tor focused somewhere.\n\t\t\t// description:\n\t\t\t//\t\tUsers should call registerIframe() instead of this method.\n\t\t\t// targetWindow:\n\t\t\t//\t\tIf specified this is the window associated with the iframe,\n\t\t\t//\t\ti.e. iframe.contentWindow.\n\t\t\t// effectiveNode:\n\t\t\t//\t\tIf specified, report any focus events inside targetWindow as\n\t\t\t//\t\tan event on effectiveNode, rather than on evt.target.\n\t\t\t// returns:\n\t\t\t//\t\tHandle with remove() method to deregister.\n\n\t\t\t// TODO: make this function private in 2.0; Editor/users should call registerIframe(),\n\n\t\t\t// Listen for blur and focus events on targetWindow's document.\n\t\t\tvar _this = this,\n\t\t\t\tbody = targetWindow.document && targetWindow.document.body;\n\n\t\t\tif(body){\n\t\t\t\t// Listen for touches or mousedowns... could also use dojo/touch.press here.\n\t\t\t\tvar event = has(\"pointer-events\") ? \"pointerdown\" : has(\"MSPointer\") ? \"MSPointerDown\" :\n\t\t\t\t\thas(\"touch-events\") ? \"mousedown, touchstart\" : \"mousedown\";\n\t\t\t\tvar mdh = on(targetWindow.document, event, function(evt){\n\t\t\t\t\t// workaround weird IE bug where the click is on an orphaned node\n\t\t\t\t\t// (first time clicking a Select/DropDownButton inside a TooltipDialog).\n\t\t\t\t\t// actually, strangely this is happening on latest chrome too.\n\t\t\t\t\tif(evt && evt.target && evt.target.parentNode == null){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t_this._onTouchNode(effectiveNode || evt.target, \"mouse\");\n\t\t\t\t});\n\n\t\t\t\tvar fih = on(body, 'focusin', function(evt){\n\t\t\t\t\t// When you refocus the browser window, IE gives an event with an empty srcElement\n\t\t\t\t\tif(!evt.target.tagName) { return; }\n\n\t\t\t\t\t// IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,\n\t\t\t\t\t// ignore those events\n\t\t\t\t\tvar tag = evt.target.tagName.toLowerCase();\n\t\t\t\t\tif(tag == \"#document\" || tag == \"body\"){ return; }\n\n\t\t\t\t\tif(a11y.isFocusable(evt.target)){\n\t\t\t\t\t\t_this._onFocusNode(effectiveNode || evt.target);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// Previous code called _onTouchNode() for any activate event on a non-focusable node.   Can\n\t\t\t\t\t\t// probably just ignore such an event as it will be handled by onmousedown handler above, but\n\t\t\t\t\t\t// leaving the code for now.\n\t\t\t\t\t\t_this._onTouchNode(effectiveNode || evt.target);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tvar foh = on(body, 'focusout', function(evt){\n\t\t\t\t\t_this._onBlurNode(effectiveNode || evt.target);\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tremove: function(){\n\t\t\t\t\t\tmdh.remove();\n\t\t\t\t\t\tfih.remove();\n\t\t\t\t\t\tfoh.remove();\n\t\t\t\t\t\tmdh = fih = foh = null;\n\t\t\t\t\t\tbody = null;\t// prevent memory leak (apparent circular reference via closure)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t_onBlurNode: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when focus leaves a node.\n\t\t\t//\t\tUsually ignored, _unless_ it *isn't* followed by touching another node,\n\t\t\t//\t\twhich indicates that we tabbed off the last field on the page,\n\t\t\t//\t\tin which case every widget is marked inactive\n\n\t\t\tvar now = (new Date()).getTime();\n\n\t\t\t// IE9+ and chrome have a problem where focusout events come after the corresponding focusin event.\n\t\t\t// For chrome problem see https://bugs.dojotoolkit.org/ticket/17668.\n\t\t\t// IE problem happens when moving focus from the Editor's <iframe> to a normal DOMNode.\n\t\t\tif(now < lastFocusin + 100){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the blur event isn't followed by a focus event, it means the user clicked on something unfocusable,\n\t\t\t// so clear focus.\n\t\t\tif(this._clearFocusTimer){\n\t\t\t\tclearTimeout(this._clearFocusTimer);\n\t\t\t}\n\t\t\tthis._clearFocusTimer = setTimeout(lang.hitch(this, function(){\n\t\t\t\tthis.set(\"prevNode\", this.curNode);\n\t\t\t\tthis.set(\"curNode\", null);\n\t\t\t}), 0);\n\n\t\t\t// Unset timer to zero-out widget stack; we'll reset it below if appropriate.\n\t\t\tif(this._clearActiveWidgetsTimer){\n\t\t\t\tclearTimeout(this._clearActiveWidgetsTimer);\n\t\t\t}\n\n\t\t\tif(now < lastTouchOrFocusin + 100){\n\t\t\t\t// This blur event is coming late (after the call to _onTouchNode() rather than before.\n\t\t\t\t// So let _onTouchNode() handle setting the widget stack.\n\t\t\t\t// See https://bugs.dojotoolkit.org/ticket/17668\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the blur event isn't followed (or preceded) by a focus or touch event then mark all widgets as inactive.\n\t\t\tthis._clearActiveWidgetsTimer = setTimeout(lang.hitch(this, function(){\n\t\t\t\tdelete this._clearActiveWidgetsTimer;\n\t\t\t\tthis._setStack([]);\n\t\t\t}), 0);\n\t\t},\n\n\t\t_onTouchNode: function(/*DomNode*/ node, /*String*/ by){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when node is focused or touched.\n\t\t\t//\t\tNote that _onFocusNode() calls _onTouchNode().\n\t\t\t// node:\n\t\t\t//\t\tThe node that was touched.\n\t\t\t// by:\n\t\t\t//\t\t\"mouse\" if the focus/touch was caused by a mouse down event\n\n\t\t\t// Keep track of time of last focusin or touch event.\n\t\t\tlastTouchOrFocusin = (new Date()).getTime();\n\n\t\t\tif(this._clearActiveWidgetsTimer){\n\t\t\t\t// forget the recent blur event\n\t\t\t\tclearTimeout(this._clearActiveWidgetsTimer);\n\t\t\t\tdelete this._clearActiveWidgetsTimer;\n\t\t\t}\n\n\t\t\t// if the click occurred on the scrollbar of a dropdown, treat it as a click on the dropdown,\n\t\t\t// even though the scrollbar is technically on the popup wrapper (see #10631)\n\t\t\tif(domClass.contains(node, \"dijitPopup\")){\n\t\t\t\tnode = node.firstChild;\n\t\t\t}\n\n\t\t\t// compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)\n\t\t\tvar newStack=[];\n\t\t\ttry{\n\t\t\t\twhile(node){\n\t\t\t\t\tvar popupParent = domAttr.get(node, \"dijitPopupParent\");\n\t\t\t\t\tif(popupParent){\n\t\t\t\t\t\tnode=registry.byId(popupParent).domNode;\n\t\t\t\t\t}else if(node.tagName && node.tagName.toLowerCase() == \"body\"){\n\t\t\t\t\t\t// is this the root of the document or just the root of an iframe?\n\t\t\t\t\t\tif(node === win.body()){\n\t\t\t\t\t\t\t// node is the root of the main document\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// otherwise, find the iframe this node refers to (can't access it via parentNode,\n\t\t\t\t\t\t// need to do this trick instead). window.frameElement is supported in IE/FF/Webkit\n\t\t\t\t\t\tnode=winUtils.get(node.ownerDocument).frameElement;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// if this node is the root node of a widget, then add widget id to stack,\n\t\t\t\t\t\t// except ignore clicks on disabled widgets (actually focusing a disabled widget still works,\n\t\t\t\t\t\t// to support MenuItem)\n\t\t\t\t\t\tvar id = node.getAttribute && node.getAttribute(\"widgetId\"),\n\t\t\t\t\t\t\twidget = id && registry.byId(id);\n\t\t\t\t\t\tif(widget && !(by == \"mouse\" && widget.get(\"disabled\"))){\n\t\t\t\t\t\t\tnewStack.unshift(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode=node.parentNode;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}catch(e){ /* squelch */ }\n\n\t\t\tthis._setStack(newStack, by);\n\t\t},\n\n\t\t_onFocusNode: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when node is focused\n\n\t\t\tif(!node){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(node.nodeType == 9){\n\t\t\t\t// Ignore focus events on the document itself.  This is here so that\n\t\t\t\t// (for example) clicking the up/down arrows of a spinner\n\t\t\t\t// (which don't get focus) won't cause that widget to blur. (FF issue)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Keep track of time of last focusin event.\n\t\t\tlastFocusin = (new Date()).getTime();\n\n\t\t\t// There was probably a blur event right before this event, but since we have a new focus,\n\t\t\t// forget about the blur\n\t\t\tif(this._clearFocusTimer){\n\t\t\t\tclearTimeout(this._clearFocusTimer);\n\t\t\t\tdelete this._clearFocusTimer;\n\t\t\t}\n\n\t\t\tthis._onTouchNode(node);\n\n\t\t\tif(node == this.curNode){ return; }\n\t\t\tthis.set(\"prevNode\", this.curNode);\n\t\t\tthis.set(\"curNode\", node);\n\t\t},\n\n\t\t_setStack: function(/*String[]*/ newStack, /*String*/ by){\n\t\t\t// summary:\n\t\t\t//\t\tThe stack of active widgets has changed.  Send out appropriate events and records new stack.\n\t\t\t// newStack:\n\t\t\t//\t\tarray of widget id's, starting from the top (outermost) widget\n\t\t\t// by:\n\t\t\t//\t\t\"mouse\" if the focus/touch was caused by a mouse down event\n\n\t\t\tvar oldStack = this.activeStack, lastOldIdx = oldStack.length - 1, lastNewIdx = newStack.length - 1;\n\n\t\t\tif(newStack[lastNewIdx] == oldStack[lastOldIdx]){\n\t\t\t\t// no changes, return now to avoid spurious notifications about changes to activeStack\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.set(\"activeStack\", newStack);\n\n\t\t\tvar widget, i;\n\n\t\t\t// for all elements that have gone out of focus, set focused=false\n\t\t\tfor(i = lastOldIdx; i >= 0 && oldStack[i] != newStack[i]; i--){\n\t\t\t\twidget = registry.byId(oldStack[i]);\n\t\t\t\tif(widget){\n\t\t\t\t\twidget._hasBeenBlurred = true;\t\t// TODO: used by form widgets, should be moved there\n\t\t\t\t\twidget.set(\"focused\", false);\n\t\t\t\t\tif(widget._focusManager == this){\n\t\t\t\t\t\twidget._onBlur(by);\n\t\t\t\t\t}\n\t\t\t\t\tthis.emit(\"widget-blur\", widget, by);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for all element that have come into focus, set focused=true\n\t\t\tfor(i++; i <= lastNewIdx; i++){\n\t\t\t\twidget = registry.byId(newStack[i]);\n\t\t\t\tif(widget){\n\t\t\t\t\twidget.set(\"focused\", true);\n\t\t\t\t\tif(widget._focusManager == this){\n\t\t\t\t\t\twidget._onFocus(by);\n\t\t\t\t\t}\n\t\t\t\t\tthis.emit(\"widget-focus\", widget, by);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfocus: function(node){\n\t\t\t// summary:\n\t\t\t//\t\tFocus the specified node, suppressing errors if they occur\n\t\t\tif(node){\n\t\t\t\ttry{ node.focus(); }catch(e){/*quiet*/}\n\t\t\t}\n\t\t}\n\t});\n\n\tvar singleton = new FocusManager();\n\n\t// register top window and all the iframes it contains\n\tdomReady(function(){\n\t\tvar handle = singleton.registerWin(winUtils.get(document));\n\t\tif(has(\"ie\")){\n\t\t\ton(window, \"unload\", function(){\n\t\t\t\tif(handle){\t// because this gets called twice when doh.robot is running\n\t\t\t\t\thandle.remove();\n\t\t\t\t\thandle = null;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility)\n\t// as a function to set focus.   Remove for 2.0.\n\tdijit.focus = function(node){\n\t\tsingleton.focus(node);\t// indirection here allows dijit/_base/focus.js to override behavior\n\t};\n\tfor(var attr in singleton){\n\t\tif(!/^_/.test(attr)){\n\t\t\tdijit.focus[attr] = typeof singleton[attr] == \"function\" ? lang.hitch(singleton, attr) : singleton[attr];\n\t\t}\n\t}\n\tsingleton.watch(function(attr, oldVal, newVal){\n\t\tdijit.focus[attr] = newVal;\n\t});\n\n\treturn singleton;\n});\n","define([\n\t\"require\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-class\", // domClass.toggle\n\t\"dojo/has\", // has(\"dijit-legacy-requires\")\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.trim\n\t\"dojo/ready\",\n\t\"./_FormWidget\",\n\t\"./_ButtonMixin\",\n\t\"dojo/text!./templates/Button.html\",\n\t\"../a11yclick\"\t// template uses ondijitclick\n], function(require, declare, domClass, has, kernel, lang, ready, _FormWidget, _ButtonMixin, template){\n\n\t// module:\n\t//\t\tdijit/form/Button\n\n\t// Back compat w/1.6, remove for 2.0\n\tif(has(\"dijit-legacy-requires\")){\n\t\tready(0, function(){\n\t\t\tvar requires = [\"dijit/form/DropDownButton\", \"dijit/form/ComboButton\", \"dijit/form/ToggleButton\"];\n\t\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t\t});\n\t}\n\n\tvar Button = declare(\"dijit.form.Button\" + (has(\"dojo-bidi\") ? \"_NoBidi\" : \"\"), [_FormWidget, _ButtonMixin], {\n\t\t// summary:\n\t\t//\t\tBasically the same thing as a normal HTML button, but with special styling.\n\t\t// description:\n\t\t//\t\tButtons can display a label, an icon, or both.\n\t\t//\t\tA label should always be specified (through innerHTML) or the label\n\t\t//\t\tattribute.  It can be hidden via showLabel=false.\n\t\t// example:\n\t\t// |\t<button data-dojo-type=\"dijit/form/Button\" onClick=\"...\">Hello world</button>\n\t\t//\n\t\t// example:\n\t\t// |\tvar button1 = new Button({label: \"hello world\", onClick: foo});\n\t\t// |\tdojo.body().appendChild(button1.domNode);\n\n\t\t// showLabel: Boolean\n\t\t//\t\tSet this to true to hide the label text and display only the icon.\n\t\t//\t\t(If showLabel=false then iconClass must be specified.)\n\t\t//\t\tEspecially useful for toolbars.\n\t\t//\t\tIf showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon.\n\t\t//\n\t\t//\t\tThe exception case is for computers in high-contrast mode, where the label\n\t\t//\t\twill still be displayed, since the icon doesn't appear.\n\t\tshowLabel: true,\n\n\t\t// iconClass: String\n\t\t//\t\tClass to apply to DOMNode in button to make it display an icon\n\t\ticonClass: \"dijitNoIcon\",\n\t\t_setIconClassAttr: { node: \"iconNode\", type: \"class\" },\n\n\t\tbaseClass: \"dijitButton\",\n\n\t\ttemplateString: template,\n\n\t\t// Map widget attributes to DOMNode attributes.\n\t\t_setValueAttr: \"valueNode\",\n\t\t_setNameAttr: function(name){\n\t\t\t// avoid breaking existing subclasses where valueNode undefined.  Perhaps in 2.0 require it to be defined?\n\t\t\tif(this.valueNode){\n\t\t\t\tthis.valueNode.setAttribute(\"name\", name);\n\t\t\t}\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._setLabelFromContainer();\n\t\t},\n\n\t\t_setLabelFromContainer: function(){\n\t\t\tif(this.containerNode && !this.label){\n\t\t\t\t// When markup was set as srcNodeRef.innerHTML, copy it to this.label, in case someone tries to\n\t\t\t\t// reference that variable.  Alternately, could have a _getLabelAttr() method to return\n\t\t\t\t// this.containerNode.innerHTML.\n\t\t\t\tthis.label = lang.trim(this.containerNode.innerHTML);\n\t\t\t\tthis.onLabelSet();\t\t// set this.titleNode.title etc. according to label\n\t\t\t}\n\t\t},\n\n\t\t_setShowLabelAttr: function(val){\n\t\t\tif(this.containerNode){\n\t\t\t\tdomClass.toggle(this.containerNode, \"dijitDisplayNone\", !val);\n\t\t\t}\n\t\t\tthis._set(\"showLabel\", val);\n\t\t},\n\n\t\tsetLabel: function(/*String*/ content){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use set('label', ...) instead.\n\t\t\tkernel.deprecated(\"dijit.form.Button.setLabel() is deprecated.  Use set('label', ...) instead.\", \"\", \"2.0\");\n\t\t\tthis.set(\"label\", content);\n\t\t},\n\n\t\tonLabelSet: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tif(!this.showLabel && !(\"title\" in this.params)){\n\t\t\t\tthis.titleNode.title = lang.trim(this.containerNode.innerText || this.containerNode.textContent || '');\n\t\t\t}\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\tButton = declare(\"dijit.form.Button\", Button, {\n\t\t\tonLabelSet: function(){\n\t\t\t\tthis.inherited(arguments);\n\t\t\t\tif(this.titleNode.title){\n\t\t\t\t\tthis.applyTextDir(this.titleNode, this.titleNode.title);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_setTextDirAttr: function(/*String*/ textDir){\n\t\t\t\tif(this._created && this.textDir != textDir){\n\t\t\t\t\tthis._set(\"textDir\", textDir);\n\t\t\t\t\tthis._setLabelAttr(this.label); // call applyTextDir on both focusNode and titleNode\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\treturn Button;\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-attr\", // domAttr.set\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"../_Widget\",\n\t\"../_TemplatedMixin\",\n\t\"./_FormMixin\",\n\t\"../layout/_ContentPaneResizeMixin\"\n], function(declare, domAttr, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){\n\n\t// module:\n\t//\t\tdijit/form/Form\n\n\n\treturn declare(\"dijit.form.Form\", [_Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin], {\n\t\t// summary:\n\t\t//\t\tWidget corresponding to HTML form tag, for validation and serialization\n\t\t//\n\t\t// example:\n\t\t//\t|\t<form data-dojo-type=\"dijit/form/Form\" id=\"myForm\">\n\t\t//\t|\t\tName: <input type=\"text\" name=\"name\" />\n\t\t//\t|\t</form>\n\t\t//\t|\t// Example assumes you have required dijit/registry\n\t\t//\t|\tmyObj = {name: \"John Doe\"};\n\t\t//\t|\tregistry.byId('myForm').set('value', myObj);\n\t\t//\t|\n\t\t//\t|\tmyObj=registry.byId('myForm').get('value');\n\n\t\t// HTML <FORM> attributes\n\n\t\t// name: String?\n\t\t//\t\tName of form for scripting.\n\t\tname: \"\",\n\n\t\t// action: String?\n\t\t//\t\tServer-side form handler.\n\t\taction: \"\",\n\n\t\t// method: String?\n\t\t//\t\tHTTP method used to submit the form, either \"GET\" or \"POST\".\n\t\tmethod: \"\",\n\n\t\t// encType: String?\n\t\t//\t\tEncoding type for the form, ex: application/x-www-form-urlencoded.\n\t\tencType: \"\",\n\n\t\t// accept-charset: String?\n\t\t//\t\tList of supported charsets.\n\t\t\"accept-charset\": \"\",\n\n\t\t// accept: String?\n\t\t//\t\tList of MIME types for file upload.\n\t\taccept: \"\",\n\n\t\t// target: String?\n\t\t//\t\tTarget frame for the document to be opened in.\n\t\ttarget: \"\",\n\n\t\ttemplateString: \"<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>\",\n\n\t\tpostMixInProperties: function(){\n\t\t\t// Setup name=foo string to be referenced from the template (but only if a name has been specified)\n\t\t\t// Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8660\n\t\t\tthis.nameAttrSetting = this.name ? (\"name='\" + this.name + \"'\") : \"\";\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\texecute: function(/*Object*/ /*===== formContents =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated: use submit()\n\t\t\t// tags:\n\t\t\t//\t\tdeprecated\n\t\t},\n\n\t\tonExecute: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated: use onSubmit()\n\t\t\t// tags:\n\t\t\t//\t\tdeprecated\n\t\t},\n\n\t\t_setEncTypeAttr: function(/*String*/ value){\n\t\t\tdomAttr.set(this.domNode, \"encType\", value);\n\t\t\tif(has(\"ie\")){\n\t\t\t\tthis.domNode.encoding = value;\n\t\t\t}\n\t\t\tthis._set(\"encType\", value);\n\t\t},\n\n\t\treset: function(/*Event?*/ e){\n\t\t\t// summary:\n\t\t\t//\t\trestores all widget values back to their init values,\n\t\t\t//\t\tcalls onReset() which can cancel the reset by returning false\n\n\t\t\t// create fake event so we can know if preventDefault() is called\n\t\t\tvar faux = {\n\t\t\t\treturnValue: true, // the IE way\n\t\t\t\tpreventDefault: function(){ // not IE\n\t\t\t\t\tthis.returnValue = false;\n\t\t\t\t},\n\t\t\t\tstopPropagation: function(){\n\t\t\t\t},\n\t\t\t\tcurrentTarget: e ? e.target : this.domNode,\n\t\t\t\ttarget: e ? e.target : this.domNode\n\t\t\t};\n\t\t\t// if return value is not exactly false, and haven't called preventDefault(), then reset\n\t\t\tif(!(this.onReset(faux) === false) && faux.returnValue){\n\t\t\t\tthis.inherited(arguments, []);\n\t\t\t}\n\t\t},\n\n\t\tonReset: function(/*Event?*/ /*===== e =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when user resets the form. This method is intended\n\t\t\t//\t\tto be over-ridden. When the `reset` method is called\n\t\t\t//\t\tprogrammatically, the return value from `onReset` is used\n\t\t\t//\t\tto compute whether or not resetting should proceed\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t\treturn true; // Boolean\n\t\t},\n\n\t\t_onReset: function(e){\n\t\t\tthis.reset(e);\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\treturn false;\n\t\t},\n\n\t\t_onSubmit: function(e){\n\t\t\tvar fp = this.constructor.prototype;\n\t\t\t// TODO: remove this if statement beginning with 2.0\n\t\t\tif(this.execute != fp.execute || this.onExecute != fp.onExecute){\n\t\t\t\tkernel.deprecated(\"dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.\", \"\", \"2.0\");\n\t\t\t\tthis.onExecute();\n\t\t\t\tthis.execute(this.getValues());\n\t\t\t}\n\t\t\tif(this.onSubmit(e) === false){ // only exactly false stops submit\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\tonSubmit: function(/*Event?*/ /*===== e =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when user submits the form.\n\t\t\t// description:\n\t\t\t//\t\tThis method is intended to be over-ridden, but by default it checks and\n\t\t\t//\t\treturns the validity of form elements. When the `submit`\n\t\t\t//\t\tmethod is called programmatically, the return value from\n\t\t\t//\t\t`onSubmit` is used to compute whether or not submission\n\t\t\t//\t\tshould proceed\n\t\t\t// tags:\n\t\t\t//\t\textension\n\n\t\t\treturn this.isValid(); // Boolean\n\t\t},\n\n\t\tsubmit: function(){\n\t\t\t// summary:\n\t\t\t//\t\tprogrammatically submit form if and only if the `onSubmit` returns true\n\t\t\tif(!(this.onSubmit() === false)){\n\t\t\t\tthis.containerNode.submit();\n\t\t\t}\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-construct\", // domConstruct.create\n\t\"dojo/dom-style\", // domStyle.getComputedStyle\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"ie\") has(\"mozilla\")\n\t\"./_FormValueWidget\",\n\t\"./_TextBoxMixin\",\n\t\"dojo/text!./templates/TextBox.html\",\n\t\"../main\"\t// to export dijit._setSelectionRange, remove in 2.0\n], function(declare, domConstruct, domStyle, kernel, lang, on, has,\n\t\t\t_FormValueWidget, _TextBoxMixin, template, dijit){\n\n\t// module:\n\t//\t\tdijit/form/TextBox\n\n\tvar TextBox = declare(\"dijit.form.TextBox\" + (has(\"dojo-bidi\") ? \"_NoBidi\" : \"\"), [_FormValueWidget, _TextBoxMixin], {\n\t\t// summary:\n\t\t//\t\tA base class for textbox form inputs\n\n\t\ttemplateString: template,\n\t\t_singleNodeTemplate: '<input class=\"dijit dijitReset dijitLeft dijitInputField\" data-dojo-attach-point=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />',\n\n\t\t_buttonInputDisabled: has(\"ie\") ? \"disabled\" : \"\", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events\n\n\t\tbaseClass: \"dijitTextBox\",\n\n\t\tpostMixInProperties: function(){\n\t\t\tvar type = this.type.toLowerCase();\n\t\t\tif(this.templateString && this.templateString.toLowerCase() == \"input\" || ((type == \"hidden\" || type == \"file\") && this.templateString == this.constructor.prototype.templateString)){\n\t\t\t\tthis.templateString = this._singleNodeTemplate;\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif(has(\"ie\") < 9){\n\t\t\t\t// IE INPUT tag fontFamily has to be set directly using STYLE\n\t\t\t\t// the defer gives IE a chance to render the TextBox and to deal with font inheritance\n\t\t\t\tthis.defer(function(){\n\t\t\t\t\ttry{\n\t\t\t\t\t\tvar s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed\n\t\t\t\t\t\tif(s){\n\t\t\t\t\t\t\tvar ff = s.fontFamily;\n\t\t\t\t\t\t\tif(ff){\n\t\t\t\t\t\t\t\tvar inputs = this.domNode.getElementsByTagName(\"INPUT\");\n\t\t\t\t\t\t\t\tif(inputs){\n\t\t\t\t\t\t\t\t\tfor(var i=0; i < inputs.length; i++){\n\t\t\t\t\t\t\t\t\t\tinputs[i].style.fontFamily = ff;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){/*when used in a Dialog, and this is called before the dialog is\n\t\t\t\t\t shown, s.fontFamily would trigger \"Invalid Argument\" error.*/}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t_setPlaceHolderAttr: function(v){\n\t\t\tthis._set(\"placeHolder\", v);\n\t\t\tif(!this._phspan){\n\t\t\t\tthis._attachPoints.push('_phspan');\n\t\t\t\tthis._phspan = domConstruct.create('span', {\n\t\t\t\t\t// dijitInputField class gives placeHolder same padding as the input field\n\t\t\t\t\t// parent node already has dijitInputField class but it doesn't affect this <span>\n\t\t\t\t\t// since it's position: absolute.\n\t\t\t\t\tclassName: 'dijitPlaceHolder dijitInputField'\n\t\t\t\t}, this.textbox, 'after');\n\t\t\t\tthis.own(\n\t\t\t\t\ton(this._phspan, \"mousedown\", function(evt){ evt.preventDefault(); }),\n\t\t\t\t\ton(this._phspan, \"touchend, pointerup, MSPointerUp\", lang.hitch(this, function(){\n\t\t\t\t\t\t// If the user clicks placeholder rather than the <input>, need programmatic focus.  Normally this\n\t\t\t\t\t\t// is done in _FormWidgetMixin._onFocus() but after [30663] it's done on a delay, which is ineffective.\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t}))\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._phspan.innerHTML=\"\";\n\t\t\tthis._phspan.appendChild(this._phspan.ownerDocument.createTextNode(v));\n\t\t\tthis._updatePlaceHolder();\n\t\t},\n\n\t\t_onInput: function(/*Event*/ evt){\n\t\t\t// summary:\n\t\t\t//\t\tCalled AFTER the input event has happened\n\t\t\t//\t\tSee if the placeHolder text should be removed or added while editing.\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._updatePlaceHolder();\n\t\t},\n\n\t\t_updatePlaceHolder: function(){\n\t\t\tif(this._phspan){\n\t\t\t\tthis._phspan.style.display = (this.placeHolder && !this.textbox.value) ? \"\" : \"none\";\n\t\t\t}\n\t\t},\n\n\t\t_setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._updatePlaceHolder();\n\t\t},\n\n\t\tgetDisplayedValue: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use get('displayedValue') instead.\n\t\t\t// tags:\n\t\t\t//\t\tdeprecated\n\t\t\tkernel.deprecated(this.declaredClass+\"::getDisplayedValue() is deprecated. Use get('displayedValue') instead.\", \"\", \"2.0\");\n\t\t\treturn this.get('displayedValue');\n\t\t},\n\n\t\tsetDisplayedValue: function(/*String*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use set('displayedValue', ...) instead.\n\t\t\t// tags:\n\t\t\t//\t\tdeprecated\n\t\t\tkernel.deprecated(this.declaredClass+\"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.\", \"\", \"2.0\");\n\t\t\tthis.set('displayedValue', value);\n\t\t},\n\n\t\t_onBlur: function(e){\n\t\t\tif(this.disabled){ return; }\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._updatePlaceHolder();\n\n\t\t\tif(has(\"mozilla\")){\n\t\t\t\tif(this.selectOnClick){\n\t\t\t\t\t// clear selection so that the next mouse click doesn't reselect\n\t\t\t\t\tthis.textbox.selectionStart = this.textbox.selectionEnd = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_onFocus: function(/*String*/ by){\n\t\t\tif(this.disabled || this.readOnly){ return; }\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._updatePlaceHolder();\n\t\t}\n\t});\n\n\tif(has(\"ie\") < 9){\n\t\tTextBox.prototype._isTextSelected = function(){\n\t\t\tvar range = this.ownerDocument.selection.createRange();\n\t\t\tvar parent = range.parentElement();\n\t\t\treturn parent == this.textbox && range.text.length > 0;\n\t\t};\n\n\t\t// Overrides definition of _setSelectionRange from _TextBoxMixin (TODO: move to _TextBoxMixin.js?)\n\t\tdijit._setSelectionRange = _TextBoxMixin._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){\n\t\t\tif(element.createTextRange){\n\t\t\t\tvar r = element.createTextRange();\n\t\t\t\tr.collapse(true);\n\t\t\t\tr.moveStart(\"character\", -99999); // move to 0\n\t\t\t\tr.moveStart(\"character\", start); // delta from 0 is the correct position\n\t\t\t\tr.moveEnd(\"character\", stop-start);\n\t\t\t\tr.select();\n\t\t\t}\n\t\t}\n\t}\n\n\tif(has(\"dojo-bidi\")){\n\t\tTextBox = declare(\"dijit.form.TextBox\", TextBox, {\n\t\t\t_setPlaceHolderAttr: function(v){\n\t\t\t\tthis.inherited(arguments);\n\t\t\t\tthis.applyTextDir(this._phspan);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn TextBox;\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\",\n\t\"dojo/i18n\", // i18n.getLocalization\n\t\"./TextBox\",\n\t\"../Tooltip\",\n\t\"dojo/text!./templates/ValidationTextBox.html\",\n\t\"dojo/i18n!./nls/validate\"\n], function(declare, kernel, lang, i18n, TextBox, Tooltip, template){\n\n\t// module:\n\t//\t\tdijit/form/ValidationTextBox\n\n\n\tvar ValidationTextBox = declare(\"dijit.form.ValidationTextBox\", TextBox, {\n\t\t// summary:\n\t\t//\t\tBase class for textbox widgets with the ability to validate content of various types and provide user feedback.\n\n\t\ttemplateString: template,\n\n\t\t// required: Boolean\n\t\t//\t\tUser is required to enter data into this field.\n\t\trequired: false,\n\n\t\t// promptMessage: String\n\t\t//\t\tIf defined, display this hint string immediately on focus to the textbox, if empty.\n\t\t//\t\tAlso displays if the textbox value is Incomplete (not yet valid but will be with additional input).\n\t\t//\t\tThink of this like a tooltip that tells the user what to do, not an error message\n\t\t//\t\tthat tells the user what they've done wrong.\n\t\t//\n\t\t//\t\tMessage disappears when user starts typing.\n\t\tpromptMessage: \"\",\n\n\t\t// invalidMessage: String\n\t\t//\t\tThe message to display if value is invalid.\n\t\t//\t\tThe translated string value is read from the message file by default.\n\t\t//\t\tSet to \"\" to use the promptMessage instead.\n\t\tinvalidMessage: \"$_unset_$\",\n\n\t\t// missingMessage: String\n\t\t//\t\tThe message to display if value is empty and the field is required.\n\t\t//\t\tThe translated string value is read from the message file by default.\n\t\t//\t\tSet to \"\" to use the invalidMessage instead.\n\t\tmissingMessage: \"$_unset_$\",\n\n\t\t// message: String\n\t\t//\t\tCurrently error/prompt message.\n\t\t//\t\tWhen using the default tooltip implementation, this will only be\n\t\t//\t\tdisplayed when the field is focused.\n\t\tmessage: \"\",\n\n\t\t// constraints: ValidationTextBox.__Constraints\n\t\t//\t\tDespite the name, this parameter specifies both constraints on the input as well as\n\t\t//\t\tformatting options.  See `dijit/form/ValidationTextBox.__Constraints` for details.\n\t\tconstraints:{},\n\n\t\t// pattern: [extension protected] String|Function(constraints) returning a string.\n\t\t//\t\tThis defines the regular expression used to validate the input.\n\t\t//\t\tDo not add leading ^ or $ characters since the widget adds these.\n\t\t//\t\tA function may be used to generate a valid pattern when dependent on constraints or other runtime factors.\n\t\t//\t\tset('pattern', String|Function).\n\t\tpattern: \".*\",\n\n\t\t// regExp: Deprecated [extension protected] String.  Use \"pattern\" instead.\n\t\tregExp: \"\",\n\n\t\tregExpGen: function(/*__Constraints*/ /*===== constraints =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use set('pattern', Function) instead.\n\t\t},\n\n\t\t// state: [readonly] String\n\t\t//\t\tShows current state (ie, validation result) of input (\"\"=Normal, Incomplete, or Error)\n\t\tstate: \"\",\n\n\t\t// tooltipPosition: String[]\n\t\t//\t\tSee description of `dijit/Tooltip.defaultPosition` for details on this parameter.\n\t\ttooltipPosition: [],\n\n\t\t_deprecateRegExp: function(attr, value){\n\t\t\tif(value != ValidationTextBox.prototype[attr]){\n\t\t\t\tkernel.deprecated(\"ValidationTextBox id=\"+this.id+\", set('\" + attr + \"', ...) is deprecated.  Use set('pattern', ...) instead.\", \"\", \"2.0\");\n\t\t\t\tthis.set('pattern', value);\n\t\t\t}\n\t\t},\n\t\t_setRegExpGenAttr: function(/*Function*/ newFcn){\n\t\t\tthis._deprecateRegExp(\"regExpGen\", newFcn);\n\t\t\tthis._set(\"regExpGen\", this._computeRegexp); // backward compat with this.regExpGen(this.constraints)\n\t\t},\n\t\t_setRegExpAttr: function(/*String*/ value){\n\t\t\tthis._deprecateRegExp(\"regExp\", value);\n\t\t},\n\n\t\t_setValueAttr: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHook so set('value', ...) works.\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\tvalidator: function(/*anything*/ value, /*__Constraints*/ constraints){\n\t\t\t// summary:\n\t\t\t//\t\tOverridable function used to validate the text input against the regular expression.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn (new RegExp(\"^(?:\" + this._computeRegexp(constraints) + \")\"+(this.required?\"\":\"?\")+\"$\")).test(value) &&\n\t\t\t\t(!this.required || !this._isEmpty(value)) &&\n\t\t\t\t(this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean\n\t\t},\n\n\t\t_isValidSubset: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if the value is either already valid or could be made valid by appending characters.\n\t\t\t//\t\tThis is used for validation while the user [may be] still typing.\n\t\t\treturn this.textbox.value.search(this._partialre) == 0;\n\t\t},\n\n\t\tisValid: function(/*Boolean*/ /*===== isFocused =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tTests if value is valid.\n\t\t\t//\t\tCan override with your own routine in a subclass.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.validator(this.textbox.value, this.get('constraints'));\n\t\t},\n\n\t\t_isEmpty: function(value){\n\t\t\t// summary:\n\t\t\t//\t\tChecks for whitespace\n\t\t\treturn (this.trim ? /^\\s*$/ : /^$/).test(value); // Boolean\n\t\t},\n\n\t\tgetErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReturn an error message to show if appropriate\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tvar invalid = this.invalidMessage == \"$_unset_$\" ? this.messages.invalidMessage :\n\t\t\t\t!this.invalidMessage ? this.promptMessage : this.invalidMessage;\n\t\t\tvar missing = this.missingMessage == \"$_unset_$\" ? this.messages.missingMessage :\n\t\t\t\t!this.missingMessage ? invalid : this.missingMessage;\n\t\t\treturn (this.required && this._isEmpty(this.textbox.value)) ? missing : invalid; // String\n\t\t},\n\n\t\tgetPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReturn a hint message to show when widget is first focused\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.promptMessage; // String\n\t\t},\n\n\t\t_maskValidSubsetError: true,\n\t\tvalidate: function(/*Boolean*/ isFocused){\n\t\t\t// summary:\n\t\t\t//\t\tCalled by oninit, onblur, and onkeypress.\n\t\t\t// description:\n\t\t\t//\t\tShow missing or invalid messages if appropriate, and highlight textbox field.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tvar message = \"\";\n\t\t\tvar isValid = this.disabled || this.isValid(isFocused);\n\t\t\tif(isValid){ this._maskValidSubsetError = true; }\n\t\t\tvar isEmpty = this._isEmpty(this.textbox.value);\n\t\t\tvar isValidSubset = !isValid && isFocused && this._isValidSubset();\n\t\t\tthis._set(\"state\", isValid ? \"\" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && (this._maskValidSubsetError || (isValidSubset && !this._hasBeenBlurred && isFocused))) ? \"Incomplete\" : \"Error\"));\n\t\t\tthis.focusNode.setAttribute(\"aria-invalid\", this.state == \"Error\" ? \"true\" : \"false\");\n\n\t\t\tif(this.state == \"Error\"){\n\t\t\t\tthis._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus\n\t\t\t\tmessage = this.getErrorMessage(isFocused);\n\t\t\t}else if(this.state == \"Incomplete\"){\n\t\t\t\tmessage = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete\n\t\t\t\tthis._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused\n\t\t\t}else if(isEmpty){\n\t\t\t\tmessage = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text\n\t\t\t}\n\t\t\tthis.set(\"message\", message);\n\n\t\t\treturn isValid;\n\t\t},\n\n\t\tdisplayMessage: function(/*String*/ message){\n\t\t\t// summary:\n\t\t\t//\t\tOverridable method to display validation errors/hints.\n\t\t\t//\t\tBy default uses a tooltip.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t\tif(message && this.focused){\n\t\t\t\tTooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());\n\t\t\t}else{\n\t\t\t\tTooltip.hide(this.domNode);\n\t\t\t}\n\t\t},\n\n\t\t_refreshState: function(){\n\t\t\t// Overrides TextBox._refreshState()\n\t\t\tif(this._created){ // should instead be this._started but that would require all programmatic ValidationTextBox instantiations to call startup()\n\t\t\t\tthis.validate(this.focused);\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t//////////// INITIALIZATION METHODS ///////////////////////////////////////\n\n\t\tconstructor: function(params /*===== , srcNodeRef =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCreate the widget.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.\n\n\t\t\tthis.constraints = lang.clone(this.constraints);\n\t\t\tthis.baseClass += ' dijitValidationTextBox';\n\t\t},\n\n\t\tstartup: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._refreshState(); // after all _set* methods have run\n\t\t},\n\n\t\t_setConstraintsAttr: function(/*__Constraints*/ constraints){\n\t\t\tif(!constraints.locale && this.lang){\n\t\t\t\tconstraints.locale = this.lang;\n\t\t\t}\n\t\t\tthis._set(\"constraints\", constraints);\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\t_setPatternAttr: function(/*String|Function*/ pattern){\n\t\t\tthis._set(\"pattern\", pattern); // don't set on INPUT to avoid native HTML5 validation\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\t_computeRegexp: function(/*__Constraints*/ constraints){\n\t\t\t// summary:\n\t\t\t//\t\tHook to get the current regExp and to compute the partial validation RE.\n\n\t\t\tvar p = this.pattern;\n\t\t\tif(typeof p == \"function\"){\n\t\t\t\tp = p.call(this, constraints);\n\t\t\t}\n\t\t\tif(p != this._lastRegExp){\n\t\t\t\tvar partialre = \"\";\n\t\t\t\tthis._lastRegExp = p;\n\t\t\t\t// parse the regexp and produce a new regexp that matches valid subsets\n\t\t\t\t// if the regexp is .* then there's no use in matching subsets since everything is valid\n\t\t\t\tif(p != \".*\"){\n\t\t\t\t\tp.replace(/\\\\.|\\[\\]|\\[.*?[^\\\\]{1}\\]|\\{.*?\\}|\\(\\?[=:!]|./g,\n\t\t\t\t\tfunction(re){\n\t\t\t\t\t\tswitch(re.charAt(0)){\n\t\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\t\tcase '+':\n\t\t\t\t\t\t\tcase '?':\n\t\t\t\t\t\t\tcase '*':\n\t\t\t\t\t\t\tcase '^':\n\t\t\t\t\t\t\tcase '$':\n\t\t\t\t\t\t\tcase '|':\n\t\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\t\t\tpartialre += re;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \")\":\n\t\t\t\t\t\t\t\tpartialre += \"|$)\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t default:\n\t\t\t\t\t\t\t\tpartialre += \"(?:\"+re+\"|$)\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ttry{ // this is needed for now since the above regexp parsing needs more test verification\n\t\t\t\t\t\"\".search(partialre);\n\t\t\t\t}catch(e){ // should never be here unless the original RE is bad or the parsing is bad\n\t\t\t\t\tpartialre = this.pattern;\n\t\t\t\t\tconsole.warn('RegExp error in ' + this.declaredClass + ': ' + this.pattern);\n\t\t\t\t} // should never be here unless the original RE is bad or the parsing is bad\n\t\t\t\tthis._partialre = \"^(?:\" + partialre + \")$\";\n\t\t\t}\n\t\t\treturn p;\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tthis.messages = i18n.getLocalization(\"dijit.form\", \"validate\", this.lang);\n\t\t\tthis._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints\n\t\t},\n\n\t\t_setDisabledAttr: function(/*Boolean*/ value){\n\t\t\tthis.inherited(arguments);\t// call FormValueWidget._setDisabledAttr()\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\t_setRequiredAttr: function(/*Boolean*/ value){\n\t\t\tthis._set(\"required\", value);\n\t\t\tthis.focusNode.setAttribute(\"aria-required\", value);\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\t_setMessageAttr: function(/*String*/ message){\n\t\t\tthis._set(\"message\", message);\n\t\t\tthis.displayMessage(message);\n\t\t},\n\n\t\treset:function(){\n\t\t\t// Overrides dijit/form/TextBox.reset() by also\n\t\t\t// hiding errors about partial matches\n\t\t\tthis._maskValidSubsetError = true;\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_onBlur: function(){\n\t\t\t// the message still exists but for back-compat, and to erase the tooltip\n\t\t\t// (if the message is being displayed as a tooltip), call displayMessage('')\n\t\t\tthis.displayMessage('');\n\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tTooltip.hide(this.domNode);\t// in case tooltip show when ValidationTextBox (or enclosing Dialog) destroyed\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\t/*=====\n\t ValidationTextBox.__Constraints = {\n\t\t // locale: String\n\t\t //\t\tlocale used for validation, picks up value from this widget's lang attribute\n\t\t // _flags_: anything\n\t\t //\t\tvarious flags passed to pattern function\n\t };\n\t =====*/\n\n\treturn ValidationTextBox;\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // dom.setSelectable\n\t\"dojo/has\",\n\t\"../registry\"        // registry.byNode\n], function(declare, dom, has, registry){\n\n\t// module:\n\t//\t\tdijit/form/_ButtonMixin\n\n\tvar ButtonMixin = declare(\"dijit.form._ButtonMixin\" + (has(\"dojo-bidi\") ? \"_NoBidi\" : \"\"), null, {\n\t\t// summary:\n\t\t//\t\tA mixin to add a thin standard API wrapper to a normal HTML button\n\t\t// description:\n\t\t//\t\tA label should always be specified (through innerHTML) or the label attribute.\n\t\t//\n\t\t//\t\tAttach points:\n\t\t//\n\t\t//\t\t- focusNode (required): this node receives focus\n\t\t//\t\t- valueNode (optional): this node's value gets submitted with FORM elements\n\t\t//\t\t- containerNode (optional): this node gets the innerHTML assignment for label\n\t\t// example:\n\t\t// |\t<button data-dojo-type=\"dijit/form/Button\" onClick=\"...\">Hello world</button>\n\t\t// example:\n\t\t// |\tvar button1 = new Button({label: \"hello world\", onClick: foo});\n\t\t// |\tdojo.body().appendChild(button1.domNode);\n\n\t\t// label: HTML String\n\t\t//\t\tContent to display in button.\n\t\tlabel: \"\",\n\n\t\t// type: [const] String\n\t\t//\t\tType of button (submit, reset, button, checkbox, radio)\n\t\ttype: \"button\",\n\n\t\t__onClick: function(/*Event*/ e){\n\t\t\t// summary:\n\t\t\t//\t\tInternal function to divert the real click onto the hidden INPUT that has a native default action associated with it\n\t\t\t// type:\n\t\t\t//\t\tprivate\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tif(!this.disabled){\n\t\t\t\t// cannot use on.emit since button default actions won't occur\n\t\t\t\tthis.valueNode.click(e);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t_onClick: function(/*Event*/ e){\n\t\t\t// summary:\n\t\t\t//\t\tInternal function to handle click actions\n\t\t\tif(this.disabled){\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(this.onClick(e) === false){\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tvar cancelled = e.defaultPrevented;\n\n\t\t\t// Signal Form/Dialog to submit/close.  For 2.0, consider removing this code and instead making the Form/Dialog\n\t\t\t// listen for bubbled click events where evt.target.type == \"submit\" && !evt.defaultPrevented.\n\t\t\tif(!cancelled && this.type == \"submit\" && !(this.valueNode || this.focusNode).form){\n\t\t\t\tfor(var node = this.domNode; node.parentNode; node = node.parentNode){\n\t\t\t\t\tvar widget = registry.byNode(node);\n\t\t\t\t\tif(widget && typeof widget._onSubmit == \"function\"){\n\t\t\t\t\t\twidget._onSubmit(e);\n\t\t\t\t\t\te.preventDefault(); // action has already occurred\n\t\t\t\t\t\tcancelled = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !cancelled;\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tdom.setSelectable(this.focusNode, false);\n\t\t},\n\n\t\tonClick: function(/*Event*/ /*===== e =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCallback for when button is clicked.\n\t\t\t//\t\tIf type=\"submit\", return true to perform submit, or false to cancel it.\n\t\t\t// type:\n\t\t\t//\t\tcallback\n\t\t\treturn true;\t\t// Boolean\n\t\t},\n\n\t\t_setLabelAttr: function(/*String*/ content){\n\t\t\t// summary:\n\t\t\t//\t\tHook for set('label', ...) to work.\n\t\t\t// description:\n\t\t\t//\t\tSet the label (text) of the button; takes an HTML string.\n\t\t\tthis._set(\"label\", content);\n\t\t\tvar labelNode = this.containerNode || this.focusNode;\n\t\t\tlabelNode.innerHTML = content;\n\t\t\tthis.onLabelSet();\n\t\t},\n\n\t\tonLabelSet: function(){\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\tButtonMixin = declare(\"dijit.form._ButtonMixin\", ButtonMixin, {\n\t\t\tonLabelSet: function(){\n\t\t\t\tthis.inherited(arguments);\n\t\t\t\tvar labelNode = this.containerNode || this.focusNode;\n\t\t\t\tthis.applyTextDir(labelNode);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ButtonMixin;\n});\n","define([\n\t\"dojo/_base/array\", // array.every array.filter array.forEach array.indexOf array.map\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.hitch lang.isArray\n\t\"dojo/on\",\n\t\"dojo/window\" // winUtils.scrollIntoView\n], function(array, declare, kernel, lang, on, winUtils){\n\n\t// module:\n\t//\t\tdijit/form/_FormMixin\n\n\treturn declare(\"dijit.form._FormMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin for containers of form widgets (i.e. widgets that represent a single value\n\t\t//\t\tand can be children of a `<form>` node or `dijit/form/Form` widget)\n\t\t// description:\n\t\t//\t\tCan extract all the form widgets\n\t\t//\t\tvalues and combine them into a single javascript object, or alternately\n\t\t//\t\ttake such an object and set the values for all the contained\n\t\t//\t\tform widgets\n\n\t/*=====\n\t\t// value: Object\n\t\t//\t\tName/value hash for each child widget with a name and value.\n\t\t//\t\tChild widgets without names are not part of the hash.\n\t\t//\n\t\t//\t\tIf there are multiple child widgets w/the same name, value is an array,\n\t\t//\t\tunless they are radio buttons in which case value is a scalar (since only\n\t\t//\t\tone radio button can be checked at a time).\n\t\t//\n\t\t//\t\tIf a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure.\n\t\t//\n\t\t//\t\tExample:\n\t\t//\t|\t{ name: \"John Smith\", interests: [\"sports\", \"movies\"] }\n\t=====*/\n\n\t\t// state: [readonly] String\n\t\t//\t\tWill be \"Error\" if one or more of the child widgets has an invalid value,\n\t\t//\t\t\"Incomplete\" if not all of the required child widgets are filled in.  Otherwise, \"\",\n\t\t//\t\twhich indicates that the form is ready to be submitted.\n\t\tstate: \"\",\n\n\t\t// TODO:\n\t\t//\t* Repeater\n\t\t//\t* better handling for arrays.  Often form elements have names with [] like\n\t\t//\t* people[3].sex (for a list of people [{name: Bill, sex: M}, ...])\n\n\n\t\t_getDescendantFormWidgets: function(/*dijit/_WidgetBase[]?*/ children){\n\t\t\t// summary:\n\t\t\t//\t\tReturns all form widget descendants, searching through non-form child widgets like BorderContainer\n\t\t\tvar res = [];\n\t\t\tarray.forEach(children || this.getChildren(), function(child){\n\t\t\t\tif(\"value\" in child){\n\t\t\t\t\tres.push(child);\n\t\t\t\t}else{\n\t\t\t\t\tres = res.concat(this._getDescendantFormWidgets(child.getChildren()));\n\t\t\t\t}\n\t\t\t}, this);\n\t\t\treturn res;\n\t\t},\n\n\t\treset: function(){\n\t\t\tarray.forEach(this._getDescendantFormWidgets(), function(widget){\n\t\t\t\tif(widget.reset){\n\t\t\t\t\twidget.reset();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tvalidate: function(){\n\t\t\t// summary:\n\t\t\t//\t\treturns if the form is valid - same as isValid - but\n\t\t\t//\t\tprovides a few additional (ui-specific) features:\n\t\t\t//\n\t\t\t//\t\t1. it will highlight any sub-widgets that are not valid\n\t\t\t//\t\t2. it will call focus() on the first invalid sub-widget\n\t\t\tvar didFocus = false;\n\t\t\treturn array.every(array.map(this._getDescendantFormWidgets(), function(widget){\n\t\t\t\t// Need to set this so that \"required\" widgets get their\n\t\t\t\t// state set.\n\t\t\t\twidget._hasBeenBlurred = true;\n\t\t\t\tvar valid = widget.disabled || !widget.validate || widget.validate();\n\t\t\t\tif(!valid && !didFocus){\n\t\t\t\t\t// Set focus of the first non-valid widget\n\t\t\t\t\twinUtils.scrollIntoView(widget.containerNode || widget.domNode);\n\t\t\t\t\twidget.focus();\n\t\t\t\t\tdidFocus = true;\n\t\t\t\t}\n\t\t\t\treturn valid;\n\t\t\t}), function(item){ return item; });\n\t\t},\n\n\t\tsetValues: function(val){\n\t\t\tkernel.deprecated(this.declaredClass+\"::setValues() is deprecated. Use set('value', val) instead.\", \"\", \"2.0\");\n\t\t\treturn this.set('value', val);\n\t\t},\n\t\t_setValueAttr: function(/*Object*/ obj){\n\t\t\t// summary:\n\t\t\t//\t\tFill in form values from according to an Object (in the format returned by get('value'))\n\n\t\t\t// generate map from name --> [list of widgets with that name]\n\t\t\tvar map = { };\n\t\t\tarray.forEach(this._getDescendantFormWidgets(), function(widget){\n\t\t\t\tif(!widget.name){ return; }\n\t\t\t\tvar entry = map[widget.name] || (map[widget.name] = [] );\n\t\t\t\tentry.push(widget);\n\t\t\t});\n\n\t\t\tfor(var name in map){\n\t\t\t\tif(!map.hasOwnProperty(name)){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar widgets = map[name],\t\t\t\t\t\t// array of widgets w/this name\n\t\t\t\t\tvalues = lang.getObject(name, false, obj);\t// list of values for those widgets\n\n\t\t\t\tif(values === undefined){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvalues = [].concat(values);\n\t\t\t\tif(typeof widgets[0].checked == 'boolean'){\n\t\t\t\t\t// for checkbox/radio, values is a list of which widgets should be checked\n\t\t\t\t\tarray.forEach(widgets, function(w){\n\t\t\t\t\t\tw.set('value', array.indexOf(values, w._get('value')) != -1);\n\t\t\t\t\t});\n\t\t\t\t}else if(widgets[0].multiple){\n\t\t\t\t\t// it takes an array (e.g. multi-select)\n\t\t\t\t\twidgets[0].set('value', values);\n\t\t\t\t}else{\n\t\t\t\t\t// otherwise, values is a list of values to be assigned sequentially to each widget\n\t\t\t\t\tarray.forEach(widgets, function(w, i){\n\t\t\t\t\t\tw.set('value', values[i]);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/***\n\t\t\t *\tTODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)\n\n\t\t\tarray.forEach(this.containerNode.elements, function(element){\n\t\t\t\tif(element.name == ''){return};\t// like \"continue\"\n\t\t\t\tvar namePath = element.name.split(\".\");\n\t\t\t\tvar myObj=obj;\n\t\t\t\tvar name=namePath[namePath.length-1];\n\t\t\t\tfor(var j=1,len2=namePath.length;j<len2;++j){\n\t\t\t\t\tvar p=namePath[j - 1];\n\t\t\t\t\t// repeater support block\n\t\t\t\t\tvar nameA=p.split(\"[\");\n\t\t\t\t\tif(nameA.length > 1){\n\t\t\t\t\t\tif(typeof(myObj[nameA[0]]) == \"undefined\"){\n\t\t\t\t\t\t\tmyObj[nameA[0]]=[ ];\n\t\t\t\t\t\t} // if\n\n\t\t\t\t\t\tnameIndex=parseInt(nameA[1]);\n\t\t\t\t\t\tif(typeof(myObj[nameA[0]][nameIndex]) == \"undefined\"){\n\t\t\t\t\t\t\tmyObj[nameA[0]][nameIndex] = { };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmyObj=myObj[nameA[0]][nameIndex];\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} // repeater support ends\n\n\t\t\t\t\tif(typeof(myObj[p]) == \"undefined\"){\n\t\t\t\t\t\tmyObj=undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t};\n\t\t\t\t\tmyObj=myObj[p];\n\t\t\t\t}\n\n\t\t\t\tif(typeof(myObj) == \"undefined\"){\n\t\t\t\t\treturn;\t\t// like \"continue\"\n\t\t\t\t}\n\t\t\t\tif(typeof(myObj[name]) == \"undefined\" && this.ignoreNullValues){\n\t\t\t\t\treturn;\t\t// like \"continue\"\n\t\t\t\t}\n\n\t\t\t\t// TODO: widget values (just call set('value', ...) on the widget)\n\n\t\t\t\t// TODO: maybe should call dojo.getNodeProp() instead\n\t\t\t\tswitch(element.type){\n\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\t\telement.checked = (name in myObj) &&\n\t\t\t\t\t\t\tarray.some(myObj[name], function(val){ return val == element.value; });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"radio\":\n\t\t\t\t\t\telement.checked = (name in myObj) && myObj[name] == element.value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"select-multiple\":\n\t\t\t\t\t\telement.selectedIndex=-1;\n\t\t\t\t\t\tarray.forEach(element.options, function(option){\n\t\t\t\t\t\t\toption.selected = array.some(myObj[name], function(val){ return option.value == val; });\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"select-one\":\n\t\t\t\t\t\telement.selectedIndex=\"0\";\n\t\t\t\t\t\tarray.forEach(element.options, function(option){\n\t\t\t\t\t\t\toption.selected = option.value == myObj[name];\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hidden\":\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\tcase \"textarea\":\n\t\t\t\t\tcase \"password\":\n\t\t\t\t\t\telement.value = myObj[name] || \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t\t*/\n\n\t\t\t// Note: no need to call this._set(\"value\", ...) as the child updates will trigger onChange events\n\t\t\t// which I am monitoring.\n\t\t},\n\n\t\tgetValues: function(){\n\t\t\tkernel.deprecated(this.declaredClass+\"::getValues() is deprecated. Use get('value') instead.\", \"\", \"2.0\");\n\t\t\treturn this.get('value');\n\t\t},\n\t\t_getValueAttr: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns Object representing form values.   See description of `value` for details.\n\t\t\t// description:\n\n\t\t\t// The value is updated into this.value every time a child has an onChange event,\n\t\t\t// so in the common case this function could just return this.value.   However,\n\t\t\t// that wouldn't work when:\n\t\t\t//\n\t\t\t// 1. User presses return key to submit a form.  That doesn't fire an onchange event,\n\t\t\t// and even if it did it would come too late due to the defer(...) in _handleOnChange()\n\t\t\t//\n\t\t\t// 2. app for some reason calls this.get(\"value\") while the user is typing into a\n\t\t\t// form field.   Not sure if that case needs to be supported or not.\n\n\t\t\t// get widget values\n\t\t\tvar obj = { };\n\t\t\tarray.forEach(this._getDescendantFormWidgets(), function(widget){\n\t\t\t\tvar name = widget.name;\n\t\t\t\tif(!name || widget.disabled){ return; }\n\n\t\t\t\t// Single value widget (checkbox, radio, or plain <input> type widget)\n\t\t\t\tvar value = widget.get('value');\n\n\t\t\t\t// Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays\n\t\t\t\tif(typeof widget.checked == 'boolean'){\n\t\t\t\t\tif(/Radio/.test(widget.declaredClass)){\n\t\t\t\t\t\t// radio button\n\t\t\t\t\t\tif(value !== false){\n\t\t\t\t\t\t\tlang.setObject(name, value, obj);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// give radio widgets a default of null\n\t\t\t\t\t\t\tvalue = lang.getObject(name, false, obj);\n\t\t\t\t\t\t\tif(value === undefined){\n\t\t\t\t\t\t\t\tlang.setObject(name, null, obj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// checkbox/toggle button\n\t\t\t\t\t\tvar ary=lang.getObject(name, false, obj);\n\t\t\t\t\t\tif(!ary){\n\t\t\t\t\t\t\tary=[];\n\t\t\t\t\t\t\tlang.setObject(name, ary, obj);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(value !== false){\n\t\t\t\t\t\t\tary.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tvar prev=lang.getObject(name, false, obj);\n\t\t\t\t\tif(typeof prev != \"undefined\"){\n\t\t\t\t\t\tif(lang.isArray(prev)){\n\t\t\t\t\t\t\tprev.push(value);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlang.setObject(name, [prev, value], obj);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// unique name\n\t\t\t\t\t\tlang.setObject(name, value, obj);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/***\n\t\t\t * code for plain input boxes (see also domForm.formToObject, can we use that instead of this code?\n\t\t\t * but it doesn't understand [] notation, presumably)\n\t\t\tvar obj = { };\n\t\t\tarray.forEach(this.containerNode.elements, function(elm){\n\t\t\t\tif(!elm.name)\t{\n\t\t\t\t\treturn;\t\t// like \"continue\"\n\t\t\t\t}\n\t\t\t\tvar namePath = elm.name.split(\".\");\n\t\t\t\tvar myObj=obj;\n\t\t\t\tvar name=namePath[namePath.length-1];\n\t\t\t\tfor(var j=1,len2=namePath.length;j<len2;++j){\n\t\t\t\t\tvar nameIndex = null;\n\t\t\t\t\tvar p=namePath[j - 1];\n\t\t\t\t\tvar nameA=p.split(\"[\");\n\t\t\t\t\tif(nameA.length > 1){\n\t\t\t\t\t\tif(typeof(myObj[nameA[0]]) == \"undefined\"){\n\t\t\t\t\t\t\tmyObj[nameA[0]]=[ ];\n\t\t\t\t\t\t} // if\n\t\t\t\t\t\tnameIndex=parseInt(nameA[1]);\n\t\t\t\t\t\tif(typeof(myObj[nameA[0]][nameIndex]) == \"undefined\"){\n\t\t\t\t\t\t\tmyObj[nameA[0]][nameIndex] = { };\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(typeof(myObj[nameA[0]]) == \"undefined\"){\n\t\t\t\t\t\tmyObj[nameA[0]] = { }\n\t\t\t\t\t} // if\n\n\t\t\t\t\tif(nameA.length == 1){\n\t\t\t\t\t\tmyObj=myObj[nameA[0]];\n\t\t\t\t\t}else{\n\t\t\t\t\t\tmyObj=myObj[nameA[0]][nameIndex];\n\t\t\t\t\t} // if\n\t\t\t\t} // for\n\n\t\t\t\tif((elm.type != \"select-multiple\" && elm.type != \"checkbox\" && elm.type != \"radio\") || (elm.type == \"radio\" && elm.checked)){\n\t\t\t\t\tif(name == name.split(\"[\")[0]){\n\t\t\t\t\t\tmyObj[name]=elm.value;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// can not set value when there is no name\n\t\t\t\t\t}\n\t\t\t\t}else if(elm.type == \"checkbox\" && elm.checked){\n\t\t\t\t\tif(typeof(myObj[name]) == 'undefined'){\n\t\t\t\t\t\tmyObj[name]=[ ];\n\t\t\t\t\t}\n\t\t\t\t\tmyObj[name].push(elm.value);\n\t\t\t\t}else if(elm.type == \"select-multiple\"){\n\t\t\t\t\tif(typeof(myObj[name]) == 'undefined'){\n\t\t\t\t\t\tmyObj[name]=[ ];\n\t\t\t\t\t}\n\t\t\t\t\tfor(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){\n\t\t\t\t\t\tif(elm.options[jdx].selected){\n\t\t\t\t\t\t\tmyObj[name].push(elm.options[jdx].value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} // if\n\t\t\t\tname=undefined;\n\t\t\t}); // forEach\n\t\t\t***/\n\t\t\treturn obj;\n\t\t},\n\n\t\tisValid: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if all of the widgets are valid.\n\t\t\t//\t\tDeprecated, will be removed in 2.0.  Use get(\"state\") instead.\n\n\t\t\treturn this.state == \"\";\n\t\t},\n\n\t\tonValidStateChange: function(/*Boolean*/ /*===== isValid =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tStub function to connect to if you want to do something\n\t\t\t//\t\t(like disable/enable a submit button) when the valid\n\t\t\t//\t\tstate changes on the form as a whole.\n\t\t\t//\n\t\t\t//\t\tDeprecated.  Will be removed in 2.0.  Use watch(\"state\", ...) instead.\n\t\t},\n\n\t\t_getState: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCompute what this.state should be based on state of children\n\t\t\tvar states = array.map(this._descendants, function(w){\n\t\t\t\treturn w.get(\"state\") || \"\";\n\t\t\t});\n\n\t\t\treturn array.indexOf(states, \"Error\") >= 0 ? \"Error\" :\n\t\t\t\tarray.indexOf(states, \"Incomplete\") >= 0 ? \"Incomplete\" : \"\";\n\t\t},\n\n\t\tdisconnectChildren: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated method.   Applications no longer need to call this.   Remove for 2.0.\n\t\t},\n\n\t\tconnectChildren: function(/*Boolean*/ inStartup){\n\t\t\t// summary:\n\t\t\t//\t\tYou can call this function directly, ex. in the event that you\n\t\t\t//\t\tprogrammatically add a widget to the form *after* the form has been\n\t\t\t//\t\tinitialized.\n\n\t\t\t// TODO: rename for 2.0\n\n\t\t\tthis._descendants = this._getDescendantFormWidgets();\n\n\t\t\t// To get notifications from children they need to be started.   Children didn't used to need to be started,\n\t\t\t// so for back-compat, start them here\n\t\t\tarray.forEach(this._descendants, function(child){\n\t\t\t\tif(!child._started){ child.startup(); }\n\t\t\t});\n\n\t\t\tif(!inStartup){\n\t\t\t\tthis._onChildChange();\n\t\t\t}\n\t\t},\n\n\t\t_onChildChange: function(/*String*/ attr){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when child's value or disabled state changes\n\n\t\t\t// The unit tests expect state update to be synchronous, so update it immediately.\n\t\t\tif(!attr || attr == \"state\" || attr == \"disabled\"){\n\t\t\t\tthis._set(\"state\", this._getState());\n\t\t\t}\n\n\t\t\t// Use defer() to collapse value changes in multiple children into a single\n\t\t\t// update to my value.   Multiple updates will occur on:\n\t\t\t//\t1. Form.set()\n\t\t\t//\t2. Form.reset()\n\t\t\t//\t3. user selecting a radio button (which will de-select another radio button,\n\t\t\t//\t\t causing two onChange events)\n\t\t\tif(!attr || attr == \"value\" || attr == \"disabled\" || attr == \"checked\"){\n\t\t\t\tif(this._onChangeDelayTimer){\n\t\t\t\t\tthis._onChangeDelayTimer.remove();\n\t\t\t\t}\n\t\t\t\tthis._onChangeDelayTimer = this.defer(function(){\n\t\t\t\t\tdelete this._onChangeDelayTimer;\n\t\t\t\t\tthis._set(\"value\", this.get(\"value\"));\n\t\t\t\t}, 10);\n\t\t\t}\n\t\t},\n\n\t\tstartup: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Set initial this.value and this.state.   Don't emit watch() notifications.\n\t\t\tthis._descendants = this._getDescendantFormWidgets();\n\t\t\tthis.value = this.get(\"value\");\n\t\t\tthis.state = this._getState();\n\n\t\t\t// Initialize value and valid/invalid state tracking.\n\t\t\tvar self = this;\n\t\t\tthis.own(\n\t\t\t\ton(\n\t\t\t\t\tthis.containerNode,\n\t\t\t\t\t\"attrmodified-state, attrmodified-disabled, attrmodified-value, attrmodified-checked\",\n\t\t\t\t\tfunction(evt){\n\t\t\t\t\t\tif(evt.target == self.domNode){\n\t\t\t\t\t\t\treturn;\t// ignore events that I fire on myself because my children changed\n\t\t\t\t\t\t}\n\t\t\t\t\t\tself._onChildChange(evt.type.replace(\"attrmodified-\", \"\"));\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Make state change call onValidStateChange(), will be removed in 2.0\n\t\t\tthis.watch(\"state\", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == \"\"); });\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tthis.inherited(arguments);\n\t\t}\n\n\t});\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-attr\", // domAttr.set\n\t\"dojo/keys\", // keys.ESCAPE\n\t\"dojo/_base/lang\",\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"webkit\")\n\t\"./_FormWidgetMixin\"\n], function(declare, domAttr, keys, lang, on, has, _FormWidgetMixin){\n\n\t// module:\n\t//\t\tdijit/form/_FormValueMixin\n\n\treturn declare(\"dijit.form._FormValueMixin\", _FormWidgetMixin, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets corresponding to native HTML elements such as `<input>` or `<select>`\n\t\t//\t\tthat have user changeable values.\n\t\t// description:\n\t\t//\t\tEach _FormValueMixin represents a single input value, and has a (possibly hidden) `<input>` element,\n\t\t//\t\tto which it serializes it's input value, so that form submission (either normal submission or via FormBind?)\n\t\t//\t\tworks as expected.\n\n\t\t// readOnly: Boolean\n\t\t//\t\tShould this widget respond to user input?\n\t\t//\t\tIn markup, this is specified as \"readOnly\".\n\t\t//\t\tSimilar to disabled except readOnly form values are submitted.\n\t\treadOnly: false,\n\n\t\t_setReadOnlyAttr: function(/*Boolean*/ value){\n\t\t\t// IE has a Caret Browsing mode (hit F7 to activate) where disabled textboxes can be modified\n\t\t\t// focusNode enforced readonly if currently disabled to avoid this issue.\n\t\t\tif (has('trident') && 'disabled' in this) {\n\t\t\t\tdomAttr.set(this.focusNode, 'readOnly', value || this.disabled);\n\t\t\t} else {\n\t\t\t\tdomAttr.set(this.focusNode, 'readOnly', value);\n\t\t\t}\n\t\t\tthis._set(\"readOnly\", value);\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Update our reset value if it hasn't yet been set (because this.set()\n\t\t\t// is only called when there *is* a value)\n\t\t\tif(this._resetValue === undefined){\n\t\t\t\tthis._lastValueReported = this._resetValue = this.value;\n\t\t\t}\n\t\t},\n\n\t\t_setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){\n\t\t\t// summary:\n\t\t\t//\t\tHook so set('value', value) works.\n\t\t\t// description:\n\t\t\t//\t\tSets the value of the widget.\n\t\t\t//\t\tIf the value has changed, then fire onChange event, unless priorityChange\n\t\t\t//\t\tis specified as null (or false?)\n\t\t\tthis._handleOnChange(newValue, priorityChange);\n\t\t},\n\n\t\t_handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the value of the widget has changed.  Saves the new value in this.value,\n\t\t\t//\t\tand calls onChange() if appropriate.   See _FormWidget._handleOnChange() for details.\n\t\t\tthis._set(\"value\", newValue);\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tundo: function(){\n\t\t\t// summary:\n\t\t\t//\t\tRestore the value to the last value passed to onChange\n\t\t\tthis._setValueAttr(this._lastValueReported, false);\n\t\t},\n\n\t\treset: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReset the widget's value to what it was at initialization time\n\t\t\tthis._hasBeenBlurred = false;\n\t\t\tthis._setValueAttr(this._resetValue, true);\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"./_FormWidget\",\n\t\"./_FormValueMixin\"\n], function(declare, has, _FormWidget, _FormValueMixin){\n\n\t// module:\n\t//\t\tdijit/form/_FormValueWidget\n\n\treturn declare(\"dijit.form._FormValueWidget\", [_FormWidget, _FormValueMixin], {\n\t\t// summary:\n\t\t//\t\tBase class for widgets corresponding to native HTML elements such as `<input>` or `<select>`\n\t\t//\t\tthat have user changeable values.\n\t\t// description:\n\t\t//\t\tEach _FormValueWidget represents a single input value, and has a (possibly hidden) `<input>` element,\n\t\t//\t\tto which it serializes it's input value, so that form submission (either normal submission or via FormBind?)\n\t\t//\t\tworks as expected.\n\n\t\t// Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared\n\t\t// directly in the template as read by the parser in order to function. IE is known to specifically\n\t\t// require the 'name' attribute at element creation time.  See #8484, #8660.\n\n\t\t_layoutHackIE7: function(){\n\t\t\t// summary:\n\t\t\t//\t\tWork around table sizing bugs on IE7 by forcing redraw\n\n\t\t\tif(has(\"ie\") == 7){ // fix IE7 layout bug when the widget is scrolled out of sight\n\t\t\t\tvar domNode = this.domNode;\n\t\t\t\tvar parent = domNode.parentNode;\n\t\t\t\tvar pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter\n\t\t\t\tvar origFilter = pingNode.style.filter; // save custom filter, most likely nothing\n\t\t\t\tvar _this = this;\n\t\t\t\twhile(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet\n\t\t\t\t\t(function ping(){\n\t\t\t\t\t\tvar disconnectHandle = _this.connect(parent, \"onscroll\",\n\t\t\t\t\t\t\tfunction(){\n\t\t\t\t\t\t\t\t_this.disconnect(disconnectHandle); // only call once\n\t\t\t\t\t\t\t\tpingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique\n\t\t\t\t\t\t\t\t_this.defer(function(){\n\t\t\t\t\t\t\t\t\tpingNode.style.filter = origFilter;\n\t\t\t\t\t\t\t\t}); // restore custom filter, if any\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t})();\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/sniff\", // has(\"dijit-legacy-requires\"), has(\"msapp\")\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/ready\",\n\t\"../_Widget\",\n\t\"../_CssStateMixin\",\n\t\"../_TemplatedMixin\",\n\t\"./_FormWidgetMixin\"\n], function(declare, has, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){\n\n\t// module:\n\t//\t\tdijit/form/_FormWidget\n\n\t// Back compat w/1.6, remove for 2.0\n\tif(has(\"dijit-legacy-requires\")){\n\t\tready(0, function(){\n\t\t\tvar requires = [\"dijit/form/_FormValueWidget\"];\n\t\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t\t});\n\t}\n\n\treturn declare(\"dijit.form._FormWidget\", [_Widget, _TemplatedMixin, _CssStateMixin, _FormWidgetMixin], {\n\t\t// summary:\n\t\t//\t\tBase class for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`,\n\t\t//\t\twhich can be children of a `<form>` node or a `dijit/form/Form` widget.\n\t\t//\n\t\t// description:\n\t\t//\t\tRepresents a single HTML element.\n\t\t//\t\tAll these widgets should have these attributes just like native HTML input elements.\n\t\t//\t\tYou can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`.\n\t\t//\n\t\t//\t\tThey also share some common methods.\n\n\t\tsetDisabled: function(/*Boolean*/ disabled){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use set('disabled', ...) instead.\n\t\t\tkernel.deprecated(\"setDisabled(\" + disabled + \") is deprecated. Use set('disabled',\" + disabled + \") instead.\", \"\", \"2.0\");\n\t\t\tthis.set('disabled', disabled);\n\t\t},\n\n\t\tsetValue: function(/*String*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use set('value', ...) instead.\n\t\t\tkernel.deprecated(\"dijit.form._FormWidget:setValue(\" + value + \") is deprecated.  Use set('value',\" + value + \") instead.\", \"\", \"2.0\");\n\t\t\tthis.set('value', value);\n\t\t},\n\n\t\tgetValue: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.  Use get('value') instead.\n\t\t\tkernel.deprecated(this.declaredClass + \"::getValue() is deprecated. Use get('value') instead.\", \"\", \"2.0\");\n\t\t\treturn this.get('value');\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\t// Setup name=foo string to be referenced from the template (but only if a name has been specified).\n\t\t\t// Unfortunately we can't use _setNameAttr to set the name in IE due to IE limitations, see #8484, #8660.\n\t\t\t// But when IE6 and IE7 are desupported, then we probably don't need this anymore, so should remove it in 2.0.\n\t\t\t// Also, don't do this for Windows 8 Store Apps because it causes a security exception (see #16452).\n\t\t\t// Regarding escaping, see heading \"Attribute values\" in\n\t\t\t// http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2\n\t\t\tthis.nameAttrSetting = (this.name && !has(\"msapp\")) ? ('name=\"' + this.name.replace(/\"/g, \"&quot;\") + '\"') : '';\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-attr\", // domAttr.set\n\t\"dojo/dom-style\", // domStyle.get\n\t\"dojo/_base/lang\", // lang.hitch lang.isArray\n\t\"dojo/mouse\", // mouse.isLeft\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"webkit\")\n\t\"dojo/window\", // winUtils.scrollIntoView\n\t\"../a11y\"    // a11y.hasDefaultTabStop\n], function(array, declare, domAttr, domStyle, lang, mouse, on, has, winUtils, a11y){\n\n\t// module:\n\t//\t\tdijit/form/_FormWidgetMixin\n\n\treturn declare(\"dijit.form._FormWidgetMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`,\n\t\t//\t\twhich can be children of a `<form>` node or a `dijit/form/Form` widget.\n\t\t//\n\t\t// description:\n\t\t//\t\tRepresents a single HTML element.\n\t\t//\t\tAll these widgets should have these attributes just like native HTML input elements.\n\t\t//\t\tYou can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`.\n\t\t//\n\t\t//\t\tThey also share some common methods.\n\n\t\t// name: [const] String\n\t\t//\t\tName used when submitting form; same as \"name\" attribute or plain HTML elements\n\t\tname: \"\",\n\n\t\t// alt: String\n\t\t//\t\tCorresponds to the native HTML `<input>` element's attribute.\n\t\talt: \"\",\n\n\t\t// value: String\n\t\t//\t\tCorresponds to the native HTML `<input>` element's attribute.\n\t\tvalue: \"\",\n\n\t\t// type: [const] String\n\t\t//\t\tCorresponds to the native HTML `<input>` element's attribute.\n\t\ttype: \"text\",\n\n\t\t// type: String\n\t\t//\t\tApply aria-label in markup to the widget's focusNode\n\t\t\"aria-label\": \"focusNode\",\n\n\t\t// tabIndex: String\n\t\t//\t\tOrder fields are traversed when user hits the tab key\n\t\ttabIndex: \"0\",\n\t\t_setTabIndexAttr: \"focusNode\", // force copy even when tabIndex default value, needed since Button is <span>\n\n\t\t// disabled: Boolean\n\t\t//\t\tShould this widget respond to user input?\n\t\t//\t\tIn markup, this is specified as \"disabled='disabled'\", or just \"disabled\".\n\t\tdisabled: false,\n\n\t\t// intermediateChanges: Boolean\n\t\t//\t\tFires onChange for each value change or only on demand\n\t\tintermediateChanges: false,\n\n\t\t// scrollOnFocus: Boolean\n\t\t//\t\tOn focus, should this widget scroll into view?\n\t\tscrollOnFocus: true,\n\n\t\t// Override _WidgetBase mapping id to this.domNode, needs to be on focusNode so <label> etc.\n\t\t// works with screen reader\n\t\t_setIdAttr: \"focusNode\",\n\n\t\t_setDisabledAttr: function(/*Boolean*/ value){\n\t\t\tthis._set(\"disabled\", value);\n\n\t\t\t// Set disabled property if focusNode is an <input>, but aria-disabled attribute if focusNode is a <span>.\n\t\t\t// Can't use \"disabled\" in this.focusNode as a test because on IE, that's true for all nodes.\n\t\t\tif(/^(button|input|select|textarea|optgroup|option|fieldset)$/i.test(this.focusNode.tagName)){\n\t\t\t\tdomAttr.set(this.focusNode, 'disabled', value);\n\t\t\t\t// IE has a Caret Browsing mode (hit F7 to activate) where disabled textboxes can be modified\n\t\t\t\t// textboxes marked readonly if disabled to avoid this issue.\n\t\t\t\tif (has('trident') && 'readOnly' in this) {\n\t\t\t\t\tdomAttr.set(this.focusNode, 'readonly', value || this.readOnly);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tthis.focusNode.setAttribute(\"aria-disabled\", value ? \"true\" : \"false\");\n\t\t\t}\n\n\t\t\t// And also set disabled on the hidden <input> node\n\t\t\tif(this.valueNode){\n\t\t\t\tdomAttr.set(this.valueNode, 'disabled', value);\n\t\t\t}\n\n\t\t\tif(value){\n\t\t\t\t// reset these, because after the domNode is disabled, we can no longer receive\n\t\t\t\t// mouse related events, see #4200\n\t\t\t\tthis._set(\"hovering\", false);\n\t\t\t\tthis._set(\"active\", false);\n\n\t\t\t\t// clear tab stop(s) on this widget's focusable node(s)  (ComboBox has two focusable nodes)\n\t\t\t\tvar attachPointNames = \"tabIndex\" in this.attributeMap ? this.attributeMap.tabIndex :\n\t\t\t\t\t(\"_setTabIndexAttr\" in this) ? this._setTabIndexAttr : \"focusNode\";\n\t\t\t\tarray.forEach(lang.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){\n\t\t\t\t\tvar node = this[attachPointName];\n\t\t\t\t\t// complex code because tabIndex=-1 on a <div> doesn't work on FF\n\t\t\t\t\tif(has(\"webkit\") || a11y.hasDefaultTabStop(node)){    // see #11064 about webkit bug\n\t\t\t\t\t\tnode.setAttribute('tabIndex', \"-1\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tnode.removeAttribute('tabIndex');\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\t\t\t}else{\n\t\t\t\tif(this.tabIndex != \"\"){\n\t\t\t\t\tthis.set('tabIndex', this.tabIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_onFocus: function(/*String*/ by){\n\t\t\t// If user clicks on the widget, even if the mouse is released outside of it,\n\t\t\t// this widget's focusNode should get focus (to mimic native browser behavior).\n\t\t\t// Browsers often need help to make sure the focus via mouse actually gets to the focusNode.\n\t\t\t// TODO: consider removing all of this for 2.0 or sooner, see #16622 etc.\n\t\t\tif(by == \"mouse\" && this.isFocusable()){\n\t\t\t\t// IE exhibits strange scrolling behavior when refocusing a node so only do it when !focused.\n\t\t\t\tvar focusHandle = this.own(on(this.focusNode, \"focus\", function(){\n\t\t\t\t\tmouseUpHandle.remove();\n\t\t\t\t\tfocusHandle.remove();\n\t\t\t\t}))[0];\n\t\t\t\t// Set a global event to handle mouseup, so it fires properly\n\t\t\t\t// even if the cursor leaves this.domNode before the mouse up event.\n\t\t\t\tvar event = has(\"pointer-events\") ? \"pointerup\" : has(\"MSPointer\") ? \"MSPointerUp\" :\n\t\t\t\t\thas(\"touch-events\") ? \"touchend, mouseup\" :\t\t// seems like overkill but see #16622, #16725\n\t\t\t\t\t\"mouseup\";\n\t\t\t\tvar mouseUpHandle = this.own(on(this.ownerDocumentBody, event, lang.hitch(this, function(evt){\n\t\t\t\t\tmouseUpHandle.remove();\n\t\t\t\t\tfocusHandle.remove();\n\t\t\t\t\t// if here, then the mousedown did not focus the focusNode as the default action\n\t\t\t\t\tif(this.focused){\n\t\t\t\t\t\tif(evt.type == \"touchend\"){\n\t\t\t\t\t\t\tthis.defer(\"focus\"); // native focus hasn't occurred yet\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tthis.focus(); // native focus already occurred on mousedown\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})))[0];\n\t\t\t}\n\t\t\tif(this.scrollOnFocus){\n\t\t\t\tthis.defer(function(){\n\t\t\t\t\twinUtils.scrollIntoView(this.domNode);\n\t\t\t\t}); // without defer, the input caret position can change on mouse click\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tisFocusable: function(){\n\t\t\t// summary:\n\t\t\t//\t\tTells if this widget is focusable or not.  Used internally by dijit.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn !this.disabled && this.focusNode && (domStyle.get(this.domNode, \"display\") != \"none\");\n\t\t},\n\n\t\tfocus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tPut focus on this widget\n\t\t\tif(!this.disabled && this.focusNode.focus){\n\t\t\t\ttry{\n\t\t\t\t\tthis.focusNode.focus();\n\t\t\t\t}catch(e){\n\t\t\t\t}\n\t\t\t\t/*squelch errors from hidden nodes*/\n\t\t\t}\n\t\t},\n\n\t\tcompare: function(/*anything*/ val1, /*anything*/ val2){\n\t\t\t// summary:\n\t\t\t//\t\tCompare 2 values (as returned by get('value') for this widget).\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tif(typeof val1 == \"number\" && typeof val2 == \"number\"){\n\t\t\t\treturn (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2;\n\t\t\t}else if(val1 > val2){\n\t\t\t\treturn 1;\n\t\t\t}else if(val1 < val2){\n\t\t\t\treturn -1;\n\t\t\t}else{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\n\t\tonChange: function(/*===== newValue =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when this widget's value is changed.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\t// _onChangeActive: [private] Boolean\n\t\t//\t\tIndicates that changes to the value should call onChange() callback.\n\t\t//\t\tThis is false during widget initialization, to avoid calling onChange()\n\t\t//\t\twhen the initial value is set.\n\t\t_onChangeActive: false,\n\n\t\t_handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the value of the widget is set.  Calls onChange() if appropriate\n\t\t\t// newValue:\n\t\t\t//\t\tthe new value\n\t\t\t// priorityChange:\n\t\t\t//\t\tFor a slider, for example, dragging the slider is priorityChange==false,\n\t\t\t//\t\tbut on mouse up, it's priorityChange==true.  If intermediateChanges==false,\n\t\t\t//\t\tonChange is only called form priorityChange=true events.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\t\t\tif(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){\n\t\t\t\t// this block executes not for a change, but during initialization,\n\t\t\t\t// and is used to store away the original value (or for ToggleButton, the original checked state)\n\t\t\t\tthis._resetValue = this._lastValueReported = newValue;\n\t\t\t}\n\t\t\tthis._pendingOnChange = this._pendingOnChange\n\t\t\t\t|| (typeof newValue != typeof this._lastValueReported)\n\t\t\t\t|| (this.compare(newValue, this._lastValueReported) != 0);\n\t\t\tif((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){\n\t\t\t\tthis._lastValueReported = newValue;\n\t\t\t\tthis._pendingOnChange = false;\n\t\t\t\tif(this._onChangeActive){\n\t\t\t\t\tif(this._onChangeHandle){\n\t\t\t\t\t\tthis._onChangeHandle.remove();\n\t\t\t\t\t}\n\t\t\t\t\t// defer allows hidden value processing to run and\n\t\t\t\t\t// also the onChange handler can safely adjust focus, etc\n\t\t\t\t\tthis._onChangeHandle = this.defer(\n\t\t\t\t\t\tfunction(){\n\t\t\t\t\t\t\tthis._onChangeHandle = null;\n\t\t\t\t\t\t\tthis.onChange(newValue);\n\t\t\t\t\t\t}); // try to collapse multiple onChange's fired faster than can be processed\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcreate: function(){\n\t\t\t// Overrides _Widget.create()\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._onChangeActive = true;\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tif(this._onChangeHandle){ // destroy called before last onChange has fired\n\t\t\t\tthis._onChangeHandle.remove();\n\t\t\t\tthis.onChange(this._lastValueReported);\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/sniff\",\t// has(\"ie\"), has(\"dojo-bidi\")\n\t\"dojo/keys\", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT\n\t\"dojo/_base/lang\", // lang.mixin\n\t\"dojo/on\", // on\n\t\"../main\"    // for exporting dijit._setSelectionRange, dijit.selectInputText\n], function(array, declare, dom, has, keys, lang, on, dijit){\n\n\t// module:\n\t//\t\tdijit/form/_TextBoxMixin\n\n\tvar _TextBoxMixin = declare(\"dijit.form._TextBoxMixin\" + (has(\"dojo-bidi\") ? \"_NoBidi\" : \"\"), null, {\n\t\t// summary:\n\t\t//\t\tA mixin for textbox form input widgets\n\n\t\t// trim: Boolean\n\t\t//\t\tRemoves leading and trailing whitespace if true.  Default is false.\n\t\ttrim: false,\n\n\t\t// uppercase: Boolean\n\t\t//\t\tConverts all characters to uppercase if true.  Default is false.\n\t\tuppercase: false,\n\n\t\t// lowercase: Boolean\n\t\t//\t\tConverts all characters to lowercase if true.  Default is false.\n\t\tlowercase: false,\n\n\t\t// propercase: Boolean\n\t\t//\t\tConverts the first character of each word to uppercase if true.\n\t\tpropercase: false,\n\n\t\t// maxLength: String\n\t\t//\t\tHTML INPUT tag maxLength declaration.\n\t\tmaxLength: \"\",\n\n\t\t// selectOnClick: [const] Boolean\n\t\t//\t\tIf true, all text will be selected when focused with mouse\n\t\tselectOnClick: false,\n\n\t\t// placeHolder: String\n\t\t//\t\tDefines a hint to help users fill out the input field (as defined in HTML 5).\n\t\t//\t\tThis should only contain plain text (no html markup).\n\t\tplaceHolder: \"\",\n\n\t\t_getValueAttr: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHook so get('value') works as we like.\n\t\t\t// description:\n\t\t\t//\t\tFor `dijit/form/TextBox` this basically returns the value of the `<input>`.\n\t\t\t//\n\t\t\t//\t\tFor `dijit/form/MappedTextBox` subclasses, which have both\n\t\t\t//\t\ta \"displayed value\" and a separate \"submit value\",\n\t\t\t//\t\tThis treats the \"displayed value\" as the master value, computing the\n\t\t\t//\t\tsubmit value from it via this.parse().\n\t\t\treturn this.parse(this.get('displayedValue'), this.constraints);\n\t\t},\n\n\t\t_setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){\n\t\t\t// summary:\n\t\t\t//\t\tHook so set('value', ...) works.\n\t\t\t//\n\t\t\t// description:\n\t\t\t//\t\tSets the value of the widget to \"value\" which can be of\n\t\t\t//\t\tany type as determined by the widget.\n\t\t\t//\n\t\t\t// value:\n\t\t\t//\t\tThe visual element value is also set to a corresponding,\n\t\t\t//\t\tbut not necessarily the same, value.\n\t\t\t//\n\t\t\t// formattedValue:\n\t\t\t//\t\tIf specified, used to set the visual element value,\n\t\t\t//\t\totherwise a computed visual value is used.\n\t\t\t//\n\t\t\t// priorityChange:\n\t\t\t//\t\tIf true, an onChange event is fired immediately instead of\n\t\t\t//\t\twaiting for the next blur event.\n\n\t\t\tvar filteredValue;\n\t\t\tif(value !== undefined){\n\t\t\t\t// TODO: this is calling filter() on both the display value and the actual value.\n\t\t\t\t// I added a comment to the filter() definition about this, but it should be changed.\n\t\t\t\tfilteredValue = this.filter(value);\n\t\t\t\tif(typeof formattedValue != \"string\"){\n\t\t\t\t\tif(filteredValue !== null && ((typeof filteredValue != \"number\") || !isNaN(filteredValue))){\n\t\t\t\t\t\tformattedValue = this.filter(this.format(filteredValue, this.constraints));\n\t\t\t\t\t}else{\n\t\t\t\t\t\tformattedValue = '';\n\t\t\t\t\t}\n\t\t\t\t\t// Ensure the filtered value does not change after being formatted. See track #17955.\n\t\t\t\t\t//\n\t\t\t\t\t// This check is only applied when the formatted value is not specified by the caller in order to allow the \n\t\t\t\t\t// behavior to be overriden. This is needed whenever value synonyms cannot be determined using parse/compare. For\n\t\t\t\t\t// example, dijit/form/FilteringSelect determines the formatted value asynchronously and applies it using a \n\t\t\t\t\t// callback to this method.\n\t\t\t\t\t//\n\t\t\t\t\t// TODO: Should developers be warned that they broke the round trip on format?\n\t\t\t\t\tif (this.compare(filteredValue, this.filter(this.parse(formattedValue, this.constraints))) != 0){\n\t\t\t\t\t\tformattedValue = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(formattedValue != null /* and !undefined */ && ((typeof formattedValue) != \"number\" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){\n\t\t\t\tthis.textbox.value = formattedValue;\n\t\t\t\tthis._set(\"displayedValue\", this.get(\"displayedValue\"));\n\t\t\t}\n\n\t\t\tthis.inherited(arguments, [filteredValue, priorityChange]);\n\t\t},\n\n\t\t// displayedValue: String\n\t\t//\t\tFor subclasses like ComboBox where the displayed value\n\t\t//\t\t(ex: Kentucky) and the serialized value (ex: KY) are different,\n\t\t//\t\tthis represents the displayed value.\n\t\t//\n\t\t//\t\tSetting 'displayedValue' through set('displayedValue', ...)\n\t\t//\t\tupdates 'value', and vice-versa.  Otherwise 'value' is updated\n\t\t//\t\tfrom 'displayedValue' periodically, like onBlur etc.\n\t\t//\n\t\t//\t\tTODO: move declaration to MappedTextBox?\n\t\t//\t\tProblem is that ComboBox references displayedValue,\n\t\t//\t\tfor benefit of FilteringSelect.\n\t\tdisplayedValue: \"\",\n\n\t\t_getDisplayedValueAttr: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHook so get('displayedValue') works.\n\t\t\t// description:\n\t\t\t//\t\tReturns the displayed value (what the user sees on the screen),\n\t\t\t//\t\tafter filtering (ie, trimming spaces etc.).\n\t\t\t//\n\t\t\t//\t\tFor some subclasses of TextBox (like ComboBox), the displayed value\n\t\t\t//\t\tis different from the serialized value that's actually\n\t\t\t//\t\tsent to the server (see `dijit/form/ValidationTextBox.serialize()`)\n\n\t\t\t// TODO: maybe we should update this.displayedValue on every keystroke so that we don't need\n\t\t\t// this method\n\t\t\t// TODO: this isn't really the displayed value when the user is typing\n\t\t\treturn this.filter(this.textbox.value);\n\t\t},\n\n\t\t_setDisplayedValueAttr: function(/*String*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tHook so set('displayedValue', ...) works.\n\t\t\t// description:\n\t\t\t//\t\tSets the value of the visual element to the string \"value\".\n\t\t\t//\t\tThe widget value is also set to a corresponding,\n\t\t\t//\t\tbut not necessarily the same, value.\n\n\t\t\tif(value == null /* or undefined */){\n\t\t\t\tvalue = ''\n\t\t\t}\n\t\t\telse if(typeof value != \"string\"){\n\t\t\t\tvalue = String(value)\n\t\t\t}\n\n\t\t\tthis.textbox.value = value;\n\n\t\t\t// sets the serialized value to something corresponding to specified displayedValue\n\t\t\t// (if possible), and also updates the textbox.value, for example converting \"123\"\n\t\t\t// to \"123.00\"\n\t\t\tthis._setValueAttr(this.get('value'), undefined);\n\n\t\t\tthis._set(\"displayedValue\", this.get('displayedValue'));\n\t\t},\n\n\t\tformat: function(value /*=====, constraints =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReplaceable function to convert a value to a properly formatted string.\n\t\t\t// value: String\n\t\t\t// constraints: Object\n\t\t\t// tags:\n\t\t\t//\t\tprotected extension\n\t\t\treturn value == null /* or undefined */ ? \"\" : (value.toString ? value.toString() : value);\n\t\t},\n\n\t\tparse: function(value /*=====, constraints =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReplaceable function to convert a formatted string to a value\n\t\t\t// value: String\n\t\t\t// constraints: Object\n\t\t\t// tags:\n\t\t\t//\t\tprotected extension\n\n\t\t\treturn value;\t// String\n\t\t},\n\n\t\t_refreshState: function(){\n\t\t\t// summary:\n\t\t\t//\t\tAfter the user types some characters, etc., this method is\n\t\t\t//\t\tcalled to check the field for validity etc.  The base method\n\t\t\t//\t\tin `dijit/form/TextBox` does nothing, but subclasses override.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\t onInput: function(/*Event*/ /*===== evt =====*/){\n\t\t\t // summary:\n\t\t\t //\t\tConnect to this function to receive notifications of various user data-input events.\n\t\t\t //\t\tReturn false to cancel the event and prevent it from being processed.\n\t\t\t //\t\tNote that although for historical reasons this method is called `onInput()`, it doesn't\n\t\t\t //\t\tcorrespond to the standard DOM \"input\" event, because it occurs before the input has been processed.\n\t\t\t // event:\n\t\t\t //\t\tkeydown | keypress | cut | paste | compositionend\n\t\t\t // tags:\n\t\t\t //\t\tcallback\n\t\t },\n\n\t\t_onInput: function(/*Event*/ evt){\n\t\t\t// summary:\n\t\t\t//\t\tCalled AFTER the input event has happened and this.textbox.value has new value.\n\n\t\t\tthis._lastInputEventValue = this.textbox.value;\n\n\t\t\t// For Combobox, this needs to be called w/the keydown/keypress event that was passed to onInput().\n\t\t\t// As a backup, use the \"input\" event itself.\n\t\t\tthis._processInput(this._lastInputProducingEvent || evt);\n\t\t\tdelete this._lastInputProducingEvent;\n\n\t\t\tif(this.intermediateChanges){\n\t\t\t\tthis._handleOnChange(this.get('value'), false);\n\t\t\t}\n\t\t},\n\n\t\t_processInput: function(/*Event*/ /*===== evt =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tDefault action handler for user input events.\n\t\t\t//\t\tCalled after the \"input\" event (i.e. after this.textbox.value has been updated),\n\t\t\t//\t\tbut `evt` is the keydown/keypress/etc. event that triggered the \"input\" event.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis._refreshState();\n\n\t\t\t// In case someone is watch()'ing for changes to displayedValue\n\t\t\tthis._set(\"displayedValue\", this.get(\"displayedValue\"));\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\t// setting the value here is needed since value=\"\" in the template causes \"undefined\"\n\t\t\t// and setting in the DOM (instead of the JS object) helps with form reset actions\n\t\t\tthis.textbox.setAttribute(\"value\", this.textbox.value); // DOM and JS values should be the same\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// normalize input events to reduce spurious event processing\n\t\t\t//\tkeydown: do not forward modifier keys\n\t\t\t//\t\t       set charOrCode to numeric keycode\n\t\t\t//\tkeypress: do not forward numeric charOrCode keys (already sent through onkeydown)\n\t\t\t//\tpaste, cut, compositionend: set charOrCode to 229 (IME)\n\t\t\tfunction handleEvent(e){\n\t\t\t\tvar charOrCode;\n\n\t\t\t\t// Filter out keydown events that will be followed by keypress events.  Note that chrome/android\n\t\t\t\t// w/word suggestion has keydown/229 events on typing with no corresponding keypress events.\n\t\t\t\tif(e.type == \"keydown\" && e.keyCode != 229){\n\t\t\t\t\tcharOrCode = e.keyCode;\n\t\t\t\t\tswitch(charOrCode){ // ignore state keys\n\t\t\t\t\t\tcase keys.SHIFT:\n\t\t\t\t\t\tcase keys.ALT:\n\t\t\t\t\t\tcase keys.CTRL:\n\t\t\t\t\t\tcase keys.META:\n\t\t\t\t\t\tcase keys.CAPS_LOCK:\n\t\t\t\t\t\tcase keys.NUM_LOCK:\n\t\t\t\t\t\tcase keys.SCROLL_LOCK:\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(!e.ctrlKey && !e.metaKey && !e.altKey){ // no modifiers\n\t\t\t\t\t\tswitch(charOrCode){ // ignore location keys\n\t\t\t\t\t\t\tcase keys.NUMPAD_0:\n\t\t\t\t\t\t\tcase keys.NUMPAD_1:\n\t\t\t\t\t\t\tcase keys.NUMPAD_2:\n\t\t\t\t\t\t\tcase keys.NUMPAD_3:\n\t\t\t\t\t\t\tcase keys.NUMPAD_4:\n\t\t\t\t\t\t\tcase keys.NUMPAD_5:\n\t\t\t\t\t\t\tcase keys.NUMPAD_6:\n\t\t\t\t\t\t\tcase keys.NUMPAD_7:\n\t\t\t\t\t\t\tcase keys.NUMPAD_8:\n\t\t\t\t\t\t\tcase keys.NUMPAD_9:\n\t\t\t\t\t\t\tcase keys.NUMPAD_MULTIPLY:\n\t\t\t\t\t\t\tcase keys.NUMPAD_PLUS:\n\t\t\t\t\t\t\tcase keys.NUMPAD_ENTER:\n\t\t\t\t\t\t\tcase keys.NUMPAD_MINUS:\n\t\t\t\t\t\t\tcase keys.NUMPAD_PERIOD:\n\t\t\t\t\t\t\tcase keys.NUMPAD_DIVIDE:\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif((charOrCode >= 65 && charOrCode <= 90) || (charOrCode >= 48 && charOrCode <= 57) || charOrCode == keys.SPACE){\n\t\t\t\t\t\t\treturn; // keypress will handle simple non-modified printable keys\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar named = false;\n\t\t\t\t\t\tfor(var i in keys){\n\t\t\t\t\t\t\tif(keys[i] === e.keyCode){\n\t\t\t\t\t\t\t\tnamed = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!named){\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} // only allow named ones through\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcharOrCode = e.charCode >= 32 ? String.fromCharCode(e.charCode) : e.charCode;\n\t\t\t\tif(!charOrCode){\n\t\t\t\t\tcharOrCode = (e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == keys.SPACE ? String.fromCharCode(e.keyCode) : e.keyCode;\n\t\t\t\t}\n\t\t\t\tif(!charOrCode){\n\t\t\t\t\tcharOrCode = 229; // IME\n\t\t\t\t}\n\t\t\t\tif(e.type == \"keypress\"){\n\t\t\t\t\tif(typeof charOrCode != \"string\"){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif((charOrCode >= 'a' && charOrCode <= 'z') || (charOrCode >= 'A' && charOrCode <= 'Z') || (charOrCode >= '0' && charOrCode <= '9') || (charOrCode === ' ')){\n\t\t\t\t\t\tif(e.ctrlKey || e.metaKey || e.altKey){\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} // can only be stopped reliably in keydown\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// create fake event to set charOrCode and to know if preventDefault() was called\n\t\t\t\tvar faux = { faux: true }, attr;\n\t\t\t\tfor(attr in e){\n\t\t\t\t\tif(!/^(layer[XY]|returnValue|keyLocation)$/.test(attr)){ // prevent WebKit warnings\n\t\t\t\t\t\tvar v = e[attr];\n\t\t\t\t\t\tif(typeof v != \"function\" && typeof v != \"undefined\"){\n\t\t\t\t\t\t\tfaux[attr] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlang.mixin(faux, {\n\t\t\t\t\tcharOrCode: charOrCode,\n\t\t\t\t\t_wasConsumed: false,\n\t\t\t\t\tpreventDefault: function(){\n\t\t\t\t\t\tfaux._wasConsumed = true;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t},\n\t\t\t\t\tstopPropagation: function(){\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis._lastInputProducingEvent = faux;\n\n\t\t\t\t// Give web page author a chance to consume the event.  Note that onInput() may be called multiple times\n\t\t\t\t// for same keystroke: once for keypress event and once for input event.\n\t\t\t\t//console.log(faux.type + ', charOrCode = (' + (typeof charOrCode) + ') ' + charOrCode + ', ctrl ' + !!faux.ctrlKey + ', alt ' + !!faux.altKey + ', meta ' + !!faux.metaKey + ', shift ' + !!faux.shiftKey);\n\t\t\t\tif(this.onInput(faux) === false){ // return false means stop\n\t\t\t\t\tfaux.preventDefault();\n\t\t\t\t\tfaux.stopPropagation();\n\t\t\t\t}\n\t\t\t\tif(faux._wasConsumed){\n\t\t\t\t\treturn;\n\t\t\t\t} // if preventDefault was called\n\n\t\t\t\t// IE8 doesn't emit the \"input\" event at all, and IE9 doesn't emit it for backspace, delete, cut, etc.\n\t\t\t\t// Since the code below (and perhaps user code) depends on that event, emit it synthetically.\n\t\t\t\t// See http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html.\n\t\t\t\tif(has(\"ie\") <= 9){\n\t\t\t\t\tswitch(e.keyCode){\n\t\t\t\t\tcase keys.TAB:\n\t\t\t\t\tcase keys.ESCAPE:\n\t\t\t\t\tcase keys.DOWN_ARROW:\n\t\t\t\t\tcase keys.UP_ARROW:\n\t\t\t\t\tcase keys.LEFT_ARROW:\n\t\t\t\t\tcase keys.RIGHT_ARROW:\n\t\t\t\t\t\t// These keys may alter the <input>'s value indirectly, but we don't want to emit an \"input\"\n\t\t\t\t\t\t// event.  For example, the up/down arrows in TimeTextBox or ComboBox will cause the next\n\t\t\t\t\t\t// dropdown item's value to be copied to the <input>.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(e.keyCode == keys.ENTER && this.textbox.tagName.toLowerCase() != \"textarea\"){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.defer(function(){\n\t\t\t\t\t\t\tif(this.textbox.value !== this._lastInputEventValue){\n\t\t\t\t\t\t\t\ton.emit(this.textbox, \"input\", {bubbles: true});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.own(\n\t\t\t\ton(this.textbox, \"keydown, keypress, paste, cut, compositionend\", lang.hitch(this, handleEvent)),\n\t\t\t\ton(this.textbox, \"input\", lang.hitch(this, \"_onInput\")),\n\n\t\t\t\t// Allow keypress to bubble to this.domNode, so that TextBox.on(\"keypress\", ...) works,\n\t\t\t\t// but prevent it from further propagating, so that typing into a TextBox inside a Toolbar doesn't\n\t\t\t\t// trigger the Toolbar's letter key navigation.\n\t\t\t\ton(this.domNode, \"keypress\", function(e){ e.stopPropagation(); })\n\t\t\t);\n\t\t},\n\n\t\t_blankValue: '', // if the textbox is blank, what value should be reported\n\t\tfilter: function(val){\n\t\t\t// summary:\n\t\t\t//\t\tAuto-corrections (such as trimming) that are applied to textbox\n\t\t\t//\t\tvalue on blur or form submit.\n\t\t\t// description:\n\t\t\t//\t\tFor MappedTextBox subclasses, this is called twice\n\t\t\t//\n\t\t\t//\t\t- once with the display value\n\t\t\t//\t\t- once the value as set/returned by set('value', ...)\n\t\t\t//\n\t\t\t//\t\tand get('value'), ex: a Number for NumberTextBox.\n\t\t\t//\n\t\t\t//\t\tIn the latter case it does corrections like converting null to NaN.  In\n\t\t\t//\t\tthe former case the NumberTextBox.filter() method calls this.inherited()\n\t\t\t//\t\tto execute standard trimming code in TextBox.filter().\n\t\t\t//\n\t\t\t//\t\tTODO: break this into two methods in 2.0\n\t\t\t//\n\t\t\t// tags:\n\t\t\t//\t\tprotected extension\n\t\t\tif(val === null){\n\t\t\t\treturn this._blankValue;\n\t\t\t}\n\t\t\tif(typeof val != \"string\"){\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tif(this.trim){\n\t\t\t\tval = lang.trim(val);\n\t\t\t}\n\t\t\tif(this.uppercase){\n\t\t\t\tval = val.toUpperCase();\n\t\t\t}\n\t\t\tif(this.lowercase){\n\t\t\t\tval = val.toLowerCase();\n\t\t\t}\n\t\t\tif(this.propercase){\n\t\t\t\tval = val.replace(/[^\\s]+/g, function(word){\n\t\t\t\t\treturn word.substring(0, 1).toUpperCase() + word.substring(1);\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\t_setBlurValue: function(){\n\t\t\t// Format the displayed value, for example (for NumberTextBox) convert 1.4 to 1.400,\n\t\t\t// or (for CurrencyTextBox) 2.50 to $2.50\n\n\t\t\tthis._setValueAttr(this.get('value'), true);\n\t\t},\n\n\t\t_onBlur: function(e){\n\t\t\tif(this.disabled){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._setBlurValue();\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_isTextSelected: function(){\n\t\t\treturn this.textbox.selectionStart != this.textbox.selectionEnd;\n\t\t},\n\n\t\t_onFocus: function(/*String*/ by){\n\t\t\tif(this.disabled || this.readOnly){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Select all text on focus via click if nothing already selected.\n\t\t\t// Since mouse-up will clear the selection, need to defer selection until after mouse-up.\n\t\t\t// Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event.\n\t\t\tif(this.selectOnClick && by == \"mouse\"){\n\t\t\t\t// Use on.once() to only select all text on first click only; otherwise users would have no way to clear\n\t\t\t\t// the selection.\n\t\t\t\tthis._selectOnClickHandle = on.once(this.domNode, \"mouseup, touchend\", lang.hitch(this, function(evt){\n\t\t\t\t\t// Check if the user selected some text manually (mouse-down, mouse-move, mouse-up)\n\t\t\t\t\t// and if not, then select all the text\n\t\t\t\t\tif(!this._isTextSelected()){\n\t\t\t\t\t\t_TextBoxMixin.selectInputText(this.textbox);\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t\tthis.own(this._selectOnClickHandle);\n\n\t\t\t\t// in case the mouseup never comes\n\t\t\t\tthis.defer(function(){\n\t\t\t\t\tif(this._selectOnClickHandle){\n\t\t\t\t\t\tthis._selectOnClickHandle.remove();\n\t\t\t\t\t\tthis._selectOnClickHandle = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500); // if mouseup not received soon, then treat it as some gesture\n\t\t\t}\n\t\t\t// call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport\n\t\t\t// (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip\n\t\t\tthis.inherited(arguments);\n\n\t\t\tthis._refreshState();\n\t\t},\n\n\t\treset: function(){\n\t\t\t// Overrides `dijit/_FormWidget/reset()`.\n\t\t\t// Additionally resets the displayed textbox value to ''\n\t\t\tthis.textbox.value = '';\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\t_TextBoxMixin = declare(\"dijit.form._TextBoxMixin\", _TextBoxMixin, {\n\t\t\t_setValueAttr: function(){\n\t\t\t\tthis.inherited(arguments);\n\t\t\t\tthis.applyTextDir(this.focusNode);\n\t\t\t},\n\t\t\t_setDisplayedValueAttr: function(){\n\t\t\t\tthis.inherited(arguments);\n\t\t\t\tthis.applyTextDir(this.focusNode);\n\t\t\t},\n\t\t\t_onInput: function(){\n\t\t\t\tthis.applyTextDir(this.focusNode);\n\t\t\t\tthis.inherited(arguments);\n\t\t\t}\n\t\t});\n\t}\n\n\t_TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){\n\t\tif(element.setSelectionRange){\n\t\t\telement.setSelectionRange(start, stop);\n\t\t}\n\t};\n\n\t_TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){\n\t\t// summary:\n\t\t//\t\tSelect text in the input element argument, from start (default 0), to stop (default end).\n\n\t\t// TODO: use functions in _editor/selection.js?\n\t\telement = dom.byId(element);\n\t\tif(isNaN(start)){\n\t\t\tstart = 0;\n\t\t}\n\t\tif(isNaN(stop)){\n\t\t\tstop = element.value ? element.value.length : 0;\n\t\t}\n\t\ttry{\n\t\t\telement.focus();\n\t\t\t_TextBoxMixin._setSelectionRange(element, start, stop);\n\t\t}catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */\n\t\t}\n\t};\n\n\treturn _TextBoxMixin;\n});\n","/*\n * This module was modified by dojo-webpack-plugin to disable some locales\n * that were excluded by the plugin's 'locales' option\n */\ndefine(({'root':({'invalidMessage':'The value entered is not valid.','missingMessage':'This value is required.','rangeMessage':'This value is out of range.'}),'bs':false,'mk':false,'sr':false,'zh':false,'zh-tw':false,'vi':true,'uk':false,'tr':false,'th':false,'sv':false,'sl':false,'sk':false,'ru':false,'ro':false,'pt':false,'pt-pt':false,'pl':false,'nl':false,'nb':false,'lv':false,'lt':false,'ko':false,'kk':false,'ja':false,'it':false,'id':false,'hu':false,'hr':false,'hi':false,'he':false,'fr':false,'fi':false,'eu':false,'et':false,'es':false,'el':false,'de':false,'da':false,'cs':false,'ca':false,'bg':false,'az':false,'ar':false}))","define(\n//begin v1.x content\n({\n\tinvalidMessage: \"Giá trị được nhập không hợp lệ.\",\n\tmissingMessage: \"Giá trị này là bắt buộc.\",\n\trangeMessage: \"Giá trị này ngoài phạm vi.\"\n})\n//end v1.x content\n);\n","define([\"dojo/dom-class\", \"dojo/hccss\", \"dojo/domReady\", \"dojo/_base/window\"], function(domClass, has, domReady, win){\n\n\t// module:\n\t//\t\tdijit/hccss\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tTest if computer is in high contrast mode, and sets `dijit_a11y` flag on `<body>` if it is.\n\t\t//\t\tDeprecated, use ``dojo/hccss`` instead.\n\t};\n\t=====*/\n\n\tdomReady(function(){\n\t\tif(has(\"highcontrast\")){\n\t\t\tdomClass.add(win.body(), \"dijit_a11y\");\n\t\t}\n\t});\n\n\treturn has;\n});\n","define([\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.mixin lang.delegate lang.hitch lang.isFunction lang.isObject\n\t\"../_Widget\",\n\t\"../_Container\",\n\t\"./_ContentPaneResizeMixin\",\n\t\"dojo/string\", // string.substitute\n\t\"dojo/html\", // html._ContentSetter\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/Deferred\", // Deferred\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/dom-attr\", // domAttr.attr\n\t\"dojo/dom-construct\", // empty()\n\t\"dojo/_base/xhr\", // xhr.get\n\t\"dojo/i18n\", // i18n.getLocalization\n\t\"dojo/when\",\n\t\"dojo/i18n!../nls/loading\"\n], function(kernel, lang, _Widget, _Container, _ContentPaneResizeMixin, string, html, array, declare,\n\t\t\tDeferred, dom, domAttr, domConstruct, xhr, i18n, when){\n\n\t// module:\n\t//\t\tdijit/layout/ContentPane\n\n\treturn declare(\"dijit.layout.ContentPane\", [_Widget, _Container, _ContentPaneResizeMixin], {\n\t\t// summary:\n\t\t//\t\tA widget containing an HTML fragment, specified inline\n\t\t//\t\tor by uri.  Fragment may include widgets.\n\t\t//\n\t\t// description:\n\t\t//\t\tThis widget embeds a document fragment in the page, specified\n\t\t//\t\teither by uri, javascript generated markup or DOM reference.\n\t\t//\t\tAny widgets within this content are instantiated and managed,\n\t\t//\t\tbut laid out according to the HTML structure.  Unlike IFRAME,\n\t\t//\t\tContentPane embeds a document fragment as would be found\n\t\t//\t\tinside the BODY tag of a full HTML document.  It should not\n\t\t//\t\tcontain the HTML, HEAD, or BODY tags.\n\t\t//\t\tFor more advanced functionality with scripts and\n\t\t//\t\tstylesheets, see dojox/layout/ContentPane.  This widget may be\n\t\t//\t\tused stand alone or as a base class for other widgets.\n\t\t//\t\tContentPane is useful as a child of other layout containers\n\t\t//\t\tsuch as BorderContainer or TabContainer, but note that those\n\t\t//\t\twidgets can contain any widget as a child.\n\t\t//\n\t\t// example:\n\t\t//\t\tSome quick samples:\n\t\t//\t\tTo change the innerHTML:\n\t\t// |\t\tcp.set('content', '<b>new content</b>')`\n\t\t//\t\tOr you can send it a NodeList:\n\t\t// |\t\tcp.set('content', dojo.query('div [class=selected]', userSelection))\n\t\t//\t\tTo do an ajax update:\n\t\t// |\t\tcp.set('href', url)\n\n\t\t// href: String\n\t\t//\t\tThe href of the content that displays now.\n\t\t//\t\tSet this at construction if you want to load data externally when the\n\t\t//\t\tpane is shown.  (Set preload=true to load it immediately.)\n\t\t//\t\tChanging href after creation doesn't have any effect; Use set('href', ...);\n\t\thref: \"\",\n\n\t\t// content: String|DomNode|NodeList|dijit/_Widget\n\t\t//\t\tThe innerHTML of the ContentPane.\n\t\t//\t\tNote that the initialization parameter / argument to set(\"content\", ...)\n\t\t//\t\tcan be a String, DomNode, Nodelist, or _Widget.\n\t\tcontent: \"\",\n\n\t\t// extractContent: Boolean\n\t\t//\t\tExtract visible content from inside of `<body> .... </body>`.\n\t\t//\t\tI.e., strip `<html>` and `<head>` (and it's contents) from the href\n\t\textractContent: false,\n\n\t\t// parseOnLoad: Boolean\n\t\t//\t\tParse content and create the widgets, if any.\n\t\tparseOnLoad: true,\n\n\t\t// parserScope: String\n\t\t//\t\tFlag passed to parser.  Root for attribute names to search for.   If scopeName is dojo,\n\t\t//\t\twill search for data-dojo-type (or dojoType).  For backwards compatibility\n\t\t//\t\treasons defaults to dojo._scopeName (which is \"dojo\" except when\n\t\t//\t\tmulti-version support is used, when it will be something like dojo16, dojo20, etc.)\n\t\tparserScope: kernel._scopeName,\n\n\t\t// preventCache: Boolean\n\t\t//\t\tPrevent caching of data from href's by appending a timestamp to the href.\n\t\tpreventCache: false,\n\n\t\t// preload: Boolean\n\t\t//\t\tForce load of data on initialization even if pane is hidden.\n\t\tpreload: false,\n\n\t\t// refreshOnShow: Boolean\n\t\t//\t\tRefresh (re-download) content when pane goes from hidden to shown\n\t\trefreshOnShow: false,\n\n\t\t// loadingMessage: String\n\t\t//\t\tMessage that shows while downloading\n\t\tloadingMessage: \"<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>\",\n\n\t\t// errorMessage: String\n\t\t//\t\tMessage that shows if an error occurs\n\t\terrorMessage: \"<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>\",\n\n\t\t// isLoaded: [readonly] Boolean\n\t\t//\t\tTrue if the ContentPane has data in it, either specified\n\t\t//\t\tduring initialization (via href or inline content), or set\n\t\t//\t\tvia set('content', ...) / set('href', ...)\n\t\t//\n\t\t//\t\tFalse if it doesn't have any content, or if ContentPane is\n\t\t//\t\tstill in the process of downloading href.\n\t\tisLoaded: false,\n\n\t\tbaseClass: \"dijitContentPane\",\n\n\t\t/*======\n\t\t // ioMethod: dojo/_base/xhr.get|dojo._base/xhr.post\n\t\t //\t\tFunction that should grab the content specified via href.\n\t\t ioMethod: dojo.xhrGet,\n\t\t ======*/\n\n\t\t// ioArgs: Object\n\t\t//\t\tParameters to pass to xhrGet() request, for example:\n\t\t// |\t<div data-dojo-type=\"dijit/layout/ContentPane\" data-dojo-props=\"href: './bar', ioArgs: {timeout: 500}\">\n\t\tioArgs: {},\n\n\t\t// onLoadDeferred: [readonly] dojo.Deferred\n\t\t//\t\tThis is the `dojo.Deferred` returned by set('href', ...) and refresh().\n\t\t//\t\tCalling onLoadDeferred.then() registers your\n\t\t//\t\tcallback to be called only once, when the prior set('href', ...) call or\n\t\t//\t\tthe initial href parameter to the constructor finishes loading.\n\t\t//\n\t\t//\t\tThis is different than an onLoad() handler which gets called any time any href\n\t\t//\t\tor content is loaded.\n\t\tonLoadDeferred: null,\n\n\t\t// Cancel _WidgetBase's _setTitleAttr because we don't want the title attribute (used to specify\n\t\t// tab labels) to be copied to ContentPane.domNode... otherwise a tooltip shows up over the\n\t\t// entire pane.\n\t\t_setTitleAttr: null,\n\n\t\t// Flag to parser that I'll parse my contents, so it shouldn't.\n\t\tstopParser: true,\n\n\t\t// template: [private] Boolean\n\t\t//\t\tFlag from the parser that this ContentPane is inside a template\n\t\t//\t\tso the contents are pre-parsed.\n\t\t// TODO: this declaration can be commented out in 2.0\n\t\ttemplate: false,\n\n\t\tmarkupFactory: function(params, node, ctor){\n\t\t\tvar self = new ctor(params, node);\n\n\t\t\t// If a parse has started but is waiting for modules to load, then return a Promise for when the parser\n\t\t\t// finishes.  Don't return a promise though for the case when content hasn't started loading because the\n\t\t\t// ContentPane is hidden and it has an href (ex: hidden pane of a TabContainer).   In that case we consider\n\t\t\t// that initialization has already finished.\n\t\t\treturn !self.href && self._contentSetter && self._contentSetter.parseDeferred && !self._contentSetter.parseDeferred.isFulfilled() ?\n\t\t\t\tself._contentSetter.parseDeferred.then(function(){\n\t\t\t\t\treturn self;\n\t\t\t\t}) : self;\n\t\t},\n\n\t\tcreate: function(params, srcNodeRef){\n\t\t\t// Convert a srcNodeRef argument into a content parameter, so that the original contents are\n\t\t\t// processed in the same way as contents set via set(\"content\", ...), calling the parser etc.\n\t\t\t// Avoid modifying original params object since that breaks NodeList instantiation, see #11906.\n\t\t\tif((!params || !params.template) && srcNodeRef && !(\"href\" in params) && !(\"content\" in params)){\n\t\t\t\tsrcNodeRef = dom.byId(srcNodeRef);\n\t\t\t\tvar df = srcNodeRef.ownerDocument.createDocumentFragment();\n\t\t\t\twhile(srcNodeRef.firstChild){\n\t\t\t\t\tdf.appendChild(srcNodeRef.firstChild);\n\t\t\t\t}\n\t\t\t\tparams = lang.delegate(params, {content: df});\n\t\t\t}\n\t\t\tthis.inherited(arguments, [params, srcNodeRef]);\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tvar messages = i18n.getLocalization(\"dijit\", \"loading\", this.lang);\n\t\t\tthis.loadingMessage = string.substitute(this.loadingMessage, messages);\n\t\t\tthis.errorMessage = string.substitute(this.errorMessage, messages);\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Since we have no template we need to set this.containerNode ourselves, to make getChildren() work.\n\t\t\t// For subclasses of ContentPane that do have a template, does nothing.\n\t\t\tif(!this.containerNode){\n\t\t\t\tthis.containerNode = this.domNode;\n\t\t\t}\n\n\t\t\t// remove the title attribute so it doesn't show up when hovering\n\t\t\t// over a node  (TODO: remove in 2.0, no longer needed after #11490)\n\t\t\tthis.domNode.removeAttribute(\"title\");\n\t\t},\n\n\t\tstartup: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCall startup() on all children including non _Widget ones like dojo/dnd/Source objects\n\n\t\t\t// This starts all the widgets\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// And this catches stuff like dojo/dnd/Source\n\t\t\tif(this._contentSetter){\n\t\t\t\tarray.forEach(this._contentSetter.parseResults, function(obj){\n\t\t\t\t\tif(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){\n\t\t\t\t\t\tobj.startup();\n\t\t\t\t\t\tobj._started = true;\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\t\t\t}\n\t\t},\n\n\t\t_startChildren: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when content is loaded.   Calls startup on each child widget.   Similar to ContentPane.startup()\n\t\t\t//\t\titself, but avoids marking the ContentPane itself as \"restarted\" (see #15581).\n\n\t\t\t// This starts all the widgets\n\t\t\tarray.forEach(this.getChildren(), function(obj){\n\t\t\t\tif(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){\n\t\t\t\t\tobj.startup();\n\t\t\t\t\tobj._started = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// And this catches stuff like dojo/dnd/Source\n\t\t\tif(this._contentSetter){\n\t\t\t\tarray.forEach(this._contentSetter.parseResults, function(obj){\n\t\t\t\t\tif(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){\n\t\t\t\t\t\tobj.startup();\n\t\t\t\t\t\tobj._started = true;\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\t\t\t}\n\t\t},\n\n\t\tsetHref: function(/*String|Uri*/ href){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.   Use set('href', ...) instead.\n\t\t\tkernel.deprecated(\"dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.\", \"\", \"2.0\");\n\t\t\treturn this.set(\"href\", href);\n\t\t},\n\t\t_setHrefAttr: function(/*String|Uri*/ href){\n\t\t\t// summary:\n\t\t\t//\t\tHook so set(\"href\", ...) works.\n\t\t\t// description:\n\t\t\t//\t\tReset the (external defined) content of this pane and replace with new url\n\t\t\t//\t\tNote: It delays the download until widget is shown if preload is false.\n\t\t\t// href:\n\t\t\t//\t\turl to the page you want to get, must be within the same domain as your mainpage\n\n\t\t\t// Cancel any in-flight requests (a set('href', ...) will cancel any in-flight set('href', ...))\n\t\t\tthis.cancel();\n\n\t\t\tthis.onLoadDeferred = new Deferred(lang.hitch(this, \"cancel\"));\n\t\t\tthis.onLoadDeferred.then(lang.hitch(this, \"onLoad\"));\n\n\t\t\tthis._set(\"href\", href);\n\n\t\t\t// _setHrefAttr() is called during creation and by the user, after creation.\n\t\t\t// Assuming preload == false, only in the second case do we actually load the URL;\n\t\t\t// otherwise it's done in startup(), and only if this widget is shown.\n\t\t\tif(this.preload || (this._created && this._isShown())){\n\t\t\t\tthis._load();\n\t\t\t}else{\n\t\t\t\t// Set flag to indicate that href needs to be loaded the next time the\n\t\t\t\t// ContentPane is made visible\n\t\t\t\tthis._hrefChanged = true;\n\t\t\t}\n\n\t\t\treturn this.onLoadDeferred;\t\t// Deferred\n\t\t},\n\n\t\tsetContent: function(/*String|DomNode|Nodelist*/data){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated.   Use set('content', ...) instead.\n\t\t\tkernel.deprecated(\"dijit.layout.ContentPane.setContent() is deprecated.  Use set('content', ...) instead.\", \"\", \"2.0\");\n\t\t\tthis.set(\"content\", data);\n\t\t},\n\t\t_setContentAttr: function(/*String|DomNode|Nodelist*/data){\n\t\t\t// summary:\n\t\t\t//\t\tHook to make set(\"content\", ...) work.\n\t\t\t//\t\tReplaces old content with data content, include style classes from old content\n\t\t\t// data:\n\t\t\t//\t\tthe new Content may be String, DomNode or NodeList\n\t\t\t//\n\t\t\t//\t\tif data is a NodeList (or an array of nodes) nodes are copied\n\t\t\t//\t\tso you can import nodes from another document implicitly\n\n\t\t\t// clear href so we can't run refresh and clear content\n\t\t\t// refresh should only work if we downloaded the content\n\t\t\tthis._set(\"href\", \"\");\n\n\t\t\t// Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...))\n\t\t\tthis.cancel();\n\n\t\t\t// Even though user is just setting content directly, still need to define an onLoadDeferred\n\t\t\t// because the _onLoadHandler() handler is still getting called from setContent()\n\t\t\tthis.onLoadDeferred = new Deferred(lang.hitch(this, \"cancel\"));\n\t\t\tif(this._created){\n\t\t\t\t// For back-compat reasons, call onLoad() for set('content', ...)\n\t\t\t\t// calls but not for content specified in srcNodeRef (ie: <div data-dojo-type=ContentPane>...</div>)\n\t\t\t\t// or as initialization parameter (ie: new ContentPane({content: ...})\n\t\t\t\tthis.onLoadDeferred.then(lang.hitch(this, \"onLoad\"));\n\t\t\t}\n\n\t\t\tthis._setContent(data || \"\");\n\n\t\t\tthis._isDownloaded = false; // mark that content is from a set('content') not a set('href')\n\n\t\t\treturn this.onLoadDeferred;\t// Deferred\n\t\t},\n\t\t_getContentAttr: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHook to make get(\"content\") work\n\t\t\treturn this.containerNode.innerHTML;\n\t\t},\n\n\t\tcancel: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCancels an in-flight download of content\n\t\t\tif(this._xhrDfd && (this._xhrDfd.fired == -1)){\n\t\t\t\tthis._xhrDfd.cancel();\n\t\t\t}\n\t\t\tdelete this._xhrDfd; // garbage collect\n\n\t\t\tthis.onLoadDeferred = null;\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tthis.cancel();\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tdestroyRecursive: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy the ContentPane and its contents\n\n\t\t\t// if we have multiple controllers destroying us, bail after the first\n\t\t\tif(this._beingDestroyed){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_onShow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the ContentPane is made visible\n\t\t\t// description:\n\t\t\t//\t\tFor a plain ContentPane, this is called on initialization, from startup().\n\t\t\t//\t\tIf the ContentPane is a hidden pane of a TabContainer etc., then it's\n\t\t\t//\t\tcalled whenever the pane is made visible.\n\t\t\t//\n\t\t\t//\t\tDoes necessary processing, including href download and layout/resize of\n\t\t\t//\t\tchild widget(s)\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif(this.href){\n\t\t\t\tif(!this._xhrDfd && // if there's an href that isn't already being loaded\n\t\t\t\t\t(!this.isLoaded || this._hrefChanged || this.refreshOnShow)\n\t\t\t\t\t){\n\t\t\t\t\treturn this.refresh();\t// If child has an href, promise that fires when the load is complete\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trefresh: function(){\n\t\t\t// summary:\n\t\t\t//\t\t[Re]download contents of href and display\n\t\t\t// description:\n\t\t\t//\t\t1. cancels any currently in-flight requests\n\t\t\t//\t\t2. posts \"loading...\" message\n\t\t\t//\t\t3. sends XHR to download new data\n\n\t\t\t// Cancel possible prior in-flight request\n\t\t\tthis.cancel();\n\n\t\t\tthis.onLoadDeferred = new Deferred(lang.hitch(this, \"cancel\"));\n\t\t\tthis.onLoadDeferred.then(lang.hitch(this, \"onLoad\"));\n\t\t\tthis._load();\n\t\t\treturn this.onLoadDeferred;\t\t// If child has an href, promise that fires when refresh is complete\n\t\t},\n\n\t\t_load: function(){\n\t\t\t// summary:\n\t\t\t//\t\tLoad/reload the href specified in this.href\n\n\t\t\t// display loading message\n\t\t\tthis._setContent(this.onDownloadStart(), true);\n\n\t\t\tvar self = this;\n\t\t\tvar getArgs = {\n\t\t\t\tpreventCache: (this.preventCache || this.refreshOnShow),\n\t\t\t\turl: this.href,\n\t\t\t\thandleAs: \"text\"\n\t\t\t};\n\t\t\tif(lang.isObject(this.ioArgs)){\n\t\t\t\tlang.mixin(getArgs, this.ioArgs);\n\t\t\t}\n\n\t\t\tvar hand = (this._xhrDfd = (this.ioMethod || xhr.get)(getArgs)),\n\t\t\t\treturnedHtml;\n\n\t\t\thand.then(\n\t\t\t\tfunction(html){\n\t\t\t\t\treturnedHtml = html;\n\t\t\t\t\ttry{\n\t\t\t\t\t\tself._isDownloaded = true;\n\t\t\t\t\t\treturn self._setContent(html, false);\n\t\t\t\t\t}catch(err){\n\t\t\t\t\t\tself._onError('Content', err); // onContentError\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfunction(err){\n\t\t\t\t\tif(!hand.canceled){\n\t\t\t\t\t\t// show error message in the pane\n\t\t\t\t\t\tself._onError('Download', err); // onDownloadError\n\t\t\t\t\t}\n\t\t\t\t\tdelete self._xhrDfd;\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t).then(function(){\n\t\t\t\t\tself.onDownloadEnd();\n\t\t\t\t\tdelete self._xhrDfd;\n\t\t\t\t\treturn returnedHtml;\n\t\t\t\t});\n\n\t\t\t// Remove flag saying that a load is needed\n\t\t\tdelete this._hrefChanged;\n\t\t},\n\n\t\t_onLoadHandler: function(data){\n\t\t\t// summary:\n\t\t\t//\t\tThis is called whenever new content is being loaded\n\t\t\tthis._set(\"isLoaded\", true);\n\t\t\ttry{\n\t\t\t\tthis.onLoadDeferred.resolve(data);\n\t\t\t}catch(e){\n\t\t\t\tconsole.error('Error ' + (this.widgetId || this.id) + ' running custom onLoad code: ' + e.message);\n\t\t\t}\n\t\t},\n\n\t\t_onUnloadHandler: function(){\n\t\t\t// summary:\n\t\t\t//\t\tThis is called whenever the content is being unloaded\n\t\t\tthis._set(\"isLoaded\", false);\n\t\t\ttry{\n\t\t\t\tthis.onUnload();\n\t\t\t}catch(e){\n\t\t\t\tconsole.error('Error ' + this.widgetId + ' running custom onUnload code: ' + e.message);\n\t\t\t}\n\t\t},\n\n\t\tdestroyDescendants: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy all the widgets inside the ContentPane and empty containerNode\n\n\t\t\t// Make sure we call onUnload (but only when the ContentPane has real content)\n\t\t\tif(this.isLoaded){\n\t\t\t\tthis._onUnloadHandler();\n\t\t\t}\n\n\t\t\t// Even if this.isLoaded == false there might still be a \"Loading...\" message\n\t\t\t// to erase, so continue...\n\n\t\t\t// For historical reasons we need to delete all widgets under this.containerNode,\n\t\t\t// even ones that the user has created manually.\n\t\t\tvar setter = this._contentSetter;\n\t\t\tarray.forEach(this.getChildren(), function(widget){\n\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\t// All widgets will hit this branch\n\t\t\t\t\twidget.destroyRecursive(preserveDom);\n\t\t\t\t}else if(widget.destroy){\n\t\t\t\t\t// Things like dojo/dnd/Source have destroy(), not destroyRecursive()\n\t\t\t\t\twidget.destroy(preserveDom);\n\t\t\t\t}\n\t\t\t\twidget._destroyed = true;\n\t\t\t});\n\t\t\tif(setter){\n\t\t\t\t// Most of the widgets in setter.parseResults have already been destroyed, but\n\t\t\t\t// things like Menu that have been moved to <body> haven't yet\n\t\t\t\tarray.forEach(setter.parseResults, function(widget){\n\t\t\t\t\tif(!widget._destroyed){\n\t\t\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\t\t\t// All widgets will hit this branch\n\t\t\t\t\t\t\twidget.destroyRecursive(preserveDom);\n\t\t\t\t\t\t}else if(widget.destroy){\n\t\t\t\t\t\t\t// Things like dojo/dnd/Source have destroy(), not destroyRecursive()\n\t\t\t\t\t\t\twidget.destroy(preserveDom);\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidget._destroyed = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tdelete setter.parseResults;\n\t\t\t}\n\n\t\t\t// And then clear away all the DOM nodes\n\t\t\tif(!preserveDom){\n\t\t\t\tdomConstruct.empty(this.containerNode);\n\t\t\t}\n\n\t\t\t// Delete any state information we have about current contents\n\t\t\tdelete this._singleChild;\n\t\t},\n\n\t\t_setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){\n\t\t\t// summary:\n\t\t\t//\t\tInsert the content into the container node\n\t\t\t// returns:\n\t\t\t//\t\tReturns a Deferred promise that is resolved when the content is parsed.\n\n\t\t\tcont = this.preprocessContent(cont);\n\t\t\t// first get rid of child widgets\n\t\t\tthis.destroyDescendants();\n\n\t\t\t// html.set will take care of the rest of the details\n\t\t\t// we provide an override for the error handling to ensure the widget gets the errors\n\t\t\t// configure the setter instance with only the relevant widget instance properties\n\t\t\t// NOTE: unless we hook into attr, or provide property setters for each property,\n\t\t\t// we need to re-configure the ContentSetter with each use\n\t\t\tvar setter = this._contentSetter;\n\t\t\tif(!(setter && setter instanceof html._ContentSetter)){\n\t\t\t\tsetter = this._contentSetter = new html._ContentSetter({\n\t\t\t\t\tnode: this.containerNode,\n\t\t\t\t\t_onError: lang.hitch(this, this._onError),\n\t\t\t\t\tonContentError: lang.hitch(this, function(e){\n\t\t\t\t\t\t// fires if a domfault occurs when we are appending this.errorMessage\n\t\t\t\t\t\t// like for instance if domNode is a UL and we try append a DIV\n\t\t\t\t\t\tvar errMess = this.onContentError(e);\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tthis.containerNode.innerHTML = errMess;\n\t\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\tconsole.error('Fatal ' + this.id + ' could not change content due to ' + e.message, e);\n\t\t\t\t\t\t}\n\t\t\t\t\t})/*,\n\t\t\t\t\t _onError */\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar setterParams = lang.mixin({\n\t\t\t\tcleanContent: this.cleanContent,\n\t\t\t\textractContent: this.extractContent,\n\t\t\t\tparseContent: !cont.domNode && this.parseOnLoad,\n\t\t\t\tparserScope: this.parserScope,\n\t\t\t\tstartup: false,\n\t\t\t\tdir: this.dir,\n\t\t\t\tlang: this.lang,\n\t\t\t\ttextDir: this.textDir\n\t\t\t}, this._contentSetterParams || {});\n\n\t\t\tvar p = setter.set((lang.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams);\n\n\t\t\t// dojox/layout/html/_base::_ContentSetter.set() returns a Promise that indicates when everything is completed.\n\t\t\t// dojo/html::_ContentSetter.set() currently returns the DOMNode, but that will be changed for 2.0.\n\t\t\t// So, if set() returns a promise then use it, otherwise fallback to waiting on setter.parseDeferred\n\t\t\tvar self = this;\n\t\t\treturn when(p && p.then ? p : setter.parseDeferred, function(){\n\t\t\t\t// setter params must be pulled afresh from the ContentPane each time\n\t\t\t\tdelete self._contentSetterParams;\n\n\t\t\t\tif(!isFakeContent){\n\t\t\t\t\tif(self._started){\n\t\t\t\t\t\t// Startup each top level child widget (and they will start their children, recursively)\n\t\t\t\t\t\tself._startChildren();\n\n\t\t\t\t\t\t// Call resize() on each of my child layout widgets,\n\t\t\t\t\t\t// or resize() on my single child layout widget...\n\t\t\t\t\t\t// either now (if I'm currently visible) or when I become visible\n\t\t\t\t\t\tself._scheduleLayout();\n\t\t\t\t\t}\n\t\t\t\t\tself._onLoadHandler(cont);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tpreprocessContent: function(/*String|DocumentFragment*/ content){\n\t\t\t// summary:\n\t\t\t//\t\tHook, called after content has loaded, before being processed.\n\t\t\t// description:\n\t\t\t//\t\tA subclass should preprocess the content and return the preprocessed content.\n\t\t\t//\t\tSee https://bugs.dojotoolkit.org/ticket/9622\n\t\t\t// returns:\n\t\t\t//\t\tReturns preprocessed content, either a String or DocumentFragment\n\t\t\treturn content;\n\t\t},\n\n\t\t_onError: function(type, err, consoleText){\n\t\t\tthis.onLoadDeferred.reject(err);\n\n\t\t\t// shows user the string that is returned by on[type]Error\n\t\t\t// override on[type]Error and return your own string to customize\n\t\t\tvar errText = this['on' + type + 'Error'].call(this, err);\n\t\t\tif(consoleText){\n\t\t\t\tconsole.error(consoleText, err);\n\t\t\t}else if(errText){// a empty string won't change current content\n\t\t\t\tthis._setContent(errText, true);\n\t\t\t}\n\t\t},\n\n\t\t// EVENT's, should be overide-able\n\t\tonLoad: function(/*===== data =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tEvent hook, is called after everything is loaded and widgetified\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonUnload: function(){\n\t\t\t// summary:\n\t\t\t//\t\tEvent hook, is called before old content is cleared\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonDownloadStart: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled before download starts.\n\t\t\t// description:\n\t\t\t//\t\tThe string returned by this function will be the html\n\t\t\t//\t\tthat tells the user we are loading something.\n\t\t\t//\t\tOverride with your own function if you want to change text.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t\treturn this.loadingMessage;\n\t\t},\n\n\t\tonContentError: function(/*Error*/ /*===== error =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCalled on DOM faults, require faults etc. in content.\n\t\t\t//\n\t\t\t//\t\tIn order to display an error message in the pane, return\n\t\t\t//\t\tthe error message from this method, as an HTML string.\n\t\t\t//\n\t\t\t//\t\tBy default (if this method is not overriden), it returns\n\t\t\t//\t\tnothing, so the error message is just printed to the console.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t},\n\n\t\tonDownloadError: function(/*Error*/ /*===== error =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when download error occurs.\n\t\t\t//\n\t\t\t//\t\tIn order to display an error message in the pane, return\n\t\t\t//\t\tthe error message from this method, as an HTML string.\n\t\t\t//\n\t\t\t//\t\tDefault behavior (if this method is not overriden) is to display\n\t\t\t//\t\tthe error message inside the pane.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t\treturn this.errorMessage;\n\t\t},\n\n\t\tonDownloadEnd: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when download is finished.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.filter array.forEach\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-class\", // domClass.contains domClass.toggle\n\t\"dojo/dom-geometry\", // domGeometry.contentBox domGeometry.marginBox\n\t\"dojo/dom-style\",\n\t\"dojo/_base/lang\", // lang.mixin\n\t\"dojo/query\", // query\n\t\"../registry\", // registry.byId\n\t\"../Viewport\",\n\t\"./utils\" // marginBox2contextBox\n], function(array, declare, domClass, domGeometry, domStyle, lang, query,\n\t\t\tregistry, Viewport, layoutUtils){\n\n\t// module:\n\t//\t\tdijit/layout/_ContentPaneResizeMixin\n\n\treturn declare(\"dijit.layout._ContentPaneResizeMixin\", null, {\n\t\t// summary:\n\t\t//\t\tResize() functionality of ContentPane.   If there's a single layout widget\n\t\t//\t\tchild then it will call resize() with the same dimensions as the ContentPane.\n\t\t//\t\tOtherwise just calls resize on each child.\n\t\t//\n\t\t//\t\tAlso implements basic startup() functionality, where starting the parent\n\t\t//\t\twill start the children\n\n\t\t// doLayout: Boolean\n\t\t//\t\t- false - don't adjust size of children\n\t\t//\t\t- true - if there is a single visible child widget, set it's size to however big the ContentPane is\n\t\tdoLayout: true,\n\n\t\t// isLayoutContainer: [protected] Boolean\n\t\t//\t\tIndicates that this widget will call resize() on it's child widgets\n\t\t//\t\twhen they become visible.\n\t\tisLayoutContainer: true,\n\n\t\tstartup: function(){\n\t\t\t// summary:\n\t\t\t//\t\tSee `dijit/layout/_LayoutWidget.startup()` for description.\n\t\t\t//\t\tAlthough ContentPane doesn't extend _LayoutWidget, it does implement\n\t\t\t//\t\tthe same API.\n\n\t\t\tif(this._started){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parent = this.getParent();\n\t\t\tthis._childOfLayoutWidget = parent && parent.isLayoutContainer;\n\n\t\t\t// I need to call resize() on my child/children (when I become visible), unless\n\t\t\t// I'm the child of a layout widget in which case my parent will call resize() on me and I'll do it then.\n\t\t\tthis._needLayout = !this._childOfLayoutWidget;\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif(this._isShown()){\n\t\t\t\tthis._onShow();\n\t\t\t}\n\n\t\t\tif(!this._childOfLayoutWidget){\n\t\t\t\t// Since my parent isn't a layout container, and my style *may be* width=height=100%\n\t\t\t\t// or something similar (either set directly or via a CSS class),\n\t\t\t\t// monitor when viewport size changes so that I can re-layout.\n\t\t\t\t// This is more for subclasses of ContentPane than ContentPane itself, although it\n\t\t\t\t// could be useful for a ContentPane if it has a single child widget inheriting ContentPane's size.\n\t\t\t\tthis.own(Viewport.on(\"resize\", lang.hitch(this, \"resize\")));\n\t\t\t}\n\t\t},\n\n\t\t_checkIfSingleChild: function(){\n\t\t\t// summary:\n\t\t\t//\t\tTest if we have exactly one visible widget as a child,\n\t\t\t//\t\tand if so assume that we are a container for that widget,\n\t\t\t//\t\tand should propagate startup() and resize() calls to it.\n\t\t\t//\t\tSkips over things like data stores since they aren't visible.\n\n\t\t\tif(!this.doLayout){ return; }\n\n\t\t\tvar candidateWidgets = [],\n\t\t\t\totherVisibleNodes = false;\n\n\t\t\tquery(\"> *\", this.containerNode).some(function(node){\n\t\t\t\tvar widget = registry.byNode(node);\n\t\t\t\tif(widget && widget.resize){\n\t\t\t\t\tcandidateWidgets.push(widget);\n\t\t\t\t}else if(!/script|link|style/i.test(node.nodeName) && node.offsetHeight){\n\t\t\t\t\totherVisibleNodes = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._singleChild = candidateWidgets.length == 1 && !otherVisibleNodes ?\n\t\t\t\tcandidateWidgets[0] : null;\n\n\t\t\t// So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449)\n\t\t\tdomClass.toggle(this.containerNode, this.baseClass + \"SingleChild\", !!this._singleChild);\n\t\t},\n\n\t\tresize: function(changeSize, resultSize){\n\t\t\t// summary:\n\t\t\t//\t\tSee `dijit/layout/_LayoutWidget.resize()` for description.\n\t\t\t//\t\tAlthough ContentPane doesn't extend _LayoutWidget, it does implement\n\t\t\t//\t\tthe same API.\n\n\t\t\tthis._resizeCalled = true;\n\n\t\t\tthis._scheduleLayout(changeSize, resultSize);\n\t\t},\n\n\t\t_scheduleLayout: function(changeSize, resultSize){\n\t\t\t// summary:\n\t\t\t//\t\tResize myself, and call resize() on each of my child layout widgets, either now\n\t\t\t//\t\t(if I'm currently visible) or when I become visible\n\t\t\tif(this._isShown()){\n\t\t\t\tthis._layout(changeSize, resultSize);\n\t\t\t}else{\n\t\t\t\tthis._needLayout = true;\n\t\t\t\tthis._changeSize = changeSize;\n\t\t\t\tthis._resultSize = resultSize;\n\t\t\t}\n\t\t},\n\n\t\t_layout: function(changeSize, resultSize){\n\t\t\t// summary:\n\t\t\t//\t\tResize myself according to optional changeSize/resultSize parameters, like a layout widget.\n\t\t\t//\t\tAlso, since I am an isLayoutContainer widget, each of my children expects me to\n\t\t\t//\t\tcall resize() or layout() on it.\n\t\t\t//\n\t\t\t//\t\tShould be called on initialization and also whenever we get new content\n\t\t\t//\t\t(from an href, or from set('content', ...))... but deferred until\n\t\t\t//\t\tthe ContentPane is visible\n\n\t\t\tdelete this._needLayout;\n\n\t\t\t// For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is\n\t\t\t// never called directly, so resize() is our trigger to do the initial href download (see [20099]).\n\t\t\t// However, don't load href for closed TitlePanes.\n\t\t\tif(!this._wasShown && this.open !== false){\n\t\t\t\tthis._onShow();\n\t\t\t}\n\n\t\t\t// Set margin box size, unless it wasn't specified, in which case use current size.\n\t\t\tif(changeSize){\n\t\t\t\tdomGeometry.setMarginBox(this.domNode, changeSize);\n\t\t\t}\n\n\t\t\t// Compute content box size of containerNode in case we [later] need to size our single child.\n\t\t\tvar cn = this.containerNode;\n\t\t\tif(cn === this.domNode){\n\t\t\t\t// If changeSize or resultSize was passed to this method and this.containerNode ==\n\t\t\t\t// this.domNode then we can compute the content-box size without querying the node,\n\t\t\t\t// which is more reliable (similar to LayoutWidget.resize) (see for example #9449).\n\t\t\t\tvar mb = resultSize || {};\n\t\t\t\tlang.mixin(mb, changeSize || {}); // changeSize overrides resultSize\n\t\t\t\tif(!(\"h\" in mb) || !(\"w\" in mb)){\n\t\t\t\t\tmb = lang.mixin(domGeometry.getMarginBox(cn), mb); // just use domGeometry.setMarginBox() to fill in missing values\n\t\t\t\t}\n\t\t\t\tthis._contentBox = layoutUtils.marginBox2contentBox(cn, mb);\n\t\t\t}else{\n\t\t\t\tthis._contentBox = domGeometry.getContentBox(cn);\n\t\t\t}\n\n\t\t\tthis._layoutChildren();\n\t\t},\n\n\t\t_layoutChildren: function(){\n\t\t\t// Call _checkIfSingleChild() again in case app has manually mucked w/the content\n\t\t\t// of the ContentPane (rather than changing it through the set(\"content\", ...) API.\n\t\t\tthis._checkIfSingleChild();\n\n\t\t\tif(this._singleChild && this._singleChild.resize){\n\t\t\t\tvar cb = this._contentBox || domGeometry.getContentBox(this.containerNode);\n\n\t\t\t\t// note: if widget has padding this._contentBox will have l and t set,\n\t\t\t\t// but don't pass them to resize() or it will doubly-offset the child\n\t\t\t\tthis._singleChild.resize({w: cb.w, h: cb.h});\n\t\t\t}else{\n\t\t\t\t// All my child widgets are independently sized (rather than matching my size),\n\t\t\t\t// but I still need to call resize() on each child to make it layout.\n\t\t\t\tvar children = this.getChildren(),\n\t\t\t\t\twidget,\n\t\t\t\t\ti = 0;\n\t\t\t\twhile(widget = children[i++]){\n\t\t\t\t\tif(widget.resize){\n\t\t\t\t\t\twidget.resize();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_isShown: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if the content is currently shown.\n\t\t\t// description:\n\t\t\t//\t\tIf I am a child of a layout widget then it actually returns true if I've ever been visible,\n\t\t\t//\t\tnot whether I'm currently visible, since that's much faster than tracing up the DOM/widget\n\t\t\t//\t\ttree every call, and at least solves the performance problem on page load by deferring loading\n\t\t\t//\t\thidden ContentPanes until they are first shown\n\n\t\t\tif(this._childOfLayoutWidget){\n\t\t\t\t// If we are TitlePane, etc - we return that only *IF* we've been resized\n\t\t\t\tif(this._resizeCalled && \"open\" in this){\n\t\t\t\t\treturn this.open;\n\t\t\t\t}\n\t\t\t\treturn this._resizeCalled;\n\t\t\t}else if(\"open\" in this){\n\t\t\t\treturn this.open;\t\t// for TitlePane, etc.\n\t\t\t}else{\n\t\t\t\tvar node = this.domNode, parent = this.domNode.parentNode;\n\t\t\t\treturn (node.style.display != 'none') && (node.style.visibility != 'hidden') && !domClass.contains(node, \"dijitHidden\") &&\n\t\t\t\t\tparent && parent.style && (parent.style.display != 'none');\n\t\t\t}\n\t\t},\n\n\t\t_onShow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the ContentPane is made visible\n\t\t\t// description:\n\t\t\t//\t\tFor a plain ContentPane, this is called on initialization, from startup().\n\t\t\t//\t\tIf the ContentPane is a hidden pane of a TabContainer etc., then it's\n\t\t\t//\t\tcalled whenever the pane is made visible.\n\t\t\t//\n\t\t\t//\t\tDoes layout/resize of child widget(s)\n\n\t\t\t// Need to keep track of whether ContentPane has been shown (which is different than\n\t\t\t// whether or not it's currently visible).\n\t\t\tthis._wasShown = true;\n\n\t\t\tif(this._needLayout){\n\t\t\t\t// If a layout has been scheduled for when we become visible, do it now\n\t\t\t\tthis._layout(this._changeSize, this._resultSize);\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.filter array.forEach\n\t\"dojo/dom-class\", // domClass.add domClass.remove\n\t\"dojo/dom-geometry\", // domGeometry.marginBox\n\t\"dojo/dom-style\", // domStyle.getComputedStyle\n\t\"dojo/_base/lang\" // lang.mixin, lang.setObject\n], function(array, domClass, domGeometry, domStyle, lang){\n\n\t// module:\n\t//\t\tdijit/layout/utils\n\n\tfunction capitalize(word){\n\t\treturn word.substring(0,1).toUpperCase() + word.substring(1);\n\t}\n\n\tfunction size(widget, dim){\n\t\t// size the child\n\t\tvar newSize = widget.resize ? widget.resize(dim) : domGeometry.setMarginBox(widget.domNode, dim);\n\n\t\t// record child's size\n\t\tif(newSize){\n\t\t\t// if the child returned it's new size then use that\n\t\t\tlang.mixin(widget, newSize);\n\t\t}else{\n\t\t\t// otherwise, call getMarginBox(), but favor our own numbers when we have them.\n\t\t\t// the browser lies sometimes\n\t\t\tlang.mixin(widget, domGeometry.getMarginBox(widget.domNode));\n\t\t\tlang.mixin(widget, dim);\n\t\t}\n\t}\n\n\tvar utils = {\n\t\t// summary:\n\t\t//\t\tUtility functions for doing layout\n\n\t\tmarginBox2contentBox: function(/*DomNode*/ node, /*Object*/ mb){\n\t\t\t// summary:\n\t\t\t//\t\tGiven the margin-box size of a node, return its content box size.\n\t\t\t//\t\tFunctions like domGeometry.contentBox() but is more reliable since it doesn't have\n\t\t\t//\t\tto wait for the browser to compute sizes.\n\t\t\tvar cs = domStyle.getComputedStyle(node);\n\t\t\tvar me = domGeometry.getMarginExtents(node, cs);\n\t\t\tvar pb = domGeometry.getPadBorderExtents(node, cs);\n\t\t\treturn {\n\t\t\t\tl: domStyle.toPixelValue(node, cs.paddingLeft),\n\t\t\t\tt: domStyle.toPixelValue(node, cs.paddingTop),\n\t\t\t\tw: mb.w - (me.w + pb.w),\n\t\t\t\th: mb.h - (me.h + pb.h)\n\t\t\t};\n\t\t},\n\n\n\t\tlayoutChildren: function(/*DomNode*/ container, /*Object*/ dim, /*Widget[]*/ children,\n\t\t\t\t/*String?*/ changedRegionId, /*Number?*/ changedRegionSize){\n\t\t\t// summary:\n\t\t\t//\t\tLayout a bunch of child dom nodes within a parent dom node\n\t\t\t// container:\n\t\t\t//\t\tparent node\n\t\t\t// dim:\n\t\t\t//\t\t{l, t, w, h} object specifying dimensions of container into which to place children\n\t\t\t// children:\n\t\t\t//\t\tAn array of Widgets or at least objects containing:\n\t\t\t//\n\t\t\t//\t\t- domNode: pointer to DOM node to position\n\t\t\t//\t\t- region or layoutAlign: position to place DOM node\n\t\t\t//\t\t- resize(): (optional) method to set size of node\n\t\t\t//\t\t- id: (optional) Id of widgets, referenced from resize object, below.\n\t\t\t//\n\t\t\t//\t\tThe widgets in this array should be ordered according to how they should be laid out\n\t\t\t//\t\t(each element will be processed in order, and take up as much remaining space as needed),\n\t\t\t//\t\twith the center widget last.\n\t\t\t// changedRegionId:\n\t\t\t//\t\tIf specified, the slider for the region with the specified id has been dragged, and thus\n\t\t\t//\t\tthe region's height or width should be adjusted according to changedRegionSize\n\t\t\t// changedRegionSize:\n\t\t\t//\t\tSee changedRegionId.\n\n\t\t\t// copy dim because we are going to modify it\n\t\t\tdim = lang.mixin({}, dim);\n\n\t\t\tdomClass.add(container, \"dijitLayoutContainer\");\n\n\t\t\t// Move \"client\" elements to the end of the array for layout.  a11y dictates that the author\n\t\t\t// needs to be able to put them in the document in tab-order, but this algorithm requires that\n\t\t\t// client be last.    TODO: remove for 2.0, all dijit client code already sends children as last item.\n\t\t\tchildren = array.filter(children, function(item){ return item.region != \"center\" && item.layoutAlign != \"client\"; })\n\t\t\t\t.concat(array.filter(children, function(item){ return item.region == \"center\" || item.layoutAlign == \"client\"; }));\n\n\t\t\t// set positions/sizes\n\t\t\tarray.forEach(children, function(child){\n\t\t\t\tvar elm = child.domNode,\n\t\t\t\t\tpos = (child.region || child.layoutAlign);\n\t\t\t\tif(!pos){\n\t\t\t\t\tthrow new Error(\"No region setting for \" + child.id)\n\t\t\t\t}\n\n\t\t\t\t// set elem to upper left corner of unused space; may move it later\n\t\t\t\tvar elmStyle = elm.style;\n\t\t\t\telmStyle.left = dim.l+\"px\";\n\t\t\t\telmStyle.top = dim.t+\"px\";\n\t\t\t\telmStyle.position = \"absolute\";\n\n\t\t\t\tdomClass.add(elm, \"dijitAlign\" + capitalize(pos));\n\n\t\t\t\t// Size adjustments to make to this child widget\n\t\t\t\tvar sizeSetting = {};\n\n\t\t\t\t// Check for optional size adjustment due to splitter drag (height adjustment for top/bottom align\n\t\t\t\t// panes and width adjustment for left/right align panes.\n\t\t\t\tif(changedRegionId && changedRegionId == child.id){\n\t\t\t\t\tsizeSetting[child.region == \"top\" || child.region == \"bottom\" ? \"h\" : \"w\"] = changedRegionSize;\n\t\t\t\t}\n\n\t\t\t\tif(pos == \"leading\"){\n\t\t\t\t\tpos = child.isLeftToRight() ? \"left\" : \"right\";\n\t\t\t\t}\n\t\t\t\tif(pos == \"trailing\"){\n\t\t\t\t\tpos = child.isLeftToRight() ? \"right\" : \"left\";\n\t\t\t\t}\n\n\t\t\t\t// set size && adjust record of remaining space.\n\t\t\t\t// note that setting the width of a <div> may affect its height.\n\t\t\t\tif(pos == \"top\" || pos == \"bottom\"){\n\t\t\t\t\tsizeSetting.w = dim.w;\n\t\t\t\t\tsize(child, sizeSetting);\n\t\t\t\t\tdim.h -= child.h;\n\t\t\t\t\tif(pos == \"top\"){\n\t\t\t\t\t\tdim.t += child.h;\n\t\t\t\t\t}else{\n\t\t\t\t\t\telmStyle.top = dim.t + dim.h + \"px\";\n\t\t\t\t\t}\n\t\t\t\t}else if(pos == \"left\" || pos == \"right\"){\n\t\t\t\t\tsizeSetting.h = dim.h;\n\t\t\t\t\tsize(child, sizeSetting);\n\t\t\t\t\tdim.w -= child.w;\n\t\t\t\t\tif(pos == \"left\"){\n\t\t\t\t\t\tdim.l += child.w;\n\t\t\t\t\t}else{\n\t\t\t\t\t\telmStyle.left = dim.l + dim.w + \"px\";\n\t\t\t\t\t}\n\t\t\t\t}else if(pos == \"client\" || pos == \"center\"){\n\t\t\t\t\tsize(child, dim);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tlang.setObject(\"dijit.layout.utils\", utils);\t// remove for 2.0\n\n\treturn utils;\n});\n","define([\n\t\"dojo/_base/kernel\"\n], function(dojo){\n\t// module:\n\t//\t\tdijit/main\n\n/*=====\nreturn {\n\t// summary:\n\t//\t\tThe dijit package main module.\n\t//\t\tDeprecated.   Users should access individual modules (ex: dijit/registry) directly.\n};\n=====*/\n\n\treturn dojo.dijit;\n});\n","/*\n * This module was modified by dojo-webpack-plugin to disable some locales\n * that were excluded by the plugin's 'locales' option\n */\ndefine(({'root':({'buttonOk':'OK','buttonCancel':'Cancel','buttonSave':'Save','itemClose':'Close'}),'bs':false,'mk':false,'sr':false,'zh':false,'zh-tw':false,'vi':true,'uk':false,'tr':false,'th':false,'sv':false,'sl':false,'sk':false,'ru':false,'ro':false,'pt':false,'pt-pt':false,'pl':false,'nl':false,'nb':false,'lv':false,'lt':false,'ko':false,'kk':false,'ja':false,'it':false,'id':false,'hu':false,'hr':false,'hi':false,'he':false,'fr':false,'fi':false,'eu':false,'et':false,'es':false,'el':false,'de':false,'da':false,'cs':false,'ca':false,'bg':false,'az':false,'ar':false}))","/*\n * This module was modified by dojo-webpack-plugin to disable some locales\n * that were excluded by the plugin's 'locales' option\n */\ndefine(({'root':({'loadingState':'Loading...','errorState':'Sorry, an error occurred'}),'bs':false,'mk':false,'sr':false,'zh':false,'zh-tw':false,'vi':true,'uk':false,'tr':false,'th':false,'sv':false,'sl':false,'sk':false,'ru':false,'ro':false,'pt':false,'pt-pt':false,'pl':false,'nl':false,'nb':false,'lv':false,'lt':false,'ko':false,'kk':false,'ja':false,'it':false,'id':false,'hu':false,'hr':false,'hi':false,'he':false,'fr':false,'fi':false,'eu':false,'et':false,'es':false,'el':false,'de':false,'da':false,'cs':false,'ca':false,'bg':false,'az':false,'ar':false}))","define(\n//begin v1.x content\n({\n\tbuttonOk: \"OK\",\n\tbuttonCancel: \"Hủy\",\n\tbuttonSave: \"Lưu\",\n\titemClose: \"Đóng\"\n})\n//end v1.x content\n);\n","define(\n//begin v1.x content\n({\n\tloadingState: \"Đang tải...\",\n\terrorState: \"Rất tiếc, đã xảy ra lỗi\"\n})\n//end v1.x content\n);\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map array.some\n\t\"dojo/dom-geometry\", // domGeometry.position\n\t\"dojo/dom-style\", // domStyle.getComputedStyle\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/window\", // win.body\n\t\"./Viewport\", // getEffectiveBox\n\t\"./main\"\t// dijit (defining dijit.place to match API doc)\n], function(array, domGeometry, domStyle, kernel, win, Viewport, dijit){\n\n\t// module:\n\t//\t\tdijit/place\n\n\n\tfunction _place(/*DomNode*/ node, choices, layoutNode, aroundNodeCoords){\n\t\t// summary:\n\t\t//\t\tGiven a list of spots to put node, put it at the first spot where it fits,\n\t\t//\t\tof if it doesn't fit anywhere then the place with the least overflow\n\t\t// choices: Array\n\t\t//\t\tArray of elements like: {corner: 'TL', pos: {x: 10, y: 20} }\n\t\t//\t\tAbove example says to put the top-left corner of the node at (10,20)\n\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner, size)\n\t\t//\t\tfor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t//\t\tbased on their orientation relative to the parent.\t This adjusts the popup based on orientation.\n\t\t//\t\tIt also passes in the available size for the popup, which is useful for tooltips to\n\t\t//\t\ttell them that their width is limited to a certain amount.\t layoutNode() may return a value expressing\n\t\t//\t\thow much the popup had to be modified to fit into the available space.\t This is used to determine\n\t\t//\t\twhat the best placement is.\n\t\t// aroundNodeCoords: Object\n\t\t//\t\tSize of aroundNode, ex: {w: 200, h: 50}\n\n\t\t// get {x: 10, y: 10, w: 100, h:100} type obj representing position of\n\t\t// viewport over document\n\t\tvar view = Viewport.getEffectiveBox(node.ownerDocument);\n\n\t\t// This won't work if the node is inside a <div style=\"position: relative\">,\n\t\t// so reattach it to <body>.\t (Otherwise, the positioning will be wrong\n\t\t// and also it might get cutoff.)\n\t\tif(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != \"body\"){\n\t\t\twin.body(node.ownerDocument).appendChild(node);\n\t\t}\n\n\t\tvar best = null;\n\t\tarray.some(choices, function(choice){\n\t\t\tvar corner = choice.corner;\n\t\t\tvar pos = choice.pos;\n\t\t\tvar overflow = 0;\n\n\t\t\t// calculate amount of space available given specified position of node\n\t\t\tvar spaceAvailable = {\n\t\t\t\tw: {\n\t\t\t\t\t'L': view.l + view.w - pos.x,\n\t\t\t\t\t'R': pos.x - view.l,\n\t\t\t\t\t'M': view.w\n\t\t\t\t}[corner.charAt(1)],\n\t\t\t\th: {\n\t\t\t\t\t'T': view.t + view.h - pos.y,\n\t\t\t\t\t'B': pos.y - view.t,\n\t\t\t\t\t'M': view.h\n\t\t\t\t}[corner.charAt(0)]\n\t\t\t};\n\n\t\t\t// Clear left/right position settings set earlier so they don't interfere with calculations,\n\t\t\t// specifically when layoutNode() (a.k.a. Tooltip.orient()) measures natural width of Tooltip\n\t\t\tvar s = node.style;\n\t\t\ts.left = s.right = \"auto\";\n\n\t\t\t// configure node to be displayed in given position relative to button\n\t\t\t// (need to do this in order to get an accurate size for the node, because\n\t\t\t// a tooltip's size changes based on position, due to triangle)\n\t\t\tif(layoutNode){\n\t\t\t\tvar res = layoutNode(node, choice.aroundCorner, corner, spaceAvailable, aroundNodeCoords);\n\t\t\t\toverflow = typeof res == \"undefined\" ? 0 : res;\n\t\t\t}\n\n\t\t\t// get node's size\n\t\t\tvar style = node.style;\n\t\t\tvar oldDisplay = style.display;\n\t\t\tvar oldVis = style.visibility;\n\t\t\tif(style.display == \"none\"){\n\t\t\t\tstyle.visibility = \"hidden\";\n\t\t\t\tstyle.display = \"\";\n\t\t\t}\n\t\t\tvar bb = domGeometry.position(node);\n\t\t\tstyle.display = oldDisplay;\n\t\t\tstyle.visibility = oldVis;\n\n\t\t\t// coordinates and size of node with specified corner placed at pos,\n\t\t\t// and clipped by viewport\n\t\t\tvar\n\t\t\t\tstartXpos = {\n\t\t\t\t\t'L': pos.x,\n\t\t\t\t\t'R': pos.x - bb.w,\n\t\t\t\t\t'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (bb.w >> 1)) - bb.w) // M orientation is more flexible\n\t\t\t\t}[corner.charAt(1)],\n\t\t\t\tstartYpos = {\n\t\t\t\t\t'T': pos.y,\n\t\t\t\t\t'B': pos.y - bb.h,\n\t\t\t\t\t'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (bb.h >> 1)) - bb.h)\n\t\t\t\t}[corner.charAt(0)],\n\t\t\t\tstartX = Math.max(view.l, startXpos),\n\t\t\t\tstartY = Math.max(view.t, startYpos),\n\t\t\t\tendX = Math.min(view.l + view.w, startXpos + bb.w),\n\t\t\t\tendY = Math.min(view.t + view.h, startYpos + bb.h),\n\t\t\t\twidth = endX - startX,\n\t\t\t\theight = endY - startY;\n\n\t\t\toverflow += (bb.w - width) + (bb.h - height);\n\n\t\t\tif(best == null || overflow < best.overflow){\n\t\t\t\tbest = {\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\taroundCorner: choice.aroundCorner,\n\t\t\t\t\tx: startX,\n\t\t\t\t\ty: startY,\n\t\t\t\t\tw: width,\n\t\t\t\t\th: height,\n\t\t\t\t\toverflow: overflow,\n\t\t\t\t\tspaceAvailable: spaceAvailable\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn !overflow;\n\t\t});\n\n\t\t// In case the best position is not the last one we checked, need to call\n\t\t// layoutNode() again.\n\t\tif(best.overflow && layoutNode){\n\t\t\tlayoutNode(node, best.aroundCorner, best.corner, best.spaceAvailable, aroundNodeCoords);\n\t\t}\n\n\t\t// And then position the node.  Do this last, after the layoutNode() above\n\t\t// has sized the node, due to browser quirks when the viewport is scrolled\n\t\t// (specifically that a Tooltip will shrink to fit as though the window was\n\t\t// scrolled to the left).\n\n\t\tvar top = best.y,\n\t\t\tside = best.x,\n\t\t\tbody = win.body(node.ownerDocument);\n\n\t\tif(/relative|absolute/.test(domStyle.get(body, \"position\"))){\n\t\t\t// compensate for margin on <body>, see #16148\n\t\t\ttop -= domStyle.get(body, \"marginTop\");\n\t\t\tside -= domStyle.get(body, \"marginLeft\");\n\t\t}\n\n\t\tvar s = node.style;\n\t\ts.top = top + \"px\";\n\t\ts.left = side + \"px\";\n\t\ts.right = \"auto\";\t// needed for FF or else tooltip goes to far left\n\n\t\treturn best;\n\t}\n\n\tvar reverse = {\n\t\t// Map from corner to kitty-corner\n\t\t\"TL\": \"BR\",\n\t\t\"TR\": \"BL\",\n\t\t\"BL\": \"TR\",\n\t\t\"BR\": \"TL\"\n\t};\n\n\tvar place = {\n\t\t// summary:\n\t\t//\t\tCode to place a DOMNode relative to another DOMNode.\n\t\t//\t\tLoad using require([\"dijit/place\"], function(place){ ... }).\n\n\t\tat: function(node, pos, corners, padding, layoutNode){\n\t\t\t// summary:\n\t\t\t//\t\tPositions node kitty-corner to the rectangle centered at (pos.x, pos.y) with width and height of\n\t\t\t//\t\tpadding.x * 2 and padding.y * 2, or zero if padding not specified.  Picks first corner in corners[]\n\t\t\t//\t\twhere node is fully visible, or the corner where it's most visible.\n\t\t\t//\n\t\t\t//\t\tNode is assumed to be absolutely or relatively positioned.\n\t\t\t// node: DOMNode\n\t\t\t//\t\tThe node to position\n\t\t\t// pos: dijit/place.__Position\n\t\t\t//\t\tObject like {x: 10, y: 20}\n\t\t\t// corners: String[]\n\t\t\t//\t\tArray of Strings representing order to try corners of the node in, like [\"TR\", \"BL\"].\n\t\t\t//\t\tPossible values are:\n\t\t\t//\n\t\t\t//\t\t- \"BL\" - bottom left\n\t\t\t//\t\t- \"BR\" - bottom right\n\t\t\t//\t\t- \"TL\" - top left\n\t\t\t//\t\t- \"TR\" - top right\n\t\t\t// padding: dijit/place.__Position?\n\t\t\t//\t\tOptional param to set padding, to put some buffer around the element you want to position.\n\t\t\t//\t\tDefaults to zero.\n\t\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner)\n\t\t\t//\t\tFor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t\t//\t\tbased on their orientation relative to the parent.  This adjusts the popup based on orientation.\n\t\t\t// example:\n\t\t\t//\t\tTry to place node's top right corner at (10,20).\n\t\t\t//\t\tIf that makes node go (partially) off screen, then try placing\n\t\t\t//\t\tbottom left corner at (10,20).\n\t\t\t//\t|\tplace(node, {x: 10, y: 20}, [\"TR\", \"BL\"])\n\t\t\tvar choices = array.map(corners, function(corner){\n\t\t\t\tvar c = {\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\taroundCorner: reverse[corner],\t// so TooltipDialog.orient() gets aroundCorner argument set\n\t\t\t\t\tpos: {x: pos.x,y: pos.y}\n\t\t\t\t};\n\t\t\t\tif(padding){\n\t\t\t\t\tc.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;\n\t\t\t\t\tc.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;\n\t\t\t\t}\n\t\t\t\treturn c;\n\t\t\t});\n\n\t\t\treturn _place(node, choices, layoutNode);\n\t\t},\n\n\t\taround: function(\n\t\t\t/*DomNode*/\t\tnode,\n\t\t\t/*DomNode|dijit/place.__Rectangle*/ anchor,\n\t\t\t/*String[]*/\tpositions,\n\t\t\t/*Boolean*/\t\tleftToRight,\n\t\t\t/*Function?*/\tlayoutNode){\n\n\t\t\t// summary:\n\t\t\t//\t\tPosition node adjacent or kitty-corner to anchor\n\t\t\t//\t\tsuch that it's fully visible in viewport.\n\t\t\t// description:\n\t\t\t//\t\tPlace node such that corner of node touches a corner of\n\t\t\t//\t\taroundNode, and that node is fully visible.\n\t\t\t// anchor:\n\t\t\t//\t\tEither a DOMNode or a rectangle (object with x, y, width, height).\n\t\t\t// positions:\n\t\t\t//\t\tOrdered list of positions to try matching up.\n\t\t\t//\n\t\t\t//\t\t- before: places drop down to the left of the anchor node/widget, or to the right in the case\n\t\t\t//\t\t\tof RTL scripts like Hebrew and Arabic; aligns either the top of the drop down\n\t\t\t//\t\t\twith the top of the anchor, or the bottom of the drop down with bottom of the anchor.\n\t\t\t//\t\t- after: places drop down to the right of the anchor node/widget, or to the left in the case\n\t\t\t//\t\t\tof RTL scripts like Hebrew and Arabic; aligns either the top of the drop down\n\t\t\t//\t\t\twith the top of the anchor, or the bottom of the drop down with bottom of the anchor.\n\t\t\t//\t\t- before-centered: centers drop down to the left of the anchor node/widget, or to the right\n\t\t\t//\t\t\tin the case of RTL scripts like Hebrew and Arabic\n\t\t\t//\t\t- after-centered: centers drop down to the right of the anchor node/widget, or to the left\n\t\t\t//\t\t\tin the case of RTL scripts like Hebrew and Arabic\n\t\t\t//\t\t- above-centered: drop down is centered above anchor node\n\t\t\t//\t\t- above: drop down goes above anchor node, left sides aligned\n\t\t\t//\t\t- above-alt: drop down goes above anchor node, right sides aligned\n\t\t\t//\t\t- below-centered: drop down is centered above anchor node\n\t\t\t//\t\t- below: drop down goes below anchor node\n\t\t\t//\t\t- below-alt: drop down goes below anchor node, right sides aligned\n\t\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner)\n\t\t\t//\t\tFor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t\t//\t\tbased on their orientation relative to the parent.\t This adjusts the popup based on orientation.\n\t\t\t// leftToRight:\n\t\t\t//\t\tTrue if widget is LTR, false if widget is RTL.   Affects the behavior of \"above\" and \"below\"\n\t\t\t//\t\tpositions slightly.\n\t\t\t// example:\n\t\t\t//\t|\tplaceAroundNode(node, aroundNode, ['below', 'above-alt']);\n\t\t\t//\t\tThis will try to position node such that node's top-left corner is at the same position\n\t\t\t//\t\tas the bottom left corner of the aroundNode (ie, put node below\n\t\t\t//\t\taroundNode, with left edges aligned).\tIf that fails it will try to put\n\t\t\t//\t\tthe bottom-right corner of node where the top right corner of aroundNode is\n\t\t\t//\t\t(ie, put node above aroundNode, with right edges aligned)\n\t\t\t//\n\n\t\t\t// If around is a DOMNode (or DOMNode id), convert to coordinates.\n\t\t\tvar aroundNodePos;\n\t\t\tif(typeof anchor == \"string\" || \"offsetWidth\" in anchor || \"ownerSVGElement\" in anchor){\n\t\t\t\taroundNodePos = domGeometry.position(anchor, true);\n\n\t\t\t\t// For above and below dropdowns, subtract width of border so that popup and aroundNode borders\n\t\t\t\t// overlap, preventing a double-border effect.  Unfortunately, difficult to measure the border\n\t\t\t\t// width of either anchor or popup because in both cases the border may be on an inner node.\n\t\t\t\tif(/^(above|below)/.test(positions[0])){\n\t\t\t\t\tvar anchorBorder = domGeometry.getBorderExtents(anchor),\n\t\t\t\t\t\tanchorChildBorder = anchor.firstChild ? domGeometry.getBorderExtents(anchor.firstChild) : {t:0,l:0,b:0,r:0},\n\t\t\t\t\t\tnodeBorder =  domGeometry.getBorderExtents(node),\n\t\t\t\t\t\tnodeChildBorder = node.firstChild ? domGeometry.getBorderExtents(node.firstChild) : {t:0,l:0,b:0,r:0};\n\t\t\t\t\taroundNodePos.y += Math.min(anchorBorder.t + anchorChildBorder.t, nodeBorder.t + nodeChildBorder.t);\n\t\t\t\t\taroundNodePos.h -=  Math.min(anchorBorder.t + anchorChildBorder.t, nodeBorder.t+ nodeChildBorder.t) +\n\t\t\t\t\t\tMath.min(anchorBorder.b + anchorChildBorder.b, nodeBorder.b + nodeChildBorder.b);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\taroundNodePos = anchor;\n\t\t\t}\n\n\t\t\t// Compute position and size of visible part of anchor (it may be partially hidden by ancestor nodes w/scrollbars)\n\t\t\tif(anchor.parentNode){\n\t\t\t\t// ignore nodes between position:relative and position:absolute\n\t\t\t\tvar sawPosAbsolute = domStyle.getComputedStyle(anchor).position == \"absolute\";\n\t\t\t\tvar parent = anchor.parentNode;\n\t\t\t\twhile(parent && parent.nodeType == 1 && parent.nodeName != \"BODY\"){  //ignoring the body will help performance\n\t\t\t\t\tvar parentPos = domGeometry.position(parent, true),\n\t\t\t\t\t\tpcs = domStyle.getComputedStyle(parent);\n\t\t\t\t\tif(/relative|absolute/.test(pcs.position)){\n\t\t\t\t\t\tsawPosAbsolute = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(!sawPosAbsolute && /hidden|auto|scroll/.test(pcs.overflow)){\n\t\t\t\t\t\tvar bottomYCoord = Math.min(aroundNodePos.y + aroundNodePos.h, parentPos.y + parentPos.h);\n\t\t\t\t\t\tvar rightXCoord = Math.min(aroundNodePos.x + aroundNodePos.w, parentPos.x + parentPos.w);\n\t\t\t\t\t\taroundNodePos.x = Math.max(aroundNodePos.x, parentPos.x);\n\t\t\t\t\t\taroundNodePos.y = Math.max(aroundNodePos.y, parentPos.y);\n\t\t\t\t\t\taroundNodePos.h = bottomYCoord - aroundNodePos.y;\n\t\t\t\t\t\taroundNodePos.w = rightXCoord - aroundNodePos.x;\n\t\t\t\t\t}\n\t\t\t\t\tif(pcs.position == \"absolute\"){\n\t\t\t\t\t\tsawPosAbsolute = true;\n\t\t\t\t\t}\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar x = aroundNodePos.x,\n\t\t\t\ty = aroundNodePos.y,\n\t\t\t\twidth = \"w\" in aroundNodePos ? aroundNodePos.w : (aroundNodePos.w = aroundNodePos.width),\n\t\t\t\theight = \"h\" in aroundNodePos ? aroundNodePos.h : (kernel.deprecated(\"place.around: dijit/place.__Rectangle: { x:\"+x+\", y:\"+y+\", height:\"+aroundNodePos.height+\", width:\"+width+\" } has been deprecated.  Please use { x:\"+x+\", y:\"+y+\", h:\"+aroundNodePos.height+\", w:\"+width+\" }\", \"\", \"2.0\"), aroundNodePos.h = aroundNodePos.height);\n\n\t\t\t// Convert positions arguments into choices argument for _place()\n\t\t\tvar choices = [];\n\t\t\tfunction push(aroundCorner, corner){\n\t\t\t\tchoices.push({\n\t\t\t\t\taroundCorner: aroundCorner,\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\tpos: {\n\t\t\t\t\t\tx: {\n\t\t\t\t\t\t\t'L': x,\n\t\t\t\t\t\t\t'R': x + width,\n\t\t\t\t\t\t\t'M': x + (width >> 1)\n\t\t\t\t\t\t}[aroundCorner.charAt(1)],\n\t\t\t\t\t\ty: {\n\t\t\t\t\t\t\t'T': y,\n\t\t\t\t\t\t\t'B': y + height,\n\t\t\t\t\t\t\t'M': y + (height >> 1)\n\t\t\t\t\t\t}[aroundCorner.charAt(0)]\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tarray.forEach(positions, function(pos){\n\t\t\t\tvar ltr =  leftToRight;\n\t\t\t\tswitch(pos){\n\t\t\t\t\tcase \"above-centered\":\n\t\t\t\t\t\tpush(\"TM\", \"BM\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"below-centered\":\n\t\t\t\t\t\tpush(\"BM\", \"TM\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"after-centered\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"before-centered\":\n\t\t\t\t\t\tpush(ltr ? \"ML\" : \"MR\", ltr ? \"MR\" : \"ML\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"after\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"before\":\n\t\t\t\t\t\tpush(ltr ? \"TL\" : \"TR\", ltr ? \"TR\" : \"TL\");\n\t\t\t\t\t\tpush(ltr ? \"BL\" : \"BR\", ltr ? \"BR\" : \"BL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"below-alt\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"below\":\n\t\t\t\t\t\t// first try to align left borders, next try to align right borders (or reverse for RTL mode)\n\t\t\t\t\t\tpush(ltr ? \"BL\" : \"BR\", ltr ? \"TL\" : \"TR\");\n\t\t\t\t\t\tpush(ltr ? \"BR\" : \"BL\", ltr ? \"TR\" : \"TL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"above-alt\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"above\":\n\t\t\t\t\t\t// first try to align left borders, next try to align right borders (or reverse for RTL mode)\n\t\t\t\t\t\tpush(ltr ? \"TL\" : \"TR\", ltr ? \"BL\" : \"BR\");\n\t\t\t\t\t\tpush(ltr ? \"TR\" : \"TL\", ltr ? \"BR\" : \"BL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// To assist dijit/_base/place, accept arguments of type {aroundCorner: \"BL\", corner: \"TL\"}.\n\t\t\t\t\t\t// Not meant to be used directly.  Remove for 2.0.\n\t\t\t\t\t\tpush(pos.aroundCorner, pos.corner);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar position = _place(node, choices, layoutNode, {w: width, h: height});\n\t\t\tposition.aroundNodePos = aroundNodePos;\n\n\t\t\treturn position;\n\t\t}\n\t};\n\n\t/*=====\n\tplace.__Position = {\n\t\t// x: Integer\n\t\t//\t\thorizontal coordinate in pixels, relative to document body\n\t\t// y: Integer\n\t\t//\t\tvertical coordinate in pixels, relative to document body\n\t};\n\tplace.__Rectangle = {\n\t\t// x: Integer\n\t\t//\t\thorizontal offset in pixels, relative to document body\n\t\t// y: Integer\n\t\t//\t\tvertical offset in pixels, relative to document body\n\t\t// w: Integer\n\t\t//\t\twidth in pixels.   Can also be specified as \"width\" for backwards-compatibility.\n\t\t// h: Integer\n\t\t//\t\theight in pixels.   Can also be specified as \"height\" for backwards-compatibility.\n\t};\n\t=====*/\n\n\treturn dijit.place = place;\t// setting dijit.place for back-compat, remove for 2.0\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/_base/window\", // win.body\n\t\"./main\"\t// dijit._scopeName\n], function(array, win, dijit){\n\n\t// module:\n\t//\t\tdijit/registry\n\n\tvar _widgetTypeCtr = {}, hash = {};\n\n\tvar registry =  {\n\t\t// summary:\n\t\t//\t\tRegistry of existing widget on page, plus some utility methods.\n\n\t\t// length: Number\n\t\t//\t\tNumber of registered widgets\n\t\tlength: 0,\n\n\t\tadd: function(widget){\n\t\t\t// summary:\n\t\t\t//\t\tAdd a widget to the registry. If a duplicate ID is detected, a error is thrown.\n\t\t\t// widget: dijit/_WidgetBase\n\t\t\t//\t\tAny dijit/_WidgetBase subclass.\n\t\t\tif(hash[widget.id]){\n\t\t\t\tthrow new Error(\"Tried to register widget with id==\" + widget.id + \" but that id is already registered\");\n\t\t\t}\n\t\t\thash[widget.id] = widget;\n\t\t\tthis.length++;\n\t\t},\n\n\t\tremove: function(/*String*/ id){\n\t\t\t// summary:\n\t\t\t//\t\tRemove a widget from the registry. Does not destroy the widget; simply\n\t\t\t//\t\tremoves the reference.\n\t\t\tif(hash[id]){\n\t\t\t\tdelete hash[id];\n\t\t\t\tthis.length--;\n\t\t\t}\n\t\t},\n\n\t\tbyId: function(/*String|Widget*/ id){\n\t\t\t// summary:\n\t\t\t//\t\tFind a widget by it's id.\n\t\t\t//\t\tIf passed a widget then just returns the widget.\n\t\t\treturn typeof id == \"string\" ? hash[id] : id;\t// dijit/_WidgetBase\n\t\t},\n\n\t\tbyNode: function(/*DOMNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the widget corresponding to the given DOMNode\n\t\t\treturn hash[node.getAttribute(\"widgetId\")]; // dijit/_WidgetBase\n\t\t},\n\n\t\ttoArray: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConvert registry into a true Array\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tWork with the widget .domNodes in a real Array\n\t\t\t//\t\t|\tarray.map(registry.toArray(), function(w){ return w.domNode; });\n\n\t\t\tvar ar = [];\n\t\t\tfor(var id in hash){\n\t\t\t\tar.push(hash[id]);\n\t\t\t}\n\t\t\treturn ar;\t// dijit/_WidgetBase[]\n\t\t},\n\n\t\tgetUniqueId: function(/*String*/widgetType){\n\t\t\t// summary:\n\t\t\t//\t\tGenerates a unique id for a given widgetType\n\n\t\t\tvar id;\n\t\t\tdo{\n\t\t\t\tid = widgetType + \"_\" +\n\t\t\t\t\t(widgetType in _widgetTypeCtr ?\n\t\t\t\t\t\t++_widgetTypeCtr[widgetType] : _widgetTypeCtr[widgetType] = 0);\n\t\t\t}while(hash[id]);\n\t\t\treturn dijit._scopeName == \"dijit\" ? id : dijit._scopeName + \"_\" + id; // String\n\t\t},\n\n\t\tfindWidgets: function(root, skipNode){\n\t\t\t// summary:\n\t\t\t//\t\tSearch subtree under root returning widgets found.\n\t\t\t//\t\tDoesn't search for nested widgets (ie, widgets inside other widgets).\n\t\t\t// root: DOMNode\n\t\t\t//\t\tNode to search under.\n\t\t\t// skipNode: DOMNode\n\t\t\t//\t\tIf specified, don't search beneath this node (usually containerNode).\n\n\t\t\tvar outAry = [];\n\n\t\t\tfunction getChildrenHelper(root){\n\t\t\t\tfor(var node = root.firstChild; node; node = node.nextSibling){\n\t\t\t\t\tif(node.nodeType == 1){\n\t\t\t\t\t\tvar widgetId = node.getAttribute(\"widgetId\");\n\t\t\t\t\t\tif(widgetId){\n\t\t\t\t\t\t\tvar widget = hash[widgetId];\n\t\t\t\t\t\t\tif(widget){\t// may be null on page w/multiple dojo's loaded\n\t\t\t\t\t\t\t\toutAry.push(widget);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if(node !== skipNode){\n\t\t\t\t\t\t\tgetChildrenHelper(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgetChildrenHelper(root);\n\t\t\treturn outAry;\n\t\t},\n\n\t\t_destroyAll: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCode to destroy all widgets and do other cleanup on page unload\n\n\t\t\t// Clean up focus manager lingering references to widgets and nodes\n\t\t\tdijit._curFocus = null;\n\t\t\tdijit._prevFocus = null;\n\t\t\tdijit._activeStack = [];\n\n\t\t\t// Destroy all the widgets, top down\n\t\t\tarray.forEach(registry.findWidgets(win.body()), function(widget){\n\t\t\t\t// Avoid double destroy of widgets like Menu that are attached to <body>\n\t\t\t\t// even though they are logically children of other widgets.\n\t\t\t\tif(!widget._destroyed){\n\t\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\t\twidget.destroyRecursive();\n\t\t\t\t\t}else if(widget.destroy){\n\t\t\t\t\t\twidget.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tgetEnclosingWidget: function(/*DOMNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the widget whose DOM tree contains the specified DOMNode, or null if\n\t\t\t//\t\tthe node is not contained within the DOM tree of any widget\n\t\t\twhile(node){\n\t\t\t\tvar id = node.nodeType == 1 && node.getAttribute(\"widgetId\");\n\t\t\t\tif(id){\n\t\t\t\t\treturn hash[id];\n\t\t\t\t}\n\t\t\t\tnode = node.parentNode;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\n\t\t// In case someone needs to access hash.\n\t\t// Actually, this is accessed from WidgetSet back-compatibility code\n\t\t_hash: hash\n\t};\n\n\tdijit.registry = registry;\n\n\treturn registry;\n});\n","define([\"dojo/i18n\", \"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\"\n,\"esri/identity/nls/vi/identity\"\n,\"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/arcgis-js-api/identity/nls/identity.js?absMid=esri/identity/nls/identity\"\n], function(loader, runner) {\n   return runner(loader, \"esri/identity/nls/identity\", __webpack_require__.dj.c(), false);\n});","define([\"dojo/i18n\", \"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\"\n,\"dijit/form/nls/vi/validate\"\n,\"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dijit/form/nls/validate.js?absMid=dijit/form/nls/validate\"\n], function(loader, runner) {\n   return runner(loader, \"dijit/form/nls/validate\", __webpack_require__.dj.c(), false);\n});","define([\"dojo/i18n\", \"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\"\n,\"dijit/nls/vi/common\"\n,\"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dijit/nls/common.js?absMid=dijit/nls/common\"\n], function(loader, runner) {\n   return runner(loader, \"dijit/nls/common\", __webpack_require__.dj.c(), false);\n});","define([\"dojo/i18n\", \"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\"\n,\"dijit/nls/vi/loading\"\n,\"C:/Jenkins/workspace/_chinh-vien-thong_web-gis_master/node_modules/dijit/nls/loading.js?absMid=dijit/nls/loading\"\n], function(loader, runner) {\n   return runner(loader, \"dijit/nls/loading\", __webpack_require__.dj.c(), false);\n});","module.exports = \"<span class=\\\"dijit dijitReset dijitInline\\\" role=\\\"presentation\\\"\\n\\t><span class=\\\"dijitReset dijitInline dijitButtonNode\\\"\\n\\t\\tdata-dojo-attach-event=\\\"ondijitclick:__onClick\\\" role=\\\"presentation\\\"\\n\\t\\t><span class=\\\"dijitReset dijitStretch dijitButtonContents\\\"\\n\\t\\t\\tdata-dojo-attach-point=\\\"titleNode,focusNode\\\"\\n\\t\\t\\trole=\\\"button\\\" aria-labelledby=\\\"${id}_label\\\"\\n\\t\\t\\t><span class=\\\"dijitReset dijitInline dijitIcon\\\" data-dojo-attach-point=\\\"iconNode\\\"></span\\n\\t\\t\\t><span class=\\\"dijitReset dijitToggleButtonIconChar\\\">&#x25CF;</span\\n\\t\\t\\t><span class=\\\"dijitReset dijitInline dijitButtonText\\\"\\n\\t\\t\\t\\tid=\\\"${id}_label\\\"\\n\\t\\t\\t\\tdata-dojo-attach-point=\\\"containerNode\\\"\\n\\t\\t\\t></span\\n\\t\\t></span\\n\\t></span\\n\\t><input ${!nameAttrSetting} type=\\\"${type}\\\" value=\\\"${value}\\\" class=\\\"dijitOffScreen\\\"\\n\\t\\tdata-dojo-attach-event=\\\"onclick:_onClick\\\"\\n\\t\\ttabIndex=\\\"-1\\\" aria-hidden=\\\"true\\\" data-dojo-attach-point=\\\"valueNode\\\"\\n/></span>\\n\"","module.exports = \"<div class=\\\"dijit dijitReset dijitInline dijitLeft\\\" id=\\\"widget_${id}\\\" role=\\\"presentation\\\"\\n\\t><div class=\\\"dijitReset dijitInputField dijitInputContainer\\\"\\n\\t\\t><input class=\\\"dijitReset dijitInputInner\\\" data-dojo-attach-point='textbox,focusNode' autocomplete=\\\"off\\\"\\n\\t\\t\\t${!nameAttrSetting} type='${type}'\\n\\t/></div\\n></div>\\n\"","module.exports = \"<div class=\\\"dijit dijitReset dijitInline dijitLeft\\\"\\n\\tid=\\\"widget_${id}\\\" role=\\\"presentation\\\"\\n\\t><div class='dijitReset dijitValidationContainer'\\n\\t\\t><input class=\\\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\\\" value=\\\"&#935; \\\" type=\\\"text\\\" tabIndex=\\\"-1\\\" readonly=\\\"readonly\\\" role=\\\"presentation\\\"\\n\\t/></div\\n\\t><div class=\\\"dijitReset dijitInputField dijitInputContainer\\\"\\n\\t\\t><input class=\\\"dijitReset dijitInputInner\\\" data-dojo-attach-point='textbox,focusNode' autocomplete=\\\"off\\\"\\n\\t\\t\\t${!nameAttrSetting} type='${type}'\\n\\t/></div\\n></div>\\n\"","module.exports = \"<div class=\\\"dijitDialog\\\" role=\\\"dialog\\\" aria-labelledby=\\\"${id}_title\\\">\\n\\t<div data-dojo-attach-point=\\\"titleBar\\\" class=\\\"dijitDialogTitleBar\\\">\\n\\t\\t<span data-dojo-attach-point=\\\"titleNode\\\" class=\\\"dijitDialogTitle\\\" id=\\\"${id}_title\\\"\\n\\t\\t\\t\\trole=\\\"heading\\\" level=\\\"1\\\"></span>\\n\\t\\t<span data-dojo-attach-point=\\\"closeButtonNode\\\" class=\\\"dijitDialogCloseIcon\\\" data-dojo-attach-event=\\\"ondijitclick: onCancel\\\" title=\\\"${buttonCancel}\\\" role=\\\"button\\\" tabindex=\\\"-1\\\">\\n\\t\\t\\t<span data-dojo-attach-point=\\\"closeText\\\" class=\\\"closeText\\\" title=\\\"${buttonCancel}\\\">x</span>\\n\\t\\t</span>\\n\\t</div>\\n\\t<div data-dojo-attach-point=\\\"containerNode\\\" class=\\\"dijitDialogPaneContent\\\"></div>\\n\\t${!actionBarTemplate}\\n</div>\\n\\n\"","module.exports = \"<div class=\\\"dijitTooltip dijitTooltipLeft\\\" id=\\\"dojoTooltip\\\" data-dojo-attach-event=\\\"mouseenter:onMouseEnter,mouseleave:onMouseLeave\\\"\\n\\t><div class=\\\"dijitTooltipConnector\\\" data-dojo-attach-point=\\\"connectorNode\\\"></div\\n\\t><div class=\\\"dijitTooltipContainer dijitTooltipContents\\\" data-dojo-attach-point=\\\"containerNode\\\" role='alert'></div\\n></div>\\n\"","define([\"./kernel\", \"./config\", /*===== \"./declare\", =====*/ \"./lang\", \"../Evented\", \"./Color\", \"../aspect\", \"../sniff\", \"../dom\", \"../dom-style\"],\n\tfunction(dojo, config, /*===== declare, =====*/ lang, Evented, Color, aspect, has, dom, style){\n\t// module:\n\t//\t\tdojo/_base/fx\n\t// notes:\n\t//\t\tAnimation loosely package based on Dan Pupius' work, contributed under CLA; see\n\t//\t\thttp://pupius.co.uk/js/Toolkit.Drawing.js\n\n\tvar _mixin = lang.mixin;\n\n\t// Module export\n\tvar basefx = {\n\t\t// summary:\n\t\t//\t\tThis module defines the base dojo/_base/fx implementation.\n\t};\n\n\tvar _Line = basefx._Line = function(/*int*/ start, /*int*/ end){\n\t\t// summary:\n\t\t//\t\tObject used to generate values from a start value to an end value\n\t\t// start: int\n\t\t//\t\tBeginning value for range\n\t\t// end: int\n\t\t//\t\tEnding value for range\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t};\n\n\t_Line.prototype.getValue = function(/*float*/ n){\n\t\t// summary:\n\t\t//\t\tReturns the point on the line\n\t\t// n:\n\t\t//\t\ta floating point number greater than 0 and less than 1\n\t\treturn ((this.end - this.start) * n) + this.start; // Decimal\n\t};\n\n\tvar Animation = basefx.Animation = function(args){\n\t\t// summary:\n\t\t//\t\tA generic animation class that fires callbacks into its handlers\n\t\t//\t\tobject at various states.\n\t\t// description:\n\t\t//\t\tA generic animation class that fires callbacks into its handlers\n\t\t//\t\tobject at various states. Nearly all dojo animation functions\n\t\t//\t\treturn an instance of this method, usually without calling the\n\t\t//\t\t.play() method beforehand. Therefore, you will likely need to\n\t\t//\t\tcall .play() on instances of `Animation` when one is\n\t\t//\t\treturned.\n\t\t// args: Object\n\t\t//\t\tThe 'magic argument', mixing all the properties into this\n\t\t//\t\tanimation instance.\n\n\t\t_mixin(this, args);\n\t\tif(lang.isArray(this.curve)){\n\t\t\tthis.curve = new _Line(this.curve[0], this.curve[1]);\n\t\t}\n\n\t};\n\tAnimation.prototype = new Evented();\n\n\tlang.extend(Animation, {\n\t\t// duration: Integer\n\t\t//\t\tThe time in milliseconds the animation will take to run\n\t\tduration: 350,\n\n\t/*=====\n\t\t// curve: _Line|Array\n\t\t//\t\tA two element array of start and end values, or a `_Line` instance to be\n\t\t//\t\tused in the Animation.\n\t\tcurve: null,\n\n\t\t// easing: Function?\n\t\t//\t\tA Function to adjust the acceleration (or deceleration) of the progress\n\t\t//\t\tacross a _Line\n\t\teasing: null,\n\t=====*/\n\n\t\t// repeat: Integer?\n\t\t//\t\tThe number of times to loop the animation\n\t\trepeat: 0,\n\n\t\t// rate: Integer?\n\t\t//\t\tthe time in milliseconds to wait before advancing to next frame\n\t\t//\t\t(used as a fps timer: 1000/rate = fps)\n\t\trate: 20 /* 50 fps */,\n\n\t/*=====\n\t\t// delay: Integer?\n\t\t//\t\tThe time in milliseconds to wait before starting animation after it\n\t\t//\t\thas been .play()'ed\n\t\tdelay: null,\n\n\t\t// beforeBegin: Event?\n\t\t//\t\tSynthetic event fired before a Animation begins playing (synchronous)\n\t\tbeforeBegin: null,\n\n\t\t// onBegin: Event?\n\t\t//\t\tSynthetic event fired as a Animation begins playing (useful?)\n\t\tonBegin: null,\n\n\t\t// onAnimate: Event?\n\t\t//\t\tSynthetic event fired at each interval of the Animation\n\t\tonAnimate: null,\n\n\t\t// onEnd: Event?\n\t\t//\t\tSynthetic event fired after the final frame of the Animation\n\t\tonEnd: null,\n\n\t\t// onPlay: Event?\n\t\t//\t\tSynthetic event fired any time the Animation is play()'ed\n\t\tonPlay: null,\n\n\t\t// onPause: Event?\n\t\t//\t\tSynthetic event fired when the Animation is paused\n\t\tonPause: null,\n\n\t\t// onStop: Event\n\t\t//\t\tSynthetic event fires when the Animation is stopped\n\t\tonStop: null,\n\n\t=====*/\n\n\t\t_percent: 0,\n\t\t_startRepeatCount: 0,\n\n\t\t_getStep: function(){\n\t\t\tvar _p = this._percent,\n\t\t\t\t_e = this.easing\n\t\t\t;\n\t\t\treturn _e ? _e(_p) : _p;\n\t\t},\n\t\t_fire: function(/*Event*/ evt, /*Array?*/ args){\n\t\t\t// summary:\n\t\t\t//\t\tConvenience function.  Fire event \"evt\" and pass it the\n\t\t\t//\t\targuments specified in \"args\".\n\t\t\t// description:\n\t\t\t//\t\tConvenience function.  Fire event \"evt\" and pass it the\n\t\t\t//\t\targuments specified in \"args\".\n\t\t\t//\t\tFires the callback in the scope of this Animation\n\t\t\t//\t\tinstance.\n\t\t\t// evt:\n\t\t\t//\t\tThe event to fire.\n\t\t\t// args:\n\t\t\t//\t\tThe arguments to pass to the event.\n\t\t\tvar a = args||[];\n\t\t\tif(this[evt]){\n\t\t\t\tif(config.debugAtAllCosts){\n\t\t\t\t\tthis[evt].apply(this, a);\n\t\t\t\t}else{\n\t\t\t\t\ttry{\n\t\t\t\t\t\tthis[evt].apply(this, a);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t// squelch and log because we shouldn't allow exceptions in\n\t\t\t\t\t\t// synthetic event handlers to cause the internal timer to run\n\t\t\t\t\t\t// amuck, potentially pegging the CPU. I'm not a fan of this\n\t\t\t\t\t\t// squelch, but hopefully logging will make it clear what's\n\t\t\t\t\t\t// going on\n\t\t\t\t\t\tconsole.error(\"exception in animation handler for:\", evt);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this; // Animation\n\t\t},\n\n\t\tplay: function(/*int?*/ delay, /*Boolean?*/ gotoStart){\n\t\t\t// summary:\n\t\t\t//\t\tStart the animation.\n\t\t\t// delay:\n\t\t\t//\t\tHow many milliseconds to delay before starting.\n\t\t\t// gotoStart:\n\t\t\t//\t\tIf true, starts the animation from the beginning; otherwise,\n\t\t\t//\t\tstarts it from its current position.\n\t\t\t// returns: Animation\n\t\t\t//\t\tThe instance to allow chaining.\n\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\tif(gotoStart){\n\t\t\t\t_t._stopTimer();\n\t\t\t\t_t._active = _t._paused = false;\n\t\t\t\t_t._percent = 0;\n\t\t\t}else if(_t._active && !_t._paused){\n\t\t\t\treturn _t;\n\t\t\t}\n\n\t\t\t_t._fire(\"beforeBegin\", [_t.node]);\n\n\t\t\tvar de = delay || _t.delay,\n\t\t\t\t_p = lang.hitch(_t, \"_play\", gotoStart);\n\n\t\t\tif(de > 0){\n\t\t\t\t_t._delayTimer = setTimeout(_p, de);\n\t\t\t\treturn _t;\n\t\t\t}\n\t\t\t_p();\n\t\t\treturn _t;\t// Animation\n\t\t},\n\n\t\t_play: function(gotoStart){\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\t_t._startTime = new Date().valueOf();\n\t\t\tif(_t._paused){\n\t\t\t\t_t._startTime -= _t.duration * _t._percent;\n\t\t\t}\n\n\t\t\t_t._active = true;\n\t\t\t_t._paused = false;\n\t\t\tvar value = _t.curve.getValue(_t._getStep());\n\t\t\tif(!_t._percent){\n\t\t\t\tif(!_t._startRepeatCount){\n\t\t\t\t\t_t._startRepeatCount = _t.repeat;\n\t\t\t\t}\n\t\t\t\t_t._fire(\"onBegin\", [value]);\n\t\t\t}\n\n\t\t\t_t._fire(\"onPlay\", [value]);\n\n\t\t\t_t._cycle();\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tpause: function(){\n\t\t\t// summary:\n\t\t\t//\t\tPauses a running animation.\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\t_t._stopTimer();\n\t\t\tif(!_t._active){ return _t; /*Animation*/ }\n\t\t\t_t._paused = true;\n\t\t\t_t._fire(\"onPause\", [_t.curve.getValue(_t._getStep())]);\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tgotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){\n\t\t\t// summary:\n\t\t\t//\t\tSets the progress of the animation.\n\t\t\t// percent:\n\t\t\t//\t\tA percentage in decimal notation (between and including 0.0 and 1.0).\n\t\t\t// andPlay:\n\t\t\t//\t\tIf true, play the animation after setting the progress.\n\t\t\tvar _t = this;\n\t\t\t_t._stopTimer();\n\t\t\t_t._active = _t._paused = true;\n\t\t\t_t._percent = percent;\n\t\t\tif(andPlay){ _t.play(); }\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tstop: function(/*boolean?*/ gotoEnd){\n\t\t\t// summary:\n\t\t\t//\t\tStops a running animation.\n\t\t\t// gotoEnd:\n\t\t\t//\t\tIf true, the animation will end.\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\tif(!_t._timer){ return _t; /* Animation */ }\n\t\t\t_t._stopTimer();\n\t\t\tif(gotoEnd){\n\t\t\t\t_t._percent = 1;\n\t\t\t}\n\t\t\t_t._fire(\"onStop\", [_t.curve.getValue(_t._getStep())]);\n\t\t\t_t._active = _t._paused = false;\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\t// summary:\n\t\t\t//\t\tcleanup the animation\n\t\t\tthis.stop();\n\t\t},\n\n\t\tstatus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a string token representation of the status of\n\t\t\t//\t\tthe animation, one of: \"paused\", \"playing\", \"stopped\"\n\t\t\tif(this._active){\n\t\t\t\treturn this._paused ? \"paused\" : \"playing\"; // String\n\t\t\t}\n\t\t\treturn \"stopped\"; // String\n\t\t},\n\n\t\t_cycle: function(){\n\t\t\tvar _t = this;\n\t\t\tif(_t._active){\n\t\t\t\tvar curr = new Date().valueOf();\n\t\t\t\t// Allow durations of 0 (instant) by setting step to 1 - see #13798\n\t\t\t\tvar step = _t.duration === 0 ? 1 : (curr - _t._startTime) / (_t.duration);\n\n\t\t\t\tif(step >= 1){\n\t\t\t\t\tstep = 1;\n\t\t\t\t}\n\t\t\t\t_t._percent = step;\n\n\t\t\t\t// Perform easing\n\t\t\t\tif(_t.easing){\n\t\t\t\t\tstep = _t.easing(step);\n\t\t\t\t}\n\n\t\t\t\t_t._fire(\"onAnimate\", [_t.curve.getValue(step)]);\n\n\t\t\t\tif(_t._percent < 1){\n\t\t\t\t\t_t._startTimer();\n\t\t\t\t}else{\n\t\t\t\t\t_t._active = false;\n\n\t\t\t\t\tif(_t.repeat > 0){\n\t\t\t\t\t\t_t.repeat--;\n\t\t\t\t\t\t_t.play(null, true);\n\t\t\t\t\t}else if(_t.repeat == -1){\n\t\t\t\t\t\t_t.play(null, true);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(_t._startRepeatCount){\n\t\t\t\t\t\t\t_t.repeat = _t._startRepeatCount;\n\t\t\t\t\t\t\t_t._startRepeatCount = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_t._percent = 0;\n\t\t\t\t\t_t._fire(\"onEnd\", [_t.node]);\n\t\t\t\t\t!_t.repeat && _t._stopTimer();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\t_clearTimer: function(){\n\t\t\t// summary:\n\t\t\t//\t\tClear the play delay timer\n\t\t\tclearTimeout(this._delayTimer);\n\t\t\tdelete this._delayTimer;\n\t\t}\n\n\t});\n\n\t// the local timer, stubbed into all Animation instances\n\tvar ctr = 0,\n\t\ttimer = null,\n\t\trunner = {\n\t\t\trun: function(){}\n\t\t};\n\n\tlang.extend(Animation, {\n\n\t\t_startTimer: function(){\n\t\t\tif(!this._timer){\n\t\t\t\tthis._timer = aspect.after(runner, \"run\", lang.hitch(this, \"_cycle\"), true);\n\t\t\t\tctr++;\n\t\t\t}\n\t\t\tif(!timer){\n\t\t\t\ttimer = setInterval(lang.hitch(runner, \"run\"), this.rate);\n\t\t\t}\n\t\t},\n\n\t\t_stopTimer: function(){\n\t\t\tif(this._timer){\n\t\t\t\tthis._timer.remove();\n\t\t\t\tthis._timer = null;\n\t\t\t\tctr--;\n\t\t\t}\n\t\t\tif(ctr <= 0){\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = null;\n\t\t\t\tctr = 0;\n\t\t\t}\n\t\t}\n\n\t});\n\n\tvar _makeFadeable =\n\t\thas(\"ie\") ? function(node){\n\t\t\t// only set the zoom if the \"tickle\" value would be the same as the\n\t\t\t// default\n\t\t\tvar ns = node.style;\n\t\t\t// don't set the width to auto if it didn't already cascade that way.\n\t\t\t// We don't want to f anyones designs\n\t\t\tif(!ns.width.length && style.get(node, \"width\") == \"auto\"){\n\t\t\t\tns.width = \"auto\";\n\t\t\t}\n\t\t} :\n\t\tfunction(){};\n\n\tbasefx._fade = function(/*Object*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade the node defined by\n\t\t//\t\targs.node from the start to end values passed (args.start\n\t\t//\t\targs.end) (end is mandatory, start is optional)\n\n\t\targs.node = dom.byId(args.node);\n\t\tvar fArgs = _mixin({ properties: {} }, args),\n\t\t\tprops = (fArgs.properties.opacity = {});\n\n\t\tprops.start = !(\"start\" in fArgs) ?\n\t\t\tfunction(){\n\t\t\t\treturn +style.get(fArgs.node, \"opacity\")||0;\n\t\t\t} : fArgs.start;\n\t\tprops.end = fArgs.end;\n\n\t\tvar anim = basefx.animateProperty(fArgs);\n\t\taspect.after(anim, \"beforeBegin\", lang.partial(_makeFadeable, fArgs.node), true);\n\n\t\treturn anim; // Animation\n\t};\n\n\t/*=====\n\tvar __FadeArgs = declare(null, {\n\t\t// node: DOMNode|String\n\t\t//\t\tThe node referenced in the animation\n\t\t// duration: Integer?\n\t\t//\t\tDuration of the animation in milliseconds.\n\t\t// easing: Function?\n\t\t//\t\tAn easing function.\n\t});\n\t=====*/\n\n\tbasefx.fadeIn = function(/*__FadeArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade node defined in 'args' from\n\t\t//\t\tits current opacity to fully opaque.\n\t\treturn basefx._fade(_mixin({ end: 1 }, args)); // Animation\n\t};\n\n\tbasefx.fadeOut = function(/*__FadeArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade node defined in 'args'\n\t\t//\t\tfrom its current opacity to fully transparent.\n\t\treturn basefx._fade(_mixin({ end: 0 }, args)); // Animation\n\t};\n\n\tbasefx._defaultEasing = function(/*Decimal?*/ n){\n\t\t// summary:\n\t\t//\t\tThe default easing function for Animation(s)\n\t\treturn 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2);\t// Decimal\n\t};\n\n\tvar PropLine = function(properties){\n\t\t// PropLine is an internal class which is used to model the values of\n\t\t// an a group of CSS properties across an animation lifecycle. In\n\t\t// particular, the \"getValue\" function handles getting interpolated\n\t\t// values between start and end for a particular CSS value.\n\t\tthis._properties = properties;\n\t\tfor(var p in properties){\n\t\t\tvar prop = properties[p];\n\t\t\tif(prop.start instanceof Color){\n\t\t\t\t// create a reusable temp color object to keep intermediate results\n\t\t\t\tprop.tempColor = new Color();\n\t\t\t}\n\t\t}\n\t};\n\n\tPropLine.prototype.getValue = function(r){\n\t\tvar ret = {};\n\t\tfor(var p in this._properties){\n\t\t\tvar prop = this._properties[p],\n\t\t\t\tstart = prop.start;\n\t\t\tif(start instanceof Color){\n\t\t\t\tret[p] = Color.blendColors(start, prop.end, r, prop.tempColor).toCss();\n\t\t\t}else if(!lang.isArray(start)){\n\t\t\t\tret[p] = ((prop.end - start) * r) + start + (p != \"opacity\" ? prop.units || \"px\" : 0);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n\n\t/*=====\n\tvar __AnimArgs = declare(__FadeArgs, {\n\t\t// properties: Object?\n\t\t//\t\tA hash map of style properties to Objects describing the transition,\n\t\t//\t\tsuch as the properties of _Line with an additional 'units' property\n\t\tproperties: {}\n\n\t\t//TODOC: add event callbacks\n\t});\n\t=====*/\n\n\tbasefx.animateProperty = function(/*__AnimArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will transition the properties of\n\t\t//\t\tnode defined in `args` depending how they are defined in\n\t\t//\t\t`args.properties`\n\t\t//\n\t\t// description:\n\t\t//\t\tFoundation of most `dojo/_base/fx`\n\t\t//\t\tanimations. It takes an object of \"properties\" corresponding to\n\t\t//\t\tstyle properties, and animates them in parallel over a set\n\t\t//\t\tduration.\n\t\t//\n\t\t// example:\n\t\t//\t\tA simple animation that changes the width of the specified node.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode: \"nodeId\",\n\t\t//\t|\t\tproperties: { width: 400 },\n\t\t//\t|\t}).play();\n\t\t//\t\tDojo figures out the start value for the width and converts the\n\t\t//\t\tinteger specified for the width to the more expressive but\n\t\t//\t\tverbose form `{ width: { end: '400', units: 'px' } }` which you\n\t\t//\t\tcan also specify directly. Defaults to 'px' if omitted.\n\t\t//\n\t\t// example:\n\t\t//\t\tAnimate width, height, and padding over 2 seconds... the\n\t\t//\t\tpedantic way:\n\t\t//\t|\tbasefx.animateProperty({ node: node, duration:2000,\n\t\t//\t|\t\tproperties: {\n\t\t//\t|\t\t\twidth: { start: '200', end: '400', units:\"px\" },\n\t\t//\t|\t\t\theight: { start:'200', end: '400', units:\"px\" },\n\t\t//\t|\t\t\tpaddingTop: { start:'5', end:'50', units:\"px\" }\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play();\n\t\t//\t\tNote 'paddingTop' is used over 'padding-top'. Multi-name CSS properties\n\t\t//\t\tare written using \"mixed case\", as the hyphen is illegal as an object key.\n\t\t//\n\t\t// example:\n\t\t//\t\tPlug in a different easing function and register a callback for\n\t\t//\t\twhen the animation ends. Easing functions accept values between\n\t\t//\t\tzero and one and return a value on that basis. In this case, an\n\t\t//\t\texponential-in curve.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode: \"nodeId\",\n\t\t//\t|\t\t// dojo figures out the start value\n\t\t//\t|\t\tproperties: { width: { end: 400 } },\n\t\t//\t|\t\teasing: function(n){\n\t\t//\t|\t\t\treturn (n==0) ? 0 : Math.pow(2, 10 * (n - 1));\n\t\t//\t|\t\t},\n\t\t//\t|\t\tonEnd: function(node){\n\t\t//\t|\t\t\t// called when the animation finishes. The animation\n\t\t//\t|\t\t\t// target is passed to this function\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play(500); // delay playing half a second\n\t\t//\n\t\t// example:\n\t\t//\t\tLike all `Animation`s, animateProperty returns a handle to the\n\t\t//\t\tAnimation instance, which fires the events common to Dojo FX. Use `aspect.after`\n\t\t//\t\tto access these events outside of the Animation definition:\n\t\t//\t|\tvar anim = basefx.animateProperty({\n\t\t//\t|\t\tnode:\"someId\",\n\t\t//\t|\t\tproperties:{\n\t\t//\t|\t\t\twidth:400, height:500\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\taspect.after(anim, \"onEnd\", function(){\n\t\t//\t|\t\tconsole.log(\"animation ended\");\n\t\t//\t|\t}, true);\n\t\t//\t|\t// play the animation now:\n\t\t//\t|\tanim.play();\n\t\t//\n\t\t// example:\n\t\t//\t\tEach property can be a function whose return value is substituted along.\n\t\t//\t\tAdditionally, each measurement (eg: start, end) can be a function. The node\n\t\t//\t\treference is passed directly to callbacks.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode:\"mine\",\n\t\t//\t|\t\tproperties:{\n\t\t//\t|\t\t\theight:function(node){\n\t\t//\t|\t\t\t\t// shrink this node by 50%\n\t\t//\t|\t\t\t\treturn domGeom.position(node).h / 2\n\t\t//\t|\t\t\t},\n\t\t//\t|\t\t\twidth:{\n\t\t//\t|\t\t\t\tstart:function(node){ return 100; },\n\t\t//\t|\t\t\t\tend:function(node){ return 200; }\n\t\t//\t|\t\t\t}\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play();\n\t\t//\n\n\t\tvar n = args.node = dom.byId(args.node);\n\t\tif(!args.easing){ args.easing = dojo._defaultEasing; }\n\n\t\tvar anim = new Animation(args);\n\t\taspect.after(anim, \"beforeBegin\", lang.hitch(anim, function(){\n\t\t\tvar pm = {};\n\t\t\tfor(var p in this.properties){\n\t\t\t\t// Make shallow copy of properties into pm because we overwrite\n\t\t\t\t// some values below. In particular if start/end are functions\n\t\t\t\t// we don't want to overwrite them or the functions won't be\n\t\t\t\t// called if the animation is reused.\n\t\t\t\tif(p == \"width\" || p == \"height\"){\n\t\t\t\t\tthis.node.display = \"block\";\n\t\t\t\t}\n\t\t\t\tvar prop = this.properties[p];\n\t\t\t\tif(lang.isFunction(prop)){\n\t\t\t\t\tprop = prop(n);\n\t\t\t\t}\n\t\t\t\tprop = pm[p] = _mixin({}, (lang.isObject(prop) ? prop: { end: prop }));\n\n\t\t\t\tif(lang.isFunction(prop.start)){\n\t\t\t\t\tprop.start = prop.start(n);\n\t\t\t\t}\n\t\t\t\tif(lang.isFunction(prop.end)){\n\t\t\t\t\tprop.end = prop.end(n);\n\t\t\t\t}\n\t\t\t\tvar isColor = (p.toLowerCase().indexOf(\"color\") >= 0);\n\t\t\t\tfunction getStyle(node, p){\n\t\t\t\t\t// domStyle.get(node, \"height\") can return \"auto\" or \"\" on IE; this is more reliable:\n\t\t\t\t\tvar v = { height: node.offsetHeight, width: node.offsetWidth }[p];\n\t\t\t\t\tif(v !== undefined){ return v; }\n\t\t\t\t\tv = style.get(node, p);\n\t\t\t\t\treturn (p == \"opacity\") ? +v : (isColor ? v : parseFloat(v));\n\t\t\t\t}\n\t\t\t\tif(!(\"end\" in prop)){\n\t\t\t\t\tprop.end = getStyle(n, p);\n\t\t\t\t}else if(!(\"start\" in prop)){\n\t\t\t\t\tprop.start = getStyle(n, p);\n\t\t\t\t}\n\n\t\t\t\tif(isColor){\n\t\t\t\t\tprop.start = new Color(prop.start);\n\t\t\t\t\tprop.end = new Color(prop.end);\n\t\t\t\t}else{\n\t\t\t\t\tprop.start = (p == \"opacity\") ? +prop.start : parseFloat(prop.start);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.curve = new PropLine(pm);\n\t\t}), true);\n\t\taspect.after(anim, \"onAnimate\", lang.hitch(style, \"set\", anim.node), true);\n\t\treturn anim; // Animation\n\t};\n\n\tbasefx.anim = function(\t/*DOMNode|String*/\tnode,\n\t\t\t\t\t\t\t/*Object*/\t\t\tproperties,\n\t\t\t\t\t\t\t/*Integer?*/\t\tduration,\n\t\t\t\t\t\t\t/*Function?*/\t\teasing,\n\t\t\t\t\t\t\t/*Function?*/\t\tonEnd,\n\t\t\t\t\t\t\t/*Integer?*/\t\tdelay){\n\t\t// summary:\n\t\t//\t\tA simpler interface to `animateProperty()`, also returns\n\t\t//\t\tan instance of `Animation` but begins the animation\n\t\t//\t\timmediately, unlike nearly every other Dojo animation API.\n\t\t// description:\n\t\t//\t\tSimpler (but somewhat less powerful) version\n\t\t//\t\tof `animateProperty`.  It uses defaults for many basic properties\n\t\t//\t\tand allows for positional parameters to be used in place of the\n\t\t//\t\tpacked \"property bag\" which is used for other Dojo animation\n\t\t//\t\tmethods.\n\t\t//\n\t\t//\t\tThe `Animation` object returned will be already playing, so\n\t\t//\t\tcalling play() on it again is (usually) a no-op.\n\t\t// node:\n\t\t//\t\ta DOM node or the id of a node to animate CSS properties on\n\t\t// duration:\n\t\t//\t\tThe number of milliseconds over which the animation\n\t\t//\t\tshould run. Defaults to the global animation default duration\n\t\t//\t\t(350ms).\n\t\t// easing:\n\t\t//\t\tAn easing function over which to calculate acceleration\n\t\t//\t\tand deceleration of the animation through its duration.\n\t\t//\t\tA default easing algorithm is provided, but you may\n\t\t//\t\tplug in any you wish. A large selection of easing algorithms\n\t\t//\t\tare available in `dojo/fx/easing`.\n\t\t// onEnd:\n\t\t//\t\tA function to be called when the animation finishes\n\t\t//\t\trunning.\n\t\t// delay:\n\t\t//\t\tThe number of milliseconds to delay beginning the\n\t\t//\t\tanimation by. The default is 0.\n\t\t// example:\n\t\t//\t\tFade out a node\n\t\t//\t|\tbasefx.anim(\"id\", { opacity: 0 });\n\t\t// example:\n\t\t//\t\tFade out a node over a full second\n\t\t//\t|\tbasefx.anim(\"id\", { opacity: 0 }, 1000);\n\t\treturn basefx.animateProperty({ // Animation\n\t\t\tnode: node,\n\t\t\tduration: duration || Animation.prototype.duration,\n\t\t\tproperties: properties,\n\t\t\teasing: easing,\n\t\t\tonEnd: onEnd\n\t\t}).play(delay || 0);\n\t};\n\n\n\tif(has(\"extend-dojo\")){\n\t\t_mixin(dojo, basefx);\n\t\t// Alias to drop come 2.0:\n\t\tdojo._Animation = Animation;\n\t}\n\n\treturn basefx;\n});\n","define([\"./kernel\"], function(dojo){\n\t// module:\n\t//\t\tdojo/url\n\n\tvar\n\t\tore = new RegExp(\"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\\\?([^#]*))?(#(.*))?$\"),\n\t\tire = new RegExp(\"^((([^\\\\[:]+):)?([^@]+)@)?(\\\\[([^\\\\]]+)\\\\]|([^\\\\[:]*))(:([0-9]+))?$\"),\n\t\t_Url = function(){\n\t\t\tvar n = null,\n\t\t\t\t_a = arguments,\n\t\t\t\turi = [_a[0]];\n\t\t\t// resolve uri components relative to each other\n\t\t\tfor(var i = 1; i<_a.length; i++){\n\t\t\t\tif(!_a[i]){ continue; }\n\n\t\t\t\t// Safari doesn't support this.constructor so we have to be explicit\n\t\t\t\t// FIXME: Tracked (and fixed) in Webkit bug 3537.\n\t\t\t\t//\t\thttp://bugs.webkit.org/show_bug.cgi?id=3537\n\t\t\t\tvar relobj = new _Url(_a[i]+\"\"),\n\t\t\t\t\turiobj = new _Url(uri[0]+\"\");\n\n\t\t\t\tif(\n\t\t\t\t\trelobj.path == \"\" &&\n\t\t\t\t\t!relobj.scheme &&\n\t\t\t\t\t!relobj.authority &&\n\t\t\t\t\t!relobj.query\n\t\t\t\t){\n\t\t\t\t\tif(relobj.fragment != n){\n\t\t\t\t\t\turiobj.fragment = relobj.fragment;\n\t\t\t\t\t}\n\t\t\t\t\trelobj = uriobj;\n\t\t\t\t}else if(!relobj.scheme){\n\t\t\t\t\trelobj.scheme = uriobj.scheme;\n\n\t\t\t\t\tif(!relobj.authority){\n\t\t\t\t\t\trelobj.authority = uriobj.authority;\n\n\t\t\t\t\t\tif(relobj.path.charAt(0) != \"/\"){\n\t\t\t\t\t\t\tvar path = uriobj.path.substring(0,\n\t\t\t\t\t\t\t\turiobj.path.lastIndexOf(\"/\") + 1) + relobj.path;\n\n\t\t\t\t\t\t\tvar segs = path.split(\"/\");\n\t\t\t\t\t\t\tfor(var j = 0; j < segs.length; j++){\n\t\t\t\t\t\t\t\tif(segs[j] == \".\"){\n\t\t\t\t\t\t\t\t\t// flatten \"./\" references\n\t\t\t\t\t\t\t\t\tif(j == segs.length - 1){\n\t\t\t\t\t\t\t\t\t\tsegs[j] = \"\";\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tsegs.splice(j, 1);\n\t\t\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else if(j > 0 && !(j == 1 && segs[0] == \"\") &&\n\t\t\t\t\t\t\t\t\tsegs[j] == \"..\" && segs[j-1] != \"..\"){\n\t\t\t\t\t\t\t\t\t// flatten \"../\" references\n\t\t\t\t\t\t\t\t\tif(j == (segs.length - 1)){\n\t\t\t\t\t\t\t\t\t\tsegs.splice(j, 1);\n\t\t\t\t\t\t\t\t\t\tsegs[j - 1] = \"\";\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tsegs.splice(j - 1, 2);\n\t\t\t\t\t\t\t\t\t\tj -= 2;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trelobj.path = segs.join(\"/\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\turi = [];\n\t\t\t\tif(relobj.scheme){\n\t\t\t\t\turi.push(relobj.scheme, \":\");\n\t\t\t\t}\n\t\t\t\tif(relobj.authority){\n\t\t\t\t\turi.push(\"//\", relobj.authority);\n\t\t\t\t}\n\t\t\t\turi.push(relobj.path);\n\t\t\t\tif(relobj.query){\n\t\t\t\t\turi.push(\"?\", relobj.query);\n\t\t\t\t}\n\t\t\t\tif(relobj.fragment){\n\t\t\t\t\turi.push(\"#\", relobj.fragment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.uri = uri.join(\"\");\n\n\t\t\t// break the uri into its main components\n\t\t\tvar r = this.uri.match(ore);\n\n\t\t\tthis.scheme = r[2] || (r[1] ? \"\" : n);\n\t\t\tthis.authority = r[4] || (r[3] ? \"\" : n);\n\t\t\tthis.path = r[5]; // can never be undefined\n\t\t\tthis.query = r[7] || (r[6] ? \"\" : n);\n\t\t\tthis.fragment\t = r[9] || (r[8] ? \"\" : n);\n\n\t\t\tif(this.authority != n){\n\t\t\t\t// server based naming authority\n\t\t\t\tr = this.authority.match(ire);\n\n\t\t\t\tthis.user = r[3] || n;\n\t\t\t\tthis.password = r[4] || n;\n\t\t\t\tthis.host = r[6] || r[7]; // ipv6 || ipv4\n\t\t\t\tthis.port = r[9] || n;\n\t\t\t}\n\t\t};\n\t_Url.prototype.toString = function(){ return this.uri; };\n\n\treturn dojo._Url = _Url;\n});\n","define([\"./_base/kernel\", \"./text\"], function(dojo){\n\t// module:\n\t//\t\tdojo/cache\n\n\t// dojo.cache is defined in dojo/text\n\treturn dojo.cache;\n});\n","define([\"../_base/lang\", \"../_base/array\"], function(lang, array){\n\n// module:\n//\t\tdojo/date/stamp\n\nvar stamp = {\n\t// summary:\n\t//\t\tTODOC\n};\nlang.setObject(\"dojo.date.stamp\", stamp);\n\n// Methods to convert dates to or from a wire (string) format using well-known conventions\n\nstamp.fromISOString = function(/*String*/ formattedString, /*Number?*/ defaultTime){\n\t// summary:\n\t//\t\tReturns a Date object given a string formatted according to a subset of the ISO-8601 standard.\n\t//\n\t// description:\n\t//\t\tAccepts a string formatted according to a profile of ISO8601 as defined by\n\t//\t\t[RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.\n\t//\t\tCan also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)\n\t//\t\tThe following combinations are valid:\n\t//\n\t//\t\t- dates only\n\t//\t\t\t- yyyy\n\t//\t\t\t- yyyy-MM\n\t//\t\t\t- yyyy-MM-dd\n\t//\t\t- times only, with an optional time zone appended\n\t//\t\t\t- THH:mm\n\t//\t\t\t- THH:mm:ss\n\t//\t\t\t- THH:mm:ss.SSS\n\t//\t\t- and \"datetimes\" which could be any combination of the above\n\t//\n\t//\t\ttimezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm\n\t//\t\tAssumes the local time zone if not specified.  Does not validate.  Improperly formatted\n\t//\t\tinput may return null.  Arguments which are out of bounds will be handled\n\t//\t\tby the Date constructor (e.g. January 32nd typically gets resolved to February 1st)\n\t//\t\tOnly years between 100 and 9999 are supported.\n  \t// formattedString:\n\t//\t\tA string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00\n\t// defaultTime:\n\t//\t\tUsed for defaults for fields omitted in the formattedString.\n\t//\t\tUses 1970-01-01T00:00:00.0Z by default.\n\n\tif(!stamp._isoRegExp){\n\t\tstamp._isoRegExp =\n//TODO: could be more restrictive and check for 00-59, etc.\n\t\t\t/^(?:(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(.\\d+)?)?((?:[+-](\\d{2}):(\\d{2}))|Z)?)?$/;\n\t}\n\n\tvar match = stamp._isoRegExp.exec(formattedString),\n\t\tresult = null;\n\n\tif(match){\n\t\tmatch.shift();\n\t\tif(match[1]){match[1]--;} // Javascript Date months are 0-based\n\t\tif(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds\n\n\t\tif(defaultTime){\n\t\t\t// mix in defaultTime.  Relatively expensive, so use || operators for the fast path of defaultTime === 0\n\t\t\tdefaultTime = new Date(defaultTime);\n\t\t\tarray.forEach(array.map([\"FullYear\", \"Month\", \"Date\", \"Hours\", \"Minutes\", \"Seconds\", \"Milliseconds\"], function(prop){\n\t\t\t\treturn defaultTime[\"get\" + prop]();\n\t\t\t}), function(value, index){\n\t\t\t\tmatch[index] = match[index] || value;\n\t\t\t});\n\t\t}\n\t\tresult = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults\n\t\tif(match[0] < 100){\n\t\t\tresult.setFullYear(match[0] || 1970);\n\t\t}\n\n\t\tvar offset = 0,\n\t\t\tzoneSign = match[7] && match[7].charAt(0);\n\t\tif(zoneSign != 'Z'){\n\t\t\toffset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);\n\t\t\tif(zoneSign != '-'){ offset *= -1; }\n\t\t}\n\t\tif(zoneSign){\n\t\t\toffset -= result.getTimezoneOffset();\n\t\t}\n\t\tif(offset){\n\t\t\tresult.setTime(result.getTime() + offset * 60000);\n\t\t}\n\t}\n\n\treturn result; // Date or null\n};\n\n/*=====\nvar __Options = {\n\t// selector: String\n\t//\t\t\"date\" or \"time\" for partial formatting of the Date object.\n\t//\t\tBoth date and time will be formatted by default.\n\t// zulu: Boolean\n\t//\t\tif true, UTC/GMT is used for a timezone\n\t// milliseconds: Boolean\n\t//\t\tif true, output milliseconds\n};\n=====*/\n\nstamp.toISOString = function(/*Date*/ dateObject, /*__Options?*/ options){\n\t// summary:\n\t//\t\tFormat a Date object as a string according a subset of the ISO-8601 standard\n\t//\n\t// description:\n\t//\t\tWhen options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)\n\t//\t\tThe local time zone is included as an offset from GMT, except when selector=='time' (time without a date)\n\t//\t\tDoes not check bounds.  Only years between 100 and 9999 are supported.\n\t//\n\t// dateObject:\n\t//\t\tA Date object\n\n\tvar _ = function(n){ return (n < 10) ? \"0\" + n : n; };\n\toptions = options || {};\n\tvar formattedDate = [],\n\t\tgetter = options.zulu ? \"getUTC\" : \"get\",\n\t\tdate = \"\";\n\tif(options.selector != \"time\"){\n\t\tvar year = dateObject[getter+\"FullYear\"]();\n\t\tdate = [\"0000\".substr((year+\"\").length)+year, _(dateObject[getter+\"Month\"]()+1), _(dateObject[getter+\"Date\"]())].join('-');\n\t}\n\tformattedDate.push(date);\n\tif(options.selector != \"date\"){\n\t\tvar time = [_(dateObject[getter+\"Hours\"]()), _(dateObject[getter+\"Minutes\"]()), _(dateObject[getter+\"Seconds\"]())].join(':');\n\t\tvar millis = dateObject[getter+\"Milliseconds\"]();\n\t\tif(options.milliseconds){\n\t\t\ttime += \".\"+ (millis < 100 ? \"0\" : \"\") + _(millis);\n\t\t}\n\t\tif(options.zulu){\n\t\t\ttime += \"Z\";\n\t\t}else if(options.selector != \"time\"){\n\t\t\tvar timezoneOffset = dateObject.getTimezoneOffset();\n\t\t\tvar absOffset = Math.abs(timezoneOffset);\n\t\t\ttime += (timezoneOffset > 0 ? \"-\" : \"+\") +\n\t\t\t\t_(Math.floor(absOffset/60)) + \":\" + _(absOffset%60);\n\t\t}\n\t\tformattedDate.push(time);\n\t}\n\treturn formattedDate.join('T'); // String\n};\n\nreturn stamp;\n});\n","define([\n\t\"../_base/array\", \"../_base/declare\", \"../_base/lang\", \"../dom\", \"../dom-class\", \"../Evented\",\n\t\"../has\", \"../on\", \"../topic\", \"../touch\", \"./common\", \"./Mover\", \"../_base/window\"\n], function(array, declare, lang, dom, domClass, Evented, has, on, topic, touch, dnd, Mover, win){\n\n// module:\n//\t\tdojo/dnd/Moveable\n\nvar touchActionPropertyName;\nvar setTouchAction = function () {};\n\nfunction setTouchActionPropertyName() {\n\tif (\"touchAction\" in document.body.style) {\n\t\ttouchActionPropertyName = \"touchAction\";\n\t}\n\telse if (\"msTouchAction\" in document.body.style) {\n\t\ttouchActionPropertyName = \"msTouchAction\";\n\t}\n\tsetTouchAction = function setTouchAction(/* Node */ node, /* string */ action) {\n\t\tnode.style[touchActionPropertyName] = action;\n\t}\n\tsetTouchAction(arguments[0], arguments[1]);\n}\n\nif (has(\"touch-action\")) {\n\t// Ensure that the logic to determine \"touchActionPropertyName\" runs\n\tsetTouchAction = setTouchActionPropertyName;\n}\n\nvar Moveable = declare(\"dojo.dnd.Moveable\", [Evented], {\n\t// summary:\n\t//\t\tan object, which makes a node movable\n\n\t// object attributes (for markup)\n\thandle: \"\",\n\tdelay: 0,\n\tskip: false,\n\n\tconstructor: function(node, params){\n\t\t// node: Node\n\t\t//\t\ta node (or node's id) to be moved\n\t\t// params: Moveable.__MoveableArgs?\n\t\t//\t\toptional parameters\n\t\tthis.node = dom.byId(node);\n\t\tsetTouchAction(this.node, \"none\");\n\t\tif(!params){ params = {}; }\n\t\tthis.handle = params.handle ? dom.byId(params.handle) : null;\n\t\tif(!this.handle){ this.handle = this.node; }\n\t\tthis.delay = params.delay > 0 ? params.delay : 0;\n\t\tthis.skip  = params.skip;\n\t\tthis.mover = params.mover ? params.mover : Mover;\n\t\tthis.events = [\n\t\t\ton(this.handle, touch.press, lang.hitch(this, \"onMouseDown\")),\n\t\t\t// cancel text selection and text dragging\n\t\t\ton(this.handle, \"dragstart\",   lang.hitch(this, \"onSelectStart\")),\n\t\t\ton(this.handle, \"selectstart\",   lang.hitch(this, \"onSelectStart\"))\n\t\t];\n\t},\n\n\t// markup methods\n\tmarkupFactory: function(params, node, Ctor){\n\t\treturn new Ctor(node, params);\n\t},\n\n\t// methods\n\tdestroy: function(){\n\t\t// summary:\n\t\t//\t\tstops watching for possible move, deletes all references, so the object can be garbage-collected\n\t\tarray.forEach(this.events, function(handle){ handle.remove(); });\n\t\tsetTouchAction(this.node, \"\");\n\t\tthis.events = this.node = this.handle = null;\n\t},\n\n\t// mouse event processors\n\tonMouseDown: function(e){\n\t\t// summary:\n\t\t//\t\tevent processor for onmousedown/ontouchstart, creates a Mover for the node\n\t\t// e: Event\n\t\t//\t\tmouse/touch event\n\t\tif(this.skip && dnd.isFormElement(e)){ return; }\n\t\tif(this.delay){\n\t\t\tthis.events.push(\n\t\t\t\ton(this.handle, touch.move, lang.hitch(this, \"onMouseMove\")),\n\t\t\t\ton(this.handle.ownerDocument, touch.release, lang.hitch(this, \"onMouseUp\"))\n\t\t\t);\n\t\t\tthis._lastX = e.pageX;\n\t\t\tthis._lastY = e.pageY;\n\t\t}else{\n\t\t\tthis.onDragDetected(e);\n\t\t}\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t},\n\tonMouseMove: function(e){\n\t\t// summary:\n\t\t//\t\tevent processor for onmousemove/ontouchmove, used only for delayed drags\n\t\t// e: Event\n\t\t//\t\tmouse/touch event\n\t\tif(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){\n\t\t\tthis.onMouseUp(e);\n\t\t\tthis.onDragDetected(e);\n\t\t}\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t},\n\tonMouseUp: function(e){\n\t\t// summary:\n\t\t//\t\tevent processor for onmouseup, used only for delayed drags\n\t\t// e: Event\n\t\t//\t\tmouse event\n\t\tfor(var i = 0; i < 2; ++i){\n\t\t\tthis.events.pop().remove();\n\t\t}\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t},\n\tonSelectStart: function(e){\n\t\t// summary:\n\t\t//\t\tevent processor for onselectevent and ondragevent\n\t\t// e: Event\n\t\t//\t\tmouse event\n\t\tif(!this.skip || !dnd.isFormElement(e)){\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\n\t// local events\n\tonDragDetected: function(/*Event*/ e){\n\t\t// summary:\n\t\t//\t\tcalled when the drag is detected;\n\t\t//\t\tresponsible for creation of the mover\n\t\tnew this.mover(this.node, e, this);\n\t},\n\tonMoveStart: function(/*Mover*/ mover){\n\t\t// summary:\n\t\t//\t\tcalled before every move operation\n\t\ttopic.publish(\"/dnd/move/start\", mover);\n\t\tdomClass.add(win.body(), \"dojoMove\");\n\t\tdomClass.add(this.node, \"dojoMoveItem\");\n\t},\n\tonMoveStop: function(/*Mover*/ mover){\n\t\t// summary:\n\t\t//\t\tcalled after every move operation\n\t\ttopic.publish(\"/dnd/move/stop\", mover);\n\t\tdomClass.remove(win.body(), \"dojoMove\");\n\t\tdomClass.remove(this.node, \"dojoMoveItem\");\n\t},\n\tonFirstMove: function(/*===== mover, e =====*/){\n\t\t// summary:\n\t\t//\t\tcalled during the very first move notification;\n\t\t//\t\tcan be used to initialize coordinates, can be overwritten.\n\t\t// mover: Mover\n\t\t// e: Event\n\n\t\t// default implementation does nothing\n\t},\n\tonMove: function(mover, leftTop /*=====, e =====*/){\n\t\t// summary:\n\t\t//\t\tcalled during every move notification;\n\t\t//\t\tshould actually move the node; can be overwritten.\n\t\t// mover: Mover\n\t\t// leftTop: Object\n\t\t// e: Event\n\t\tthis.onMoving(mover, leftTop);\n\t\tvar s = mover.node.style;\n\t\ts.left = leftTop.l + \"px\";\n\t\ts.top  = leftTop.t + \"px\";\n\t\tthis.onMoved(mover, leftTop);\n\t},\n\tonMoving: function(/*===== mover, leftTop =====*/){\n\t\t// summary:\n\t\t//\t\tcalled before every incremental move; can be overwritten.\n\t\t// mover: Mover\n\t\t// leftTop: Object\n\n\t\t// default implementation does nothing\n\t},\n\tonMoved: function(/*===== mover, leftTop =====*/){\n\t\t// summary:\n\t\t//\t\tcalled after every incremental move; can be overwritten.\n\t\t// mover: Mover\n\t\t// leftTop: Object\n\n\t\t// default implementation does nothing\n\t}\n});\n\n/*=====\nMoveable.__MoveableArgs = declare([], {\n\t// handle: Node||String\n\t//\t\tA node (or node's id), which is used as a mouse handle.\n\t//\t\tIf omitted, the node itself is used as a handle.\n\thandle: null,\n\n\t// delay: Number\n\t//\t\tdelay move by this number of pixels\n\tdelay: 0,\n\n\t// skip: Boolean\n\t//\t\tskip move of form elements\n\tskip: false,\n\n\t// mover: Object\n\t//\t\ta constructor of custom Mover\n\tmover: dnd.Mover\n});\n=====*/\n\nreturn Moveable;\n});\n","define([\n\t\"../_base/array\", \"../_base/declare\", \"../_base/lang\", \"../sniff\", \"../_base/window\",\n\t\"../dom\", \"../dom-geometry\", \"../dom-style\", \"../Evented\", \"../on\", \"../touch\", \"./common\", \"./autoscroll\"\n], function(array, declare, lang, has, win, dom, domGeom, domStyle, Evented, on, touch, dnd, autoscroll){\n\n// module:\n//\t\tdojo/dnd/Mover\n\nreturn declare(\"dojo.dnd.Mover\", [Evented], {\n\t// summary:\n\t//\t\tan object which makes a node follow the mouse, or touch-drag on touch devices.\n\t//\t\tUsed as a default mover, and as a base class for custom movers.\n\n\tconstructor: function(node, e, host){\n\t\t// node: Node\n\t\t//\t\ta node (or node's id) to be moved\n\t\t// e: Event\n\t\t//\t\ta mouse event, which started the move;\n\t\t//\t\tonly pageX and pageY properties are used\n\t\t// host: Object?\n\t\t//\t\tobject which implements the functionality of the move,\n\t\t//\t \tand defines proper events (onMoveStart and onMoveStop)\n\t\tthis.node = dom.byId(node);\n\t\tthis.marginBox = {l: e.pageX, t: e.pageY};\n\t\tthis.mouseButton = e.button;\n\t\tvar h = (this.host = host), d = node.ownerDocument;\n\n\t\tfunction stopEvent(e){\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\tthis.events = [\n\t\t\t// At the start of a drag, onFirstMove is called, and then the following\n\t\t\t// listener is disconnected.\n\t\t\ton(d, touch.move, lang.hitch(this, \"onFirstMove\")),\n\n\t\t\t// These are called continually during the drag\n\t\t\ton(d, touch.move, lang.hitch(this, \"onMouseMove\")),\n\n\t\t\t// And these are called at the end of the drag\n\t\t\ton(d, touch.release,  lang.hitch(this, \"onMouseUp\")),\n\n\t\t\t// cancel text selection and text dragging\n\t\t\ton(d, \"dragstart\",   stopEvent),\n\t\t\ton(d.body, \"selectstart\", stopEvent)\n\t\t];\n\n\t\t// Tell autoscroll that a drag is starting\n\t\tautoscroll.autoScrollStart(d);\n\n\t\t// notify that the move has started\n\t\tif(h && h.onMoveStart){\n\t\t\th.onMoveStart(this);\n\t\t}\n\t},\n\t// mouse event processors\n\tonMouseMove: function(e){\n\t\t// summary:\n\t\t//\t\tevent processor for onmousemove/ontouchmove\n\t\t// e: Event\n\t\t//\t\tmouse/touch event\n\t\tautoscroll.autoScroll(e);\n\t\tvar m = this.marginBox;\n\t\tthis.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e);\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t},\n\tonMouseUp: function(e){\n\t\tif(has(\"webkit\") && has(\"mac\") && this.mouseButton == 2 ?\n\t\t\t\te.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?\n\t\t\tthis.destroy();\n\t\t}\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t},\n\t// utilities\n\tonFirstMove: function(e){\n\t\t// summary:\n\t\t//\t\tmakes the node absolute; it is meant to be called only once.\n\t\t//\t\trelative and absolutely positioned nodes are assumed to use pixel units\n\t\tvar s = this.node.style, l, t, h = this.host;\n\t\tswitch(s.position){\n\t\t\tcase \"relative\":\n\t\t\tcase \"absolute\":\n\t\t\t\t// assume that left and top values are in pixels already\n\t\t\t\tl = Math.round(parseFloat(s.left)) || 0;\n\t\t\t\tt = Math.round(parseFloat(s.top)) || 0;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ts.position = \"absolute\";\t// enforcing the absolute mode\n\t\t\t\tvar m = domGeom.getMarginBox(this.node);\n\t\t\t\t// event.pageX/pageY (which we used to generate the initial\n\t\t\t\t// margin box) includes padding and margin set on the body.\n\t\t\t\t// However, setting the node's position to absolute and then\n\t\t\t\t// doing domGeom.marginBox on it *doesn't* take that additional\n\t\t\t\t// space into account - so we need to subtract the combined\n\t\t\t\t// padding and margin.  We use getComputedStyle and\n\t\t\t\t// _getMarginBox/_getContentBox to avoid the extra lookup of\n\t\t\t\t// the computed style.\n\t\t\t\tvar b = win.doc.body;\n\t\t\t\tvar bs = domStyle.getComputedStyle(b);\n\t\t\t\tvar bm = domGeom.getMarginBox(b, bs);\n\t\t\t\tvar bc = domGeom.getContentBox(b, bs);\n\t\t\t\tl = m.l - (bc.l - bm.l);\n\t\t\t\tt = m.t - (bc.t - bm.t);\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.marginBox.l = l - this.marginBox.l;\n\t\tthis.marginBox.t = t - this.marginBox.t;\n\t\tif(h && h.onFirstMove){\n\t\t\th.onFirstMove(this, e);\n\t\t}\n\n\t\t// Disconnect touch.move that call this function\n\t\tthis.events.shift().remove();\n\t},\n\tdestroy: function(){\n\t\t// summary:\n\t\t//\t\tstops the move, deletes all references, so the object can be garbage-collected\n\t\tarray.forEach(this.events, function(handle){ handle.remove(); });\n\t\t// undo global settings\n\t\tvar h = this.host;\n\t\tif(h && h.onMoveStop){\n\t\t\th.onMoveStop(this);\n\t\t}\n\t\t// destroy objects\n\t\tthis.events = this.node = this.host = null;\n\t}\n});\n\n});\n","define([\"../_base/declare\", \"./Moveable\" /*=====, \"./Mover\" =====*/], function(declare, Moveable /*=====, Mover =====*/){\n\t// module:\n\t//\t\tdojo/dnd/TimedMoveable\n\n\t/*=====\n\tvar __TimedMoveableArgs = declare([Moveable.__MoveableArgs], {\n\t\t// timeout: Number\n\t\t//\t\tdelay move by this number of ms,\n\t\t//\t\taccumulating position changes during the timeout\n\t\ttimeout: 0\n\t});\n\t=====*/\n\n\t// precalculate long expressions\n\tvar oldOnMove = Moveable.prototype.onMove;\n\n\treturn declare(\"dojo.dnd.TimedMoveable\", Moveable, {\n\t\t// summary:\n\t\t//\t\tA specialized version of Moveable to support an FPS throttling.\n\t\t//\t\tThis class puts an upper restriction on FPS, which may reduce\n\t\t//\t\tthe CPU load. The additional parameter \"timeout\" regulates\n\t\t//\t\tthe delay before actually moving the moveable object.\n\n\t\t// object attributes (for markup)\n\t\ttimeout: 40,\t// in ms, 40ms corresponds to 25 fps\n\n\t\tconstructor: function(node, params){\n\t\t\t// summary:\n\t\t\t//\t\tan object that makes a node moveable with a timer\n\t\t\t// node: Node||String\n\t\t\t//\t\ta node (or node's id) to be moved\n\t\t\t// params: __TimedMoveableArgs\n\t\t\t//\t\tobject with additional parameters.\n\n\t\t\t// sanitize parameters\n\t\t\tif(!params){ params = {}; }\n\t\t\tif(params.timeout && typeof params.timeout == \"number\" && params.timeout >= 0){\n\t\t\t\tthis.timeout = params.timeout;\n\t\t\t}\n\t\t},\n\n\t\tonMoveStop: function(/*Mover*/ mover){\n\t\t\tif(mover._timer){\n\t\t\t\t// stop timer\n\t\t\t\tclearTimeout(mover._timer);\n\t\t\t\t// reflect the last received position\n\t\t\t\toldOnMove.call(this, mover, mover._leftTop);\n\t\t\t}\n\t\t\tMoveable.prototype.onMoveStop.apply(this, arguments);\n\t\t},\n\t\tonMove: function(/*Mover*/ mover, /*Object*/ leftTop){\n\t\t\tmover._leftTop = leftTop;\n\t\t\tif(!mover._timer){\n\t\t\t\tvar _t = this;\t// to avoid using dojo.hitch()\n\t\t\t\tmover._timer = setTimeout(function(){\n\t\t\t\t\t// we don't have any pending requests\n\t\t\t\t\tmover._timer = null;\n\t\t\t\t\t// reflect the last received position\n\t\t\t\t\toldOnMove.call(_t, mover, mover._leftTop);\n\t\t\t\t}, this.timeout);\n\t\t\t}\n\t\t}\n\t});\n});\n","define([\"../_base/lang\", \"../sniff\", \"../_base/window\", \"../dom-geometry\", \"../dom-style\", \"../window\"],\n\tfunction(lang, has, win, domGeom, domStyle, winUtils){\n\n// module:\n//\t\tdojo/dnd/autoscroll\n\nvar exports = {\n\t// summary:\n\t//\t\tUsed by dojo/dnd/Manager to scroll document or internal node when the user\n\t//\t\tdrags near the edge of the viewport or a scrollable node\n};\nlang.setObject(\"dojo.dnd.autoscroll\", exports);\n\nexports.getViewport = winUtils.getBox;\n\nexports.V_TRIGGER_AUTOSCROLL = 32;\nexports.H_TRIGGER_AUTOSCROLL = 32;\n\nexports.V_AUTOSCROLL_VALUE = 16;\nexports.H_AUTOSCROLL_VALUE = 16;\n\n// These are set by autoScrollStart().\n// Set to default values in case autoScrollStart() isn't called. (back-compat, remove for 2.0)\nvar viewport,\n\tdoc = win.doc,\n\tmaxScrollTop = Infinity,\n\tmaxScrollLeft = Infinity;\n\nexports.autoScrollStart = function(d){\n\t// summary:\n\t//\t\tCalled at the start of a drag.\n\t// d: Document\n\t//\t\tThe document of the node being dragged.\n\n\tdoc = d;\n\tviewport = winUtils.getBox(doc);\n\n\t// Save height/width of document at start of drag, before it gets distorted by a user dragging an avatar past\n\t// the document's edge\n\tvar html = win.body(doc).parentNode;\n\tmaxScrollTop = Math.max(html.scrollHeight - viewport.h, 0);\n\tmaxScrollLeft = Math.max(html.scrollWidth - viewport.w, 0);\t// usually 0\n};\n\nexports.autoScroll = function(e){\n\t// summary:\n\t//\t\ta handler for mousemove and touchmove events, which scrolls the window, if\n\t//\t\tnecessary\n\t// e: Event\n\t//\t\tmousemove/touchmove event\n\n\t// FIXME: needs more docs!\n\tvar v = viewport || winUtils.getBox(doc), // getBox() call for back-compat, in case autoScrollStart() wasn't called\n\t\thtml = win.body(doc).parentNode,\n\t\tdx = 0, dy = 0;\n\tif(e.clientX < exports.H_TRIGGER_AUTOSCROLL){\n\t\tdx = -exports.H_AUTOSCROLL_VALUE;\n\t}else if(e.clientX > v.w - exports.H_TRIGGER_AUTOSCROLL){\n\t\tdx = Math.min(exports.H_AUTOSCROLL_VALUE, maxScrollLeft - html.scrollLeft);\t// don't scroll past edge of doc\n\t}\n\tif(e.clientY < exports.V_TRIGGER_AUTOSCROLL){\n\t\tdy = -exports.V_AUTOSCROLL_VALUE;\n\t}else if(e.clientY > v.h - exports.V_TRIGGER_AUTOSCROLL){\n\t\tdy = Math.min(exports.V_AUTOSCROLL_VALUE, maxScrollTop - html.scrollTop);\t// don't scroll past edge of doc\n\t}\n\twindow.scrollBy(dx, dy);\n};\n\nexports._validNodes = {\"div\": 1, \"p\": 1, \"td\": 1};\nexports._validOverflow = {\"auto\": 1, \"scroll\": 1};\n\nexports.autoScrollNodes = function(e){\n\t// summary:\n\t//\t\ta handler for mousemove and touchmove events, which scrolls the first available\n\t//\t\tDom element, it falls back to exports.autoScroll()\n\t// e: Event\n\t//\t\tmousemove/touchmove event\n\n\t// FIXME: needs more docs!\n\n\tvar b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop;\n\n\tfor(var n = e.target; n;){\n\t\tif(n.nodeType == 1 && (n.tagName.toLowerCase() in exports._validNodes)){\n\t\t\tvar s = domStyle.getComputedStyle(n),\n\t\t\t\toverflowX = (s.overflowX.toLowerCase() in exports._validOverflow),\n\t\t\t\toverflowY = (s.overflowY.toLowerCase() in exports._validOverflow);\n\t\t\tif(overflowX || overflowY){\n\t\t\t\tb = domGeom.getContentBox(n, s);\n\t\t\t\tt = domGeom.position(n, true);\n\t\t\t}\n\t\t\t// overflow-x\n\t\t\tif(overflowX){\n\t\t\t\tw = Math.min(exports.H_TRIGGER_AUTOSCROLL, b.w / 2);\n\t\t\t\trx = e.pageX - t.x;\n\t\t\t\tif(has(\"webkit\") || has(\"opera\")){\n\t\t\t\t\t// FIXME: this code should not be here, it should be taken into account\n\t\t\t\t\t// either by the event fixing code, or the domGeom.position()\n\t\t\t\t\t// FIXME: this code doesn't work on Opera 9.5 Beta\n\t\t\t\t\trx += win.body().scrollLeft;\n\t\t\t\t}\n\t\t\t\tdx = 0;\n\t\t\t\tif(rx > 0 && rx < b.w){\n\t\t\t\t\tif(rx < w){\n\t\t\t\t\t\tdx = -w;\n\t\t\t\t\t}else if(rx > b.w - w){\n\t\t\t\t\t\tdx = w;\n\t\t\t\t\t}\n\t\t\t\t\toldLeft = n.scrollLeft;\n\t\t\t\t\tn.scrollLeft = n.scrollLeft + dx;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// overflow-y\n\t\t\tif(overflowY){\n\t\t\t\t//console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);\n\t\t\t\th = Math.min(exports.V_TRIGGER_AUTOSCROLL, b.h / 2);\n\t\t\t\try = e.pageY - t.y;\n\t\t\t\tif(has(\"webkit\") || has(\"opera\")){\n\t\t\t\t\t// FIXME: this code should not be here, it should be taken into account\n\t\t\t\t\t// either by the event fixing code, or the domGeom.position()\n\t\t\t\t\t// FIXME: this code doesn't work on Opera 9.5 Beta\n\t\t\t\t\try += win.body().scrollTop;\n\t\t\t\t}\n\t\t\t\tdy = 0;\n\t\t\t\tif(ry > 0 && ry < b.h){\n\t\t\t\t\tif(ry < h){\n\t\t\t\t\t\tdy = -h;\n\t\t\t\t\t}else if(ry > b.h - h){\n\t\t\t\t\t\tdy = h;\n\t\t\t\t\t}\n\t\t\t\t\toldTop = n.scrollTop;\n\t\t\t\t\tn.scrollTop  = n.scrollTop  + dy;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(dx || dy){ return; }\n\t\t}\n\t\ttry{\n\t\t\tn = n.parentNode;\n\t\t}catch(x){\n\t\t\tn = null;\n\t\t}\n\t}\n\texports.autoScroll(e);\n};\n\nreturn exports;\n\n});\n","define([\"../sniff\", \"../_base/kernel\", \"../_base/lang\", \"../dom\"],\n\tfunction(has, kernel, lang, dom){\n\n// module:\n//\t\tdojo/dnd/common\n\nvar exports = lang.getObject(\"dojo.dnd\", true);\n/*=====\n// TODO: for 2.0, replace line above with this code.\nvar exports = {\n\t// summary:\n\t//\t\tTODOC\n};\n=====*/\n\nexports.getCopyKeyState = function(evt){\n\treturn evt[has(\"mac\") ? \"metaKey\" : \"ctrlKey\"]\n};\n\nexports._uniqueId = 0;\nexports.getUniqueId = function(){\n\t// summary:\n\t//\t\treturns a unique string for use with any DOM element\n\tvar id;\n\tdo{\n\t\tid = kernel._scopeName + \"Unique\" + (++exports._uniqueId);\n\t}while(dom.byId(id));\n\treturn id;\n};\n\nexports._empty = {};\n\nexports.isFormElement = function(/*Event*/ e){\n\t// summary:\n\t//\t\treturns true if user clicked on a form element\n\tvar t = e.target;\n\tif(t.nodeType == 3 /*TEXT_NODE*/){\n\t\tt = t.parentNode;\n\t}\n\treturn \" a button textarea input select option \".indexOf(\" \" + t.tagName.toLowerCase() + \" \") >= 0;\t// Boolean\n};\n\nreturn exports;\n});\n","define([\"./_base/lang\", \"./_base/array\", \"./dom\"], function(lang, array, dom){\n\t// module:\n\t//\t\tdojo/dom-class\n\n\tvar className = \"className\";\n\n\t/* Part I of classList-based implementation is preserved here for posterity\n\tvar classList = \"classList\";\n\thas.add(\"dom-classList\", function(){\n\t\treturn classList in document.createElement(\"p\");\n\t});\n\t*/\n\n\t// =============================\n\t// (CSS) Class Functions\n\t// =============================\n\n\tvar cls, // exports object\n\t\tspaces = /\\s+/, a1 = [\"\"];\n\n\tfunction str2array(s){\n\t\tif(typeof s == \"string\" || s instanceof String){\n\t\t\tif(s && !spaces.test(s)){\n\t\t\t\ta1[0] = s;\n\t\t\t\treturn a1;\n\t\t\t}\n\t\t\tvar a = s.split(spaces);\n\t\t\tif(a.length && !a[0]){\n\t\t\t\ta.shift();\n\t\t\t}\n\t\t\tif(a.length && !a[a.length - 1]){\n\t\t\t\ta.pop();\n\t\t\t}\n\t\t\treturn a;\n\t\t}\n\t\t// assumed to be an array\n\t\tif(!s){\n\t\t\treturn [];\n\t\t}\n\t\treturn array.filter(s, function(x){ return x; });\n\t}\n\n\t/* Part II of classList-based implementation is preserved here for posterity\n\tif(has(\"dom-classList\")){\n\t\t// new classList version\n\t\tcls = {\n\t\t\tcontains: function containsClass(node, classStr){\n\t\t\t\tvar clslst = classStr && dom.byId(node)[classList];\n\t\t\t\treturn clslst && clslst.contains(classStr); // Boolean\n\t\t\t},\n\n\t\t\tadd: function addClass(node, classStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\tnode[classList].add(classStr[i]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tremove: function removeClass(node, classStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(classStr === undefined){\n\t\t\t\t\tnode[className] = \"\";\n\t\t\t\t}else{\n\t\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].remove(classStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\treplace: function replaceClass(node, addClassStr, removeClassStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(removeClassStr === undefined){\n\t\t\t\t\tnode[className] = \"\";\n\t\t\t\t}else{\n\t\t\t\t\tremoveClassStr = str2array(removeClassStr);\n\t\t\t\t\tfor(var i = 0, len = removeClassStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].remove(removeClassStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taddClassStr = str2array(addClassStr);\n\t\t\t\tfor(i = 0, len = addClassStr.length; i < len; ++i){\n\t\t\t\t\tnode[classList].add(addClassStr[i]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttoggle: function toggleClass(node, classStr, condition){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(condition === undefined){\n\t\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].toggle(classStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tcls[condition ? \"add\" : \"remove\"](node, classStr);\n\t\t\t\t}\n\t\t\t\treturn condition;   // Boolean\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t// regular DOM version\n\tvar fakeNode = {};  // for effective replacement\n\tcls = {\n\t\t// summary:\n\t\t//\t\tThis module defines the core dojo DOM class API.\n\n\t\tcontains: function containsClass(/*DomNode|String*/ node, /*String*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tReturns whether or not the specified classes are a portion of the\n\t\t\t//\t\tclass list currently applied to the node.\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to check the class for.\n\t\t\t// classStr: String\n\t\t\t//\t\tA string class name to look for.\n\t\t\t// example:\n\t\t\t//\t\tDo something if a node with id=\"someNode\" has class=\"aSillyClassName\" present\n\t\t\t//\t|\tif(domClass.contains(\"someNode\",\"aSillyClassName\")){ ... }\n\n\t\t\treturn ((\" \" + dom.byId(node)[className] + \" \").indexOf(\" \" + classStr + \" \") >= 0); // Boolean\n\t\t},\n\n\t\tadd: function addClass(/*DomNode|String*/ node, /*String|Array*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tAdds the specified classes to the end of the class list on the\n\t\t\t//\t\tpassed node. Will not re-apply duplicate classes.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to add a class string too\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd a class to some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", \"anewClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd two classes at once:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", \"firstClass secondClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd two classes at once (using array):\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", [\"firstClass\", \"secondClass\"]);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple additions\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").addClass(\"firstLevel\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tclassStr = str2array(classStr);\n\t\t\tvar cls = node[className], oldLen;\n\t\t\tcls = cls ? \" \" + cls + \" \" : \" \";\n\t\t\toldLen = cls.length;\n\t\t\tfor(var i = 0, len = classStr.length, c; i < len; ++i){\n\t\t\t\tc = classStr[i];\n\t\t\t\tif(c && cls.indexOf(\" \" + c + \" \") < 0){\n\t\t\t\t\tcls += c + \" \";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(oldLen < cls.length){\n\t\t\t\tnode[className] = cls.substr(1, cls.length - 2);\n\t\t\t}\n\t\t},\n\n\t\tremove: function removeClass(/*DomNode|String*/ node, /*String|Array?*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tRemoves the specified classes from node. No `contains()`\n\t\t\t//\t\tcheck is required.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to remove the class from.\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tAn optional String class name to remove, or several space-separated\n\t\t\t//\t\tclass names, or an array of class names. If omitted, all class names\n\t\t\t//\t\twill be deleted.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove a class from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", \"firstClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove two classes from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", \"firstClass secondClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove two classes from some node (using array):\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", [\"firstClass\", \"secondClass\"]);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove all classes from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple removal\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").removeClass(\"foo\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tvar cls;\n\t\t\tif(classStr !== undefined){\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tcls = \" \" + node[className] + \" \";\n\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\tcls = cls.replace(\" \" + classStr[i] + \" \", \" \");\n\t\t\t\t}\n\t\t\t\tcls = lang.trim(cls);\n\t\t\t}else{\n\t\t\t\tcls = \"\";\n\t\t\t}\n\t\t\tif(node[className] != cls){ node[className] = cls; }\n\t\t},\n\n\t\treplace: function replaceClass(/*DomNode|String*/ node, /*String|Array*/ addClassStr, /*String|Array?*/ removeClassStr){\n\t\t\t// summary:\n\t\t\t//\t\tReplaces one or more classes on a node if not present.\n\t\t\t//\t\tOperates more quickly than calling domClass.remove and domClass.add\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to remove the class from.\n\t\t\t//\n\t\t\t// addClassStr: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// removeClassStr: String|Array?\n\t\t\t//\t\tA String class name to remove, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.replace(\"someNode\", \"add1 add2\", \"remove1 remove2\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tReplace all classes with addMe\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.replace(\"someNode\", \"addMe\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tAvailable in `dojo/NodeList` for multiple toggles\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\".findMe\").replaceClass(\"addMe\", \"removeMe\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tfakeNode[className] = node[className];\n\t\t\tcls.remove(fakeNode, removeClassStr);\n\t\t\tcls.add(fakeNode, addClassStr);\n\t\t\tif(node[className] !== fakeNode[className]){\n\t\t\t\tnode[className] = fakeNode[className];\n\t\t\t}\n\t\t},\n\n\t\ttoggle: function toggleClass(/*DomNode|String*/ node, /*String|Array*/ classStr, /*Boolean?*/ condition){\n\t\t\t// summary:\n\t\t\t//\t\tAdds a class to node if not present, or removes if present.\n\t\t\t//\t\tPass a boolean condition if you want to explicitly add or remove.\n\t\t\t//\t\tReturns the condition that was specified directly or indirectly.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to toggle a class string\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tA String class name to toggle, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// condition:\n\t\t\t//\t\tIf passed, true means to add the class, false means to remove.\n\t\t\t//\t\tOtherwise domClass.contains(node, classStr) is used to detect the class presence.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.toggle(\"someNode\", \"hovered\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tForcefully add a class\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.toggle(\"someNode\", \"hovered\", true);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple toggles\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\".toggleMe\").toggleClass(\"toggleMe\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tif(condition === undefined){\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tfor(var i = 0, len = classStr.length, c; i < len; ++i){\n\t\t\t\t\tc = classStr[i];\n\t\t\t\t\tcls[cls.contains(node, c) ? \"remove\" : \"add\"](node, c);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tcls[condition ? \"add\" : \"remove\"](node, classStr);\n\t\t\t}\n\t\t\treturn condition;   // Boolean\n\t\t}\n\t};\n\n\treturn cls;\n});\n","define(['./global', './has'], function(global, has){\n\tvar doc = document,\n\t\treadyStates = { 'loaded': 1, 'complete': 1 },\n\t\tfixReadyState = typeof doc.readyState != \"string\",\n\t\tready = !!readyStates[doc.readyState],\n\t\treadyQ = [],\n\t\trecursiveGuard;\n\n\tfunction domReady(callback){\n\t\t// summary:\n\t\t//\t\tPlugin to delay require()/define() callback from firing until the DOM has finished loading.\n\t\treadyQ.push(callback);\n\t\tif(ready){ processQ(); }\n\t}\n\tdomReady.load = function(id, req, load){\n\t\tdomReady(load);\n\t};\n\n\t// Export queue so that ready() can check if it's empty or not.\n\tdomReady._Q = readyQ;\n\tdomReady._onQEmpty = function(){\n\t\t// summary:\n\t\t//\t\tPrivate method overridden by dojo/ready, to notify when everything in the\n\t\t//\t\tdomReady queue has been processed.  Do not use directly.\n\t\t//\t\tWill be removed in 2.0, along with domReady._Q.\n\t};\n\n\t// For FF <= 3.5\n\tif(fixReadyState){ doc.readyState = \"loading\"; }\n\n\tfunction processQ(){\n\t\t// Calls all functions in the queue in order, unless processQ() is already running, in which case just return\n\n\t\tif(recursiveGuard){ return; }\n\t\trecursiveGuard = true;\n\n\t\twhile(readyQ.length){\n\t\t\ttry{\n\t\t\t\t(readyQ.shift())(doc);\n\t\t\t}catch(err){\n\t\t\t\tconsole.error(err, \"in domReady callback\", err.stack);\n\t\t\t}\n\t\t}\n\n\t\trecursiveGuard = false;\n\n\t\t// Notification for dojo/ready.  Remove for 2.0.\n\t\t// Note that this could add more tasks to the ready queue.\n\t\tdomReady._onQEmpty();\n\t}\n\n\tif(!ready){\n\t\tvar tests = [],\n\t\t\tdetectReady = function(evt){\n\t\t\t\tevt = evt || global.event;\n\t\t\t\tif(ready || (evt.type == \"readystatechange\" && !readyStates[doc.readyState])){ return; }\n\n\t\t\t\t// For FF <= 3.5\n\t\t\t\tif(fixReadyState){ doc.readyState = \"complete\"; }\n\n\t\t\t\tready = 1;\n\t\t\t\tprocessQ();\n\t\t\t},\n\t\t\ton = function(node, event){\n\t\t\t\tnode.addEventListener(event, detectReady, false);\n\t\t\t\treadyQ.push(function(){ node.removeEventListener(event, detectReady, false); });\n\t\t\t};\n\n\t\tif(!has(\"dom-addeventlistener\")){\n\t\t\ton = function(node, event){\n\t\t\t\tevent = \"on\" + event;\n\t\t\t\tnode.attachEvent(event, detectReady);\n\t\t\t\treadyQ.push(function(){ node.detachEvent(event, detectReady); });\n\t\t\t};\n\n\t\t\tvar div = doc.createElement(\"div\");\n\t\t\ttry{\n\t\t\t\tif(div.doScroll && global.frameElement === null){\n\t\t\t\t\t// the doScroll test is only useful if we're in the top-most frame\n\t\t\t\t\ttests.push(function(){\n\t\t\t\t\t\t// Derived with permission from Diego Perini's IEContentLoaded\n\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tdiv.doScroll(\"left\");\n\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t}catch(e){}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}catch(e){}\n\t\t}\n\n\t\ton(doc, \"DOMContentLoaded\");\n\t\ton(global, \"load\");\n\n\t\tif(\"onreadystatechange\" in doc){\n\t\t\ton(doc, \"readystatechange\");\n\t\t}else if(!fixReadyState){\n\t\t\t// if the ready state property exists and there's\n\t\t\t// no readystatechange event, poll for the state\n\t\t\t// to change\n\t\t\ttests.push(function(){\n\t\t\t\treturn readyStates[doc.readyState];\n\t\t\t});\n\t\t}\n\n\t\tif(tests.length){\n\t\t\tvar poller = function(){\n\t\t\t\tif(ready){ return; }\n\t\t\t\tvar i = tests.length;\n\t\t\t\twhile(i--){\n\t\t\t\t\tif(tests[i]()){\n\t\t\t\t\t\tdetectReady(\"poller\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetTimeout(poller, 30);\n\t\t\t};\n\t\t\tpoller();\n\t\t}\n\t}\n\n\treturn domReady;\n});\n","define([\n\t\"require\",\t\t\t// require, require.toUrl\n\t\"./_base/config\", // config.blankGif\n\t\"./dom-class\", // domClass.add\n\t\"./dom-style\", // domStyle.getComputedStyle\n\t\"./has\",\n\t\"./domReady\",\n\t\"./_base/window\" // win.body\n], function(require, config, domClass, domStyle, has, domReady, win){\n\n\t// module:\n\t//\t\tdojo/hccss\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tTest if computer is in high contrast mode (i.e. if browser is not displaying background images).\n\t\t//\t\tDefines `has(\"highcontrast\")` and sets `dj_a11y` CSS class on `<body>` if machine is in high contrast mode.\n\t\t//\t\tReturns `has()` method;\n\t};\n\t=====*/\n\n\t// Has() test for when background images aren't displayed.  Don't call has(\"highcontrast\") before dojo/domReady!.\n\thas.add(\"highcontrast\", function(){\n\t\t// note: if multiple documents, doesn't matter which one we use\n\t\tvar div = win.doc.createElement(\"div\");\n\t\ttry{\n\t\t\tdiv.style.cssText = \"border: 1px solid; border-color:red green; position: absolute; height: 5px; top: -999px;\" +\n\t\t\t\t\"background-image: url(\\\"\" + (config.blankGif || require.toUrl(\"./resources/blank.gif\")) + \"\\\");\";\n\t\t\twin.body().appendChild(div);\n\n\t\t\tvar cs = domStyle.getComputedStyle(div),\n\t\t\t\tbkImg = cs.backgroundImage;\n\t\t\treturn cs.borderTopColor == cs.borderRightColor ||\n\t\t\t\t(bkImg && (bkImg == \"none\" || bkImg == \"url(invalid-url:)\" ));\n\t\t}catch(e){\n\t\t\tconsole.warn(\"hccss: exception detecting high-contrast mode, document is likely hidden: \" + e.toString());\n\t\t\treturn false;\n\t\t}finally{\n\t\t\tif(has(\"ie\") <= 8){\n\t\t\t\tdiv.outerHTML = \"\";\t\t// prevent mixed-content warning, see http://support.microsoft.com/kb/925014\n\t\t\t}else{\n\t\t\t\twin.body().removeChild(div);\n\t\t\t}\n\t\t}\n\t});\n\n\tdomReady(function(){\n\t\tif(has(\"highcontrast\")){\n\t\t\tdomClass.add(win.body(), \"dj_a11y\");\n\t\t}\n\t});\n\n\treturn has;\n});\n","define([\"./_base/kernel\", \"./_base/lang\", \"./_base/array\", \"./_base/declare\", \"./dom\", \"./dom-construct\", \"./parser\"],\n\tfunction(kernel, lang, darray, declare, dom, domConstruct, parser){\n\t// module:\n\t//\t\tdojo/html\n\n\t// the parser might be needed..\n\n\t// idCounter is incremented with each instantiation to allow assignment of a unique id for tracking, logging purposes\n\tvar idCounter = 0;\n\n\tvar html = {\n\t\t// summary:\n\t\t//\t\tTODOC\n\n\t\t_secureForInnerHtml: function(/*String*/ cont){\n\t\t\t// summary:\n\t\t\t//\t\tremoves !DOCTYPE and title elements from the html string.\n\t\t\t//\n\t\t\t//\t\tkhtml is picky about dom faults, you can't attach a style or `<title>` node as child of body\n\t\t\t//\t\tmust go into head, so we need to cut out those tags\n\t\t\t// cont:\n\t\t\t//\t\tAn html string for insertion into the dom\n\t\t\t//\n\t\t\treturn cont.replace(/(?:\\s*<!DOCTYPE\\s[^>]+>|<title[^>]*>[\\s\\S]*?<\\/title>)/ig, \"\"); // String\n\t\t},\n\n\t\t// Deprecated, should use dojo/dom-constuct.empty() directly, remove in 2.0.\n\t\t_emptyNode: domConstruct.empty,\n\n\t\t_setNodeContent: function(/*DomNode*/ node, /*String|DomNode|NodeList*/ cont){\n\t\t\t// summary:\n\t\t\t//\t\tinserts the given content into the given node\n\t\t\t// node:\n\t\t\t//\t\tthe parent element\n\t\t\t// content:\n\t\t\t//\t\tthe content to be set on the parent element.\n\t\t\t//\t\tThis can be an html string, a node reference or a NodeList, dojo/NodeList, Array or other enumerable list of nodes\n\n\t\t\t// always empty\n\t\t\tdomConstruct.empty(node);\n\n\t\t\tif(cont){\n\t\t\t\tif(typeof cont == \"number\"){\n\t\t\t\t\tcont = cont.toString();\n\t\t\t\t}\n\t\t\t\tif(typeof cont == \"string\"){\n\t\t\t\t\tcont = domConstruct.toDom(cont, node.ownerDocument);\n\t\t\t\t}\n\t\t\t\tif(!cont.nodeType && lang.isArrayLike(cont)){\n\t\t\t\t\t// handle as enumerable, but it may shrink as we enumerate it\n\t\t\t\t\tfor(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0){\n\t\t\t\t\t\tdomConstruct.place( cont[i], node, \"last\");\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t// pass nodes, documentFragments and unknowns through to dojo.place\n\t\t\t\t\tdomConstruct.place(cont, node, \"last\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return DomNode\n\t\t\treturn node;\n\t\t},\n\n\t\t// we wrap up the content-setting operation in a object\n\t\t_ContentSetter: declare(\"dojo.html._ContentSetter\", null, {\n\t\t\t// node: DomNode|String\n\t\t\t//\t\tAn node which will be the parent element that we set content into\n\t\t\tnode: \"\",\n\n\t\t\t// content: String|DomNode|DomNode[]\n\t\t\t//\t\tThe content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes\n\t\t\tcontent: \"\",\n\n\t\t\t// id: String?\n\t\t\t//\t\tUsually only used internally, and auto-generated with each instance\n\t\t\tid: \"\",\n\n\t\t\t// cleanContent: Boolean\n\t\t\t//\t\tShould the content be treated as a full html document,\n\t\t\t//\t\tand the real content stripped of <html>, <body> wrapper before injection\n\t\t\tcleanContent: false,\n\n\t\t\t// extractContent: Boolean\n\t\t\t//\t\tShould the content be treated as a full html document,\n\t\t\t//\t\tand the real content stripped of `<html> <body>` wrapper before injection\n\t\t\textractContent: false,\n\n\t\t\t// parseContent: Boolean\n\t\t\t//\t\tShould the node by passed to the parser after the new content is set\n\t\t\tparseContent: false,\n\n\t\t\t// parserScope: String\n\t\t\t//\t\tFlag passed to parser.\tRoot for attribute names to search for.\t  If scopeName is dojo,\n\t\t\t//\t\twill search for data-dojo-type (or dojoType).  For backwards compatibility\n\t\t\t//\t\treasons defaults to dojo._scopeName (which is \"dojo\" except when\n\t\t\t//\t\tmulti-version support is used, when it will be something like dojo16, dojo20, etc.)\n\t\t\tparserScope: kernel._scopeName,\n\n\t\t\t// startup: Boolean\n\t\t\t//\t\tStart the child widgets after parsing them.\t  Only obeyed if parseContent is true.\n\t\t\tstartup: true,\n\n\t\t\t// lifecycle methods\n\t\t\tconstructor: function(/*Object*/ params, /*String|DomNode*/ node){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tProvides a configurable, extensible object to wrap the setting on content on a node\n\t\t\t\t//\t\tcall the set() method to actually set the content..\n\n\t\t\t\t// the original params are mixed directly into the instance \"this\"\n\t\t\t\tlang.mixin(this, params || {});\n\n\t\t\t\t// give precedence to params.node vs. the node argument\n\t\t\t\t// and ensure its a node, not an id string\n\t\t\t\tnode = this.node = dom.byId( this.node || node );\n\n\t\t\t\tif(!this.id){\n\t\t\t\t\tthis.id = [\n\t\t\t\t\t\t\"Setter\",\n\t\t\t\t\t\t(node) ? node.id || node.tagName : \"\",\n\t\t\t\t\t\tidCounter++\n\t\t\t\t\t].join(\"_\");\n\t\t\t\t}\n\t\t\t},\n\t\t\tset: function(/* String|DomNode|NodeList? */ cont, /*Object?*/ params){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tfront-end to the set-content sequence\n\t\t\t\t// cont:\n\t\t\t\t//\t\tAn html string, node or enumerable list of nodes for insertion into the dom\n\t\t\t\t//\t\tIf not provided, the object's content property will be used\n\t\t\t\tif(undefined !== cont){\n\t\t\t\t\tthis.content = cont;\n\t\t\t\t}\n\t\t\t\tif(typeof cont == 'number'){\n\t\t\t\t\tcont = cont.toString();\n\t\t\t\t}\n\t\t\t\t// in the re-use scenario, set needs to be able to mixin new configuration\n\t\t\t\tif(params){\n\t\t\t\t\tthis._mixin(params);\n\t\t\t\t}\n\n\t\t\t\tthis.onBegin();\n\t\t\t\tthis.setContent();\n\n\t\t\t\tvar ret = this.onEnd();\n\n\t\t\t\tif(ret && ret.then){\n\t\t\t\t\t// Make dojox/html/_ContentSetter.set() return a Promise that resolves when load and parse complete.\n\t\t\t\t\treturn ret;\n\t\t\t\t}else{\n\t\t\t\t\t// Vanilla dojo/html._ContentSetter.set() returns a DOMNode for back compat.   For 2.0, switch it to\n\t\t\t\t\t// return a Deferred like above.\n\t\t\t\t\treturn this.node;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tsetContent: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tsets the content on the node\n\n\t\t\t\tvar node = this.node;\n\t\t\t\tif(!node){\n\t\t\t\t\t// can't proceed\n\t\t\t\t\tthrow new Error(this.declaredClass + \": setContent given no node\");\n\t\t\t\t}\n\t\t\t\ttry{\n\t\t\t\t\tnode = html._setNodeContent(node, this.content);\n\t\t\t\t}catch(e){\n\t\t\t\t\t// check if a domfault occurs when we are appending this.errorMessage\n\t\t\t\t\t// like for instance if domNode is a UL and we try append a DIV\n\n\t\t\t\t\t// FIXME: need to allow the user to provide a content error message string\n\t\t\t\t\tvar errMess = this.onContentError(e);\n\t\t\t\t\ttry{\n\t\t\t\t\t\tnode.innerHTML = errMess;\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tconsole.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// always put back the node for the next method\n\t\t\t\tthis.node = node; // DomNode\n\t\t\t},\n\n\t\t\tempty: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tcleanly empty out existing content\n\n\t\t\t\t// If there is a parse in progress, cancel it.\n\t\t\t\tif(this.parseDeferred){\n\t\t\t\t\tif(!this.parseDeferred.isResolved()){\n\t\t\t\t\t\tthis.parseDeferred.cancel();\n\t\t\t\t\t}\n\t\t\t\t\tdelete this.parseDeferred;\n\t\t\t\t}\n\n\t\t\t\t// destroy any widgets from a previous run\n\t\t\t\t// NOTE: if you don't want this you'll need to empty\n\t\t\t\t// the parseResults array property yourself to avoid bad things happening\n\t\t\t\tif(this.parseResults && this.parseResults.length){\n\t\t\t\t\tdarray.forEach(this.parseResults, function(w){\n\t\t\t\t\t\tif(w.destroy){\n\t\t\t\t\t\t\tw.destroy();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdelete this.parseResults;\n\t\t\t\t}\n\t\t\t\t// this is fast, but if you know its already empty or safe, you could\n\t\t\t\t// override empty to skip this step\n\t\t\t\tdomConstruct.empty(this.node);\n\t\t\t},\n\n\t\t\tonBegin: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tCalled after instantiation, but before set();\n\t\t\t\t//\t\tIt allows modification of any of the object properties -\n\t\t\t\t//\t\tincluding the node and content provided - before the set operation actually takes place\n\t\t\t\t//\t\tThis default implementation checks for cleanContent and extractContent flags to\n\t\t\t\t//\t\toptionally pre-process html string content\n\t\t\t\tvar cont = this.content;\n\n\t\t\t\tif(lang.isString(cont)){\n\t\t\t\t\tif(this.cleanContent){\n\t\t\t\t\t\tcont = html._secureForInnerHtml(cont);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.extractContent){\n\t\t\t\t\t\tvar match = cont.match(/<body[^>]*>\\s*([\\s\\S]+)\\s*<\\/body>/im);\n\t\t\t\t\t\tif(match){ cont = match[1]; }\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// clean out the node and any cruft associated with it - like widgets\n\t\t\t\tthis.empty();\n\n\t\t\t\tthis.content = cont;\n\t\t\t\treturn this.node; // DomNode\n\t\t\t},\n\n\t\t\tonEnd: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tCalled after set(), when the new content has been pushed into the node\n\t\t\t\t//\t\tIt provides an opportunity for post-processing before handing back the node to the caller\n\t\t\t\t//\t\tThis default implementation checks a parseContent flag to optionally run the dojo parser over the new content\n\t\t\t\tif(this.parseContent){\n\t\t\t\t\t// populates this.parseResults and this.parseDeferred if you need those..\n\t\t\t\t\tthis._parse();\n\t\t\t\t}\n\t\t\t\treturn this.node; // DomNode\n\t\t\t\t// TODO: for 2.0 return a Promise indicating that the parse completed.\n\t\t\t},\n\n\t\t\ttearDown: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tmanually reset the Setter instance if its being re-used for example for another set()\n\t\t\t\t// description:\n\t\t\t\t//\t\ttearDown() is not called automatically.\n\t\t\t\t//\t\tIn normal use, the Setter instance properties are simply allowed to fall out of scope\n\t\t\t\t//\t\tbut the tearDown method can be called to explicitly reset this instance.\n\t\t\t\tdelete this.parseResults;\n\t\t\t\tdelete this.parseDeferred;\n\t\t\t\tdelete this.node;\n\t\t\t\tdelete this.content;\n\t\t\t},\n\n\t\t\tonContentError: function(err){\n\t\t\t\treturn \"Error occurred setting content: \" + err;\n\t\t\t},\n\n\t\t\tonExecError: function(err){\n\t\t\t\treturn \"Error occurred executing scripts: \" + err;\n\t\t\t},\n\n\t\t\t_mixin: function(params){\n\t\t\t\t// mix properties/methods into the instance\n\t\t\t\t// TODO: the intention with tearDown is to put the Setter's state\n\t\t\t\t// back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params)\n\t\t\t\t// so we could do something here to move the original properties aside for later restoration\n\t\t\t\tvar empty = {}, key;\n\t\t\t\tfor(key in params){\n\t\t\t\t\tif(key in empty){ continue; }\n\t\t\t\t\t// TODO: here's our opportunity to mask the properties we don't consider configurable/overridable\n\t\t\t\t\t// .. but history shows we'll almost always guess wrong\n\t\t\t\t\tthis[key] = params[key];\n\t\t\t\t}\n\t\t\t},\n\t\t\t_parse: function(){\n\t\t\t\t// summary:\n\t\t\t\t//\t\truns the dojo parser over the node contents, storing any results in this.parseResults\n\t\t\t\t//\t\tand the parse promise in this.parseDeferred\n\t\t\t\t//\t\tAny errors resulting from parsing are passed to _onError for handling\n\n\t\t\t\tvar rootNode = this.node;\n\t\t\t\ttry{\n\t\t\t\t\t// store the results (widgets, whatever) for potential retrieval\n\t\t\t\t\tvar inherited = {};\n\t\t\t\t\tdarray.forEach([\"dir\", \"lang\", \"textDir\"], function(name){\n\t\t\t\t\t\tif(this[name]){\n\t\t\t\t\t\t\tinherited[name] = this[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this);\n\t\t\t\t\tvar self = this;\n\t\t\t\t\tthis.parseDeferred = parser.parse({\n\t\t\t\t\t\trootNode: rootNode,\n\t\t\t\t\t\tnoStart: !this.startup,\n\t\t\t\t\t\tinherited: inherited,\n\t\t\t\t\t\tscope: this.parserScope\n\t\t\t\t\t}).then(function(results){\n\t\t\t\t\t\t\treturn self.parseResults = results;\n\t\t\t\t\t\t}, function(e){\n\t\t\t\t\t\t\tself._onError('Content', e, \"Error parsing in _ContentSetter#\" + self.id);\n\t\t\t\t\t\t});\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis._onError('Content', e, \"Error parsing in _ContentSetter#\" + this.id);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_onError: function(type, err, consoleText){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tshows user the string that is returned by on[type]Error\n\t\t\t\t//\t\toverride/implement on[type]Error and return your own string to customize\n\t\t\t\tvar errText = this['on' + type + 'Error'].call(this, err);\n\t\t\t\tif(consoleText){\n\t\t\t\t\tconsole.error(consoleText, err);\n\t\t\t\t}else if(errText){ // a empty string won't change current content\n\t\t\t\t\thtml._setNodeContent(this.node, errText, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}), // end declare()\n\n\t\tset: function(/*DomNode*/ node, /*String|DomNode|NodeList*/ cont, /*Object?*/ params){\n\t\t\t// summary:\n\t\t\t//\t\tinserts (replaces) the given content into the given node. dojo/dom-construct.place(cont, node, \"only\")\n\t\t\t//\t\tmay be a better choice for simple HTML insertion.\n\t\t\t// description:\n\t\t\t//\t\tUnless you need to use the params capabilities of this method, you should use\n\t\t\t//\t\tdojo/dom-construct.place(cont, node, \"only\"). dojo/dom-construct..place() has more robust support for injecting\n\t\t\t//\t\tan HTML string into the DOM, but it only handles inserting an HTML string as DOM\n\t\t\t//\t\telements, or inserting a DOM node. dojo/dom-construct..place does not handle NodeList insertions\n\t\t\t//\t\tdojo/dom-construct.place(cont, node, \"only\"). dojo/dom-construct.place() has more robust support for injecting\n\t\t\t//\t\tan HTML string into the DOM, but it only handles inserting an HTML string as DOM\n\t\t\t//\t\telements, or inserting a DOM node. dojo/dom-construct.place does not handle NodeList insertions\n\t\t\t//\t\tor the other capabilities as defined by the params object for this method.\n\t\t\t// node:\n\t\t\t//\t\tthe parent element that will receive the content\n\t\t\t// cont:\n\t\t\t//\t\tthe content to be set on the parent element.\n\t\t\t//\t\tThis can be an html string, a node reference or a NodeList, dojo/NodeList, Array or other enumerable list of nodes\n\t\t\t// params:\n\t\t\t//\t\tOptional flags/properties to configure the content-setting. See dojo/html/_ContentSetter\n\t\t\t// example:\n\t\t\t//\t\tA safe string/node/nodelist content replacement/injection with hooks for extension\n\t\t\t//\t\tExample Usage:\n\t\t\t//\t|\thtml.set(node, \"some string\");\n\t\t\t//\t|\thtml.set(node, contentNode, {options});\n\t\t\t//\t|\thtml.set(node, myNode.childNodes, {options});\n\t\t\tif(undefined == cont){\n\t\t\t\tconsole.warn(\"dojo.html.set: no cont argument provided, using empty string\");\n\t\t\t\tcont = \"\";\n\t\t\t}\n\t\t\tif (typeof cont == 'number'){\n\t\t\t\tcont = cont.toString();\n\t\t\t}\n\t\t\tif(!params){\n\t\t\t\t// simple and fast\n\t\t\t\treturn html._setNodeContent(node, cont, true);\n\t\t\t}else{\n\t\t\t\t// more options but slower\n\t\t\t\t// note the arguments are reversed in order, to match the convention for instantiation via the parser\n\t\t\t\tvar op = new html._ContentSetter(lang.mixin(\n\t\t\t\t\tparams,\n\t\t\t\t\t{ content: cont, node: node }\n\t\t\t\t));\n\t\t\t\treturn op.set();\n\t\t\t}\n\t\t}\n\t};\n\tlang.setObject(\"dojo.html\", html);\n\n\treturn html;\n});\n","define([\n\t\"require\", \"./_base/kernel\", \"./_base/lang\", \"./_base/array\", \"./_base/config\", \"./dom\", \"./_base/window\",\n\t\t\"./_base/url\", \"./aspect\", \"./promise/all\", \"./date/stamp\", \"./Deferred\", \"./has\", \"./query\", \"./on\", \"./ready\"\n], function(require, dojo, dlang, darray, config, dom, dwindow, _Url, aspect, all, dates, Deferred, has, query, don, ready){\n\n\t// module:\n\t//\t\tdojo/parser\n\n\tnew Date(\"X\"); // workaround for #11279, new Date(\"\") == NaN\n\n\t// data-dojo-props etc. is not restricted to JSON, it can be any javascript\n\tfunction myEval(text){\n\t\treturn eval(\"(\" + text + \")\");\n\t}\n\n\t// Widgets like BorderContainer add properties to _Widget via dojo.extend().\n\t// If BorderContainer is loaded after _Widget's parameter list has been cached,\n\t// we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).\n\tvar extendCnt = 0;\n\taspect.after(dlang, \"extend\", function(){\n\t\textendCnt++;\n\t}, true);\n\n\tfunction getNameMap(ctor){\n\t\t// summary:\n\t\t//\t\tReturns map from lowercase name to attribute name in class, ex: {onclick: \"onClick\"}\n\t\tvar map = ctor._nameCaseMap, proto = ctor.prototype;\n\n\t\t// Create the map if it's undefined.\n\t\t// Refresh the map if a superclass was possibly extended with new methods since the map was created.\n\t\tif(!map || map._extendCnt < extendCnt){\n\t\t\tmap = ctor._nameCaseMap = {};\n\t\t\tfor(var name in proto){\n\t\t\t\tif(name.charAt(0) === \"_\"){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\t// skip internal properties\n\t\t\t\tmap[name.toLowerCase()] = name;\n\t\t\t}\n\t\t\tmap._extendCnt = extendCnt;\n\t\t}\n\t\treturn map;\n\t}\n\n\tfunction getCtor(/*String[]*/ types, /*Function?*/ contextRequire){\n\t\t// summary:\n\t\t//\t\tRetrieves a constructor.  If the types array contains more than one class/MID then the\n\t\t//\t\tsubsequent classes will be mixed into the first class and a unique constructor will be\n\t\t//\t\treturned for that array.\n\n\t\tif(!contextRequire){\n\t\t\tcontextRequire = require;\n\t\t}\n\n\t\t// Map from widget name or list of widget names(ex: \"dijit/form/Button,acme/MyMixin\") to a constructor.\n\t\t// Keep separate map for each requireContext to avoid false matches (ex: \"./Foo\" can mean different things\n\t\t// depending on context.)\n\t\tvar ctorMap = contextRequire._dojoParserCtorMap || (contextRequire._dojoParserCtorMap = {});\n\n\t\tvar ts = types.join();\n\t\tif(!ctorMap[ts]){\n\t\t\tvar mixins = [];\n\t\t\tfor(var i = 0, l = types.length; i < l; i++){\n\t\t\t\tvar t = types[i];\n\t\t\t\t// TODO: Consider swapping getObject and require in the future\n\t\t\t\tmixins[mixins.length] = (ctorMap[t] = ctorMap[t] || (dlang.getObject(t) || (~t.indexOf('/') &&\n\t\t\t\t\tcontextRequire(t))));\n\t\t\t}\n\t\t\tvar ctor = mixins.shift();\n\t\t\tctorMap[ts] = mixins.length ? (ctor.createSubclass ? ctor.createSubclass(mixins) : ctor.extend.apply(ctor, mixins)) : ctor;\n\t\t}\n\n\t\treturn ctorMap[ts];\n\t}\n\n\tvar parser = {\n\t\t// summary:\n\t\t//\t\tThe Dom/Widget parsing package\n\n\t\t_clearCache: function(){\n\t\t\t// summary:\n\t\t\t//\t\tClear cached data.   Used mainly for benchmarking.\n\t\t\textendCnt++;\n\t\t\t_ctorMap = {};\n\t\t},\n\n\t\t_functionFromScript: function(script, attrData){\n\t\t\t// summary:\n\t\t\t//\t\tConvert a `<script type=\"dojo/method\" args=\"a, b, c\"> ... </script>`\n\t\t\t//\t\tinto a function\n\t\t\t// script: DOMNode\n\t\t\t//\t\tThe `<script>` DOMNode\n\t\t\t// attrData: String\n\t\t\t//\t\tFor HTML5 compliance, searches for attrData + \"args\" (typically\n\t\t\t//\t\t\"data-dojo-args\") instead of \"args\"\n\t\t\tvar preamble = \"\",\n\t\t\t\tsuffix = \"\",\n\t\t\t\targsStr = (script.getAttribute(attrData + \"args\") || script.getAttribute(\"args\")),\n\t\t\t\twithStr = script.getAttribute(\"with\");\n\n\t\t\t// Convert any arguments supplied in script tag into an array to be passed to the\n\t\t\tvar fnArgs = (argsStr || \"\").split(/\\s*,\\s*/);\n\n\t\t\tif(withStr && withStr.length){\n\t\t\t\tdarray.forEach(withStr.split(/\\s*,\\s*/), function(part){\n\t\t\t\t\tpreamble += \"with(\" + part + \"){\";\n\t\t\t\t\tsuffix += \"}\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn new Function(fnArgs, preamble + script.innerHTML + suffix);\n\t\t},\n\n\t\tinstantiate: function(nodes, mixin, options){\n\t\t\t// summary:\n\t\t\t//\t\tTakes array of nodes, and turns them into class instances and\n\t\t\t//\t\tpotentially calls a startup method to allow them to connect with\n\t\t\t//\t\tany children.\n\t\t\t// nodes: Array\n\t\t\t//\t\tArray of DOM nodes\n\t\t\t// mixin: Object?\n\t\t\t//\t\tAn object that will be mixed in with each node in the array.\n\t\t\t//\t\tValues in the mixin will override values in the node, if they\n\t\t\t//\t\texist.\n\t\t\t// options: Object?\n\t\t\t//\t\tAn object used to hold kwArgs for instantiation.\n\t\t\t//\t\tSee parse.options argument for details.\n\t\t\t// returns:\n\t\t\t//\t\tArray of instances.\n\n\t\t\tmixin = mixin || {};\n\t\t\toptions = options || {};\n\n\t\t\tvar dojoType = (options.scope || dojo._scopeName) + \"Type\", // typically \"dojoType\"\n\t\t\t\tattrData = \"data-\" + (options.scope || dojo._scopeName) + \"-\", // typically \"data-dojo-\"\n\t\t\t\tdataDojoType = attrData + \"type\", // typically \"data-dojo-type\"\n\t\t\t\tdataDojoMixins = attrData + \"mixins\";\t\t\t\t\t// typically \"data-dojo-mixins\"\n\n\t\t\tvar list = [];\n\t\t\tdarray.forEach(nodes, function(node){\n\t\t\t\tvar type = dojoType in mixin ? mixin[dojoType] : node.getAttribute(dataDojoType) || node.getAttribute(dojoType);\n\t\t\t\tif(type){\n\t\t\t\t\tvar mixinsValue = node.getAttribute(dataDojoMixins),\n\t\t\t\t\t\ttypes = mixinsValue ? [type].concat(mixinsValue.split(/\\s*,\\s*/)) : [type];\n\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\ttypes: types\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Instantiate the nodes and return the list of instances.\n\t\t\treturn this._instantiate(list, mixin, options);\n\t\t},\n\n\t\t_instantiate: function(nodes, mixin, options, returnPromise){\n\t\t\t// summary:\n\t\t\t//\t\tTakes array of objects representing nodes, and turns them into class instances and\n\t\t\t//\t\tpotentially calls a startup method to allow them to connect with\n\t\t\t//\t\tany children.\n\t\t\t// nodes: Array\n\t\t\t//\t\tArray of objects like\n\t\t\t//\t|\t\t{\n\t\t\t//\t|\t\t\tctor: Function (may be null)\n\t\t\t//\t|\t\t\ttypes: [\"dijit/form/Button\", \"acme/MyMixin\"] (used if ctor not specified)\n\t\t\t//\t|\t\t\tnode: DOMNode,\n\t\t\t//\t|\t\t\tscripts: [ ... ],\t// array of <script type=\"dojo/...\"> children of node\n\t\t\t//\t|\t\t\tinherited: { ... }\t// settings inherited from ancestors like dir, theme, etc.\n\t\t\t//\t|\t\t}\n\t\t\t// mixin: Object\n\t\t\t//\t\tAn object that will be mixed in with each node in the array.\n\t\t\t//\t\tValues in the mixin will override values in the node, if they\n\t\t\t//\t\texist.\n\t\t\t// options: Object\n\t\t\t//\t\tAn options object used to hold kwArgs for instantiation.\n\t\t\t//\t\tSee parse.options argument for details.\n\t\t\t// returnPromise: Boolean\n\t\t\t//\t\tReturn a Promise rather than the instance; supports asynchronous widget creation.\n\t\t\t// returns:\n\t\t\t//\t\tArray of instances, or if returnPromise is true, a promise for array of instances\n\t\t\t//\t\tthat resolves when instances have finished initializing.\n\n\t\t\t// Call widget constructors.   Some may be asynchronous and return promises.\n\t\t\tvar thelist = darray.map(nodes, function(obj){\n\t\t\t\tvar ctor = obj.ctor || getCtor(obj.types, options.contextRequire);\n\t\t\t\t// If we still haven't resolved a ctor, it is fatal now\n\t\t\t\tif(!ctor){\n\t\t\t\t\tthrow new Error(\"Unable to resolve constructor for: '\" + obj.types.join() + \"'\");\n\t\t\t\t}\n\t\t\t\treturn this.construct(ctor, obj.node, mixin, options, obj.scripts, obj.inherited);\n\t\t\t}, this);\n\n\t\t\t// After all widget construction finishes, call startup on each top level instance if it makes sense (as for\n\t\t\t// widgets).  Parent widgets will recursively call startup on their (non-top level) children\n\t\t\tfunction onConstruct(thelist){\n\t\t\t\tif(!mixin._started && !options.noStart){\n\t\t\t\t\tdarray.forEach(thelist, function(instance){\n\t\t\t\t\t\tif(typeof instance.startup === \"function\" && !instance._started){\n\t\t\t\t\t\t\tinstance.startup();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn thelist;\n\t\t\t}\n\n\t\t\tif(returnPromise){\n\t\t\t\treturn all(thelist).then(onConstruct);\n\t\t\t}else{\n\t\t\t\t// Back-compat path, remove for 2.0\n\t\t\t\treturn onConstruct(thelist);\n\t\t\t}\n\t\t},\n\n\t\tconstruct: function(ctor, node, mixin, options, scripts, inherited){\n\t\t\t// summary:\n\t\t\t//\t\tCalls new ctor(params, node), where params is the hash of parameters specified on the node,\n\t\t\t//\t\texcluding data-dojo-type and data-dojo-mixins.   Does not call startup().\n\t\t\t// ctor: Function\n\t\t\t//\t\tWidget constructor.\n\t\t\t// node: DOMNode\n\t\t\t//\t\tThis node will be replaced/attached to by the widget.  It also specifies the arguments to pass to ctor.\n\t\t\t// mixin: Object?\n\t\t\t//\t\tAttributes in this object will be passed as parameters to ctor,\n\t\t\t//\t\toverriding attributes specified on the node.\n\t\t\t// options: Object?\n\t\t\t//\t\tAn options object used to hold kwArgs for instantiation.   See parse.options argument for details.\n\t\t\t// scripts: DomNode[]?\n\t\t\t//\t\tArray of `<script type=\"dojo/*\">` DOMNodes.  If not specified, will search for `<script>` tags inside node.\n\t\t\t// inherited: Object?\n\t\t\t//\t\tSettings from dir=rtl or lang=... on a node above this node.   Overrides options.inherited.\n\t\t\t// returns:\n\t\t\t//\t\tInstance or Promise for the instance, if markupFactory() itself returned a promise\n\n\t\t\tvar proto = ctor && ctor.prototype;\n\t\t\toptions = options || {};\n\n\t\t\t// Setup hash to hold parameter settings for this widget.\tStart with the parameter\n\t\t\t// settings inherited from ancestors (\"dir\" and \"lang\").\n\t\t\t// Inherited setting may later be overridden by explicit settings on node itself.\n\t\t\tvar params = {};\n\n\t\t\tif(options.defaults){\n\t\t\t\t// settings for the document itself (or whatever subtree is being parsed)\n\t\t\t\tdlang.mixin(params, options.defaults);\n\t\t\t}\n\t\t\tif(inherited){\n\t\t\t\t// settings from dir=rtl or lang=... on a node above this node\n\t\t\t\tdlang.mixin(params, inherited);\n\t\t\t}\n\n\t\t\t// Get list of attributes explicitly listed in the markup\n\t\t\tvar attributes;\n\t\t\tif(has(\"dom-attributes-explicit\")){\n\t\t\t\t// Standard path to get list of user specified attributes\n\t\t\t\tattributes = node.attributes;\n\t\t\t}else if(has(\"dom-attributes-specified-flag\")){\n\t\t\t\t// Special processing needed for IE8, to skip a few faux values in attributes[]\n\t\t\t\tattributes = darray.filter(node.attributes, function(a){\n\t\t\t\t\treturn a.specified;\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t\t// Special path for IE6-7, avoid (sometimes >100) bogus entries in node.attributes\n\t\t\t\tvar clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false),\n\t\t\t\t\tattrs = clone.outerHTML.replace(/=[^\\s\"']+|=\"[^\"]*\"|='[^']*'/g, \"\").replace(/^\\s*<[a-zA-Z0-9]*\\s*/, \"\").replace(/\\s*>.*$/, \"\");\n\n\t\t\t\tattributes = darray.map(attrs.split(/\\s+/), function(name){\n\t\t\t\t\tvar lcName = name.toLowerCase();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\t// getAttribute() doesn't work for button.value, returns innerHTML of button.\n\t\t\t\t\t\t// but getAttributeNode().value doesn't work for the form.encType or li.value\n\t\t\t\t\t\tvalue: (node.nodeName == \"LI\" && name == \"value\") || lcName == \"enctype\" ?\n\t\t\t\t\t\t\tnode.getAttribute(lcName) : node.getAttributeNode(lcName).value\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Hash to convert scoped attribute name (ex: data-dojo17-params) to something friendly (ex: data-dojo-params)\n\t\t\t// TODO: remove scope for 2.0\n\t\t\tvar scope = options.scope || dojo._scopeName,\n\t\t\t\tattrData = \"data-\" + scope + \"-\", // typically \"data-dojo-\"\n\t\t\t\thash = {};\n\t\t\tif(scope !== \"dojo\"){\n\t\t\t\thash[attrData + \"props\"] = \"data-dojo-props\";\n\t\t\t\thash[attrData + \"type\"] = \"data-dojo-type\";\n\t\t\t\thash[attrData + \"mixins\"] = \"data-dojo-mixins\";\n\t\t\t\thash[scope + \"type\"] = \"dojotype\";\n\t\t\t\thash[attrData + \"id\"] = \"data-dojo-id\";\n\t\t\t}\n\n\t\t\t// Read in attributes and process them, including data-dojo-props, data-dojo-type,\n\t\t\t// dojoAttachPoint, etc., as well as normal foo=bar attributes.\n\t\t\tvar i = 0, item, funcAttrs = [], jsname, extra;\n\t\t\twhile(item = attributes[i++]){\n\t\t\t\tvar name = item.name,\n\t\t\t\t\tlcName = name.toLowerCase(),\n\t\t\t\t\tvalue = item.value;\n\n\t\t\t\tswitch(hash[lcName] || lcName){\n\t\t\t\t// Already processed, just ignore\n\t\t\t\tcase \"data-dojo-type\":\n\t\t\t\tcase \"dojotype\":\n\t\t\t\tcase \"data-dojo-mixins\":\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Data-dojo-props.   Save for later to make sure it overrides direct foo=bar settings\n\t\t\t\tcase \"data-dojo-props\":\n\t\t\t\t\textra = value;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// data-dojo-id or jsId. TODO: drop jsId in 2.0\n\t\t\t\tcase \"data-dojo-id\":\n\t\t\t\tcase \"jsid\":\n\t\t\t\t\tjsname = value;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// For the benefit of _Templated\n\t\t\t\tcase \"data-dojo-attach-point\":\n\t\t\t\tcase \"dojoattachpoint\":\n\t\t\t\t\tparams.dojoAttachPoint = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"data-dojo-attach-event\":\n\t\t\t\tcase \"dojoattachevent\":\n\t\t\t\t\tparams.dojoAttachEvent = value;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Special parameter handling needed for IE\n\t\t\t\tcase \"class\":\n\t\t\t\t\tparams[\"class\"] = node.className;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"style\":\n\t\t\t\t\tparams[\"style\"] = node.style && node.style.cssText;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// Normal attribute, ex: value=\"123\"\n\n\t\t\t\t\t// Find attribute in widget corresponding to specified name.\n\t\t\t\t\t// May involve case conversion, ex: onclick --> onClick\n\t\t\t\t\tif(!(name in proto)){\n\t\t\t\t\t\tvar map = getNameMap(ctor);\n\t\t\t\t\t\tname = map[lcName] || name;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set params[name] to value, doing type conversion\n\t\t\t\t\tif(name in proto){\n\t\t\t\t\t\tswitch(typeof proto[name]){\n\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\tparams[name] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\tparams[name] = value.length ? Number(value) : NaN;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\t\t// for checked/disabled value might be \"\" or \"checked\".\t interpret as true.\n\t\t\t\t\t\t\tparams[name] = value.toLowerCase() != \"false\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\t\tif(value === \"\" || value.search(/[^\\w\\.]+/i) != -1){\n\t\t\t\t\t\t\t\t// The user has specified some text for a function like \"return x+5\"\n\t\t\t\t\t\t\t\tparams[name] = new Function(value);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t// The user has specified the name of a global function like \"myOnClick\"\n\t\t\t\t\t\t\t\t// or a single word function \"return\"\n\t\t\t\t\t\t\t\tparams[name] = dlang.getObject(value, false) || new Function(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfuncAttrs.push(name);\t// prevent \"double connect\", see #15026\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tvar pVal = proto[name];\n\t\t\t\t\t\t\tparams[name] =\n\t\t\t\t\t\t\t\t(pVal && \"length\" in pVal) ? (value ? value.split(/\\s*,\\s*/) : []) :\t// array\n\t\t\t\t\t\t\t\t\t(pVal instanceof Date) ?\n\t\t\t\t\t\t\t\t\t\t(value == \"\" ? new Date(\"\") :\t// the NaN of dates\n\t\t\t\t\t\t\t\t\t\tvalue == \"now\" ? new Date() :\t// current date\n\t\t\t\t\t\t\t\t\t\tdates.fromISOString(value)) :\n\t\t\t\t\t\t\t\t(pVal instanceof _Url) ? (dojo.baseUrl + value) :\n\t\t\t\t\t\t\t\tmyEval(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tparams[name] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove function attributes from DOMNode to prevent \"double connect\" problem, see #15026.\n\t\t\t// Do this as a separate loop since attributes[] is often a live collection (depends on the browser though).\n\t\t\tfor(var j = 0; j < funcAttrs.length; j++){\n\t\t\t\tvar lcfname = funcAttrs[j].toLowerCase();\n\t\t\t\tnode.removeAttribute(lcfname);\n\t\t\t\tnode[lcfname] = null;\n\t\t\t}\n\n\t\t\t// Mix things found in data-dojo-props into the params, overriding any direct settings\n\t\t\tif(extra){\n\t\t\t\ttry{\n\t\t\t\t\textra = myEval.call(options.propsThis, \"{\" + extra + \"}\");\n\t\t\t\t\tdlang.mixin(params, extra);\n\t\t\t\t}catch(e){\n\t\t\t\t\t// give the user a pointer to their invalid parameters. FIXME: can we kill this in production?\n\t\t\t\t\tthrow new Error(e.toString() + \" in data-dojo-props='\" + extra + \"'\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Any parameters specified in \"mixin\" override everything else.\n\t\t\tdlang.mixin(params, mixin);\n\n\t\t\t// Get <script> nodes associated with this widget, if they weren't specified explicitly\n\t\t\tif(!scripts){\n\t\t\t\tscripts = (ctor && (ctor._noScript || proto._noScript) ? [] : query(\"> script[type^='dojo/']\", node));\n\t\t\t}\n\n\t\t\t// Process <script type=\"dojo/*\"> script tags\n\t\t\t// <script type=\"dojo/method\" data-dojo-event=\"foo\"> tags are added to params, and passed to\n\t\t\t// the widget on instantiation.\n\t\t\t// <script type=\"dojo/method\"> tags (with no event) are executed after instantiation\n\t\t\t// <script type=\"dojo/connect\" data-dojo-event=\"foo\"> tags are dojo.connected after instantiation,\n\t\t\t// and likewise with <script type=\"dojo/aspect\" data-dojo-method=\"foo\">\n\t\t\t// <script type=\"dojo/watch\" data-dojo-prop=\"foo\"> tags are dojo.watch after instantiation\n\t\t\t// <script type=\"dojo/on\" data-dojo-event=\"foo\"> tags are dojo.on after instantiation\n\t\t\t// note: dojo/* script tags cannot exist in self closing widgets, like <input />\n\t\t\tvar aspects = [],\t// aspects to connect after instantiation\n\t\t\t\tcalls = [],\t\t// functions to call after instantiation\n\t\t\t\twatches = [],  // functions to watch after instantiation\n\t\t\t\tons = []; // functions to on after instantiation\n\n\t\t\tif(scripts){\n\t\t\t\tfor(i = 0; i < scripts.length; i++){\n\t\t\t\t\tvar script = scripts[i];\n\t\t\t\t\tnode.removeChild(script);\n\t\t\t\t\t// FIXME: drop event=\"\" support in 2.0. use data-dojo-event=\"\" instead\n\t\t\t\t\tvar event = (script.getAttribute(attrData + \"event\") || script.getAttribute(\"event\")),\n\t\t\t\t\t\tprop = script.getAttribute(attrData + \"prop\"),\n\t\t\t\t\t\tmethod = script.getAttribute(attrData + \"method\"),\n\t\t\t\t\t\tadvice = script.getAttribute(attrData + \"advice\"),\n\t\t\t\t\t\tscriptType = script.getAttribute(\"type\"),\n\t\t\t\t\t\tnf = this._functionFromScript(script, attrData);\n\t\t\t\t\tif(event){\n\t\t\t\t\t\tif(scriptType == \"dojo/connect\"){\n\t\t\t\t\t\t\taspects.push({ method: event, func: nf });\n\t\t\t\t\t\t}else if(scriptType == \"dojo/on\"){\n\t\t\t\t\t\t\tons.push({ event: event, func: nf });\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// <script type=\"dojo/method\" data-dojo-event=\"foo\">\n\t\t\t\t\t\t\t// TODO for 2.0: use data-dojo-method=\"foo\" instead (also affects dijit/Declaration)\n\t\t\t\t\t\t\tparams[event] = nf;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(scriptType == \"dojo/aspect\"){\n\t\t\t\t\t\taspects.push({ method: method, advice: advice, func: nf });\n\t\t\t\t\t}else if(scriptType == \"dojo/watch\"){\n\t\t\t\t\t\twatches.push({ prop: prop, func: nf });\n\t\t\t\t\t}else{\n\t\t\t\t\t\tcalls.push(nf);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// create the instance\n\t\t\tvar markupFactory = ctor.markupFactory || proto.markupFactory;\n\t\t\tvar instance = markupFactory ? markupFactory(params, node, ctor) : new ctor(params, node);\n\n\t\t\tfunction onInstantiate(instance){\n\t\t\t\t// map it to the JS namespace if that makes sense\n\t\t\t\tif(jsname){\n\t\t\t\t\tdlang.setObject(jsname, instance);\n\t\t\t\t}\n\n\t\t\t\t// process connections and startup functions\n\t\t\t\tfor(i = 0; i < aspects.length; i++){\n\t\t\t\t\taspect[aspects[i].advice || \"after\"](instance, aspects[i].method, dlang.hitch(instance, aspects[i].func), true);\n\t\t\t\t}\n\t\t\t\tfor(i = 0; i < calls.length; i++){\n\t\t\t\t\tcalls[i].call(instance);\n\t\t\t\t}\n\t\t\t\tfor(i = 0; i < watches.length; i++){\n\t\t\t\t\tinstance.watch(watches[i].prop, watches[i].func);\n\t\t\t\t}\n\t\t\t\tfor(i = 0; i < ons.length; i++){\n\t\t\t\t\tdon(instance, ons[i].event, ons[i].func);\n\t\t\t\t}\n\n\t\t\t\treturn instance;\n\t\t\t}\n\n\t\t\tif(instance.then){\n\t\t\t\treturn instance.then(onInstantiate);\n\t\t\t}else{\n\t\t\t\treturn onInstantiate(instance);\n\t\t\t}\n\t\t},\n\n\t\tscan: function(root, options){\n\t\t\t// summary:\n\t\t\t//\t\tScan a DOM tree and return an array of objects representing the DOMNodes\n\t\t\t//\t\tthat need to be turned into widgets.\n\t\t\t// description:\n\t\t\t//\t\tSearch specified node (or document root node) recursively for class instances\n\t\t\t//\t\tand return an array of objects that represent potential widgets to be\n\t\t\t//\t\tinstantiated. Searches for either data-dojo-type=\"MID\" or dojoType=\"MID\" where\n\t\t\t//\t\t\"MID\" is a module ID like \"dijit/form/Button\" or a fully qualified Class name\n\t\t\t//\t\tlike \"dijit/form/Button\".  If the MID is not currently available, scan will\n\t\t\t//\t\tattempt to require() in the module.\n\t\t\t//\n\t\t\t//\t\tSee parser.parse() for details of markup.\n\t\t\t// root: DomNode?\n\t\t\t//\t\tA default starting root node from which to start the parsing. Can be\n\t\t\t//\t\tomitted, defaulting to the entire document. If omitted, the `options`\n\t\t\t//\t\tobject can be passed in this place. If the `options` object has a\n\t\t\t//\t\t`rootNode` member, that is used.\n\t\t\t// options: Object\n\t\t\t//\t\ta kwArgs options object, see parse() for details\n\t\t\t//\n\t\t\t// returns: Promise\n\t\t\t//\t\tA promise that is resolved with the nodes that have been parsed.\n\n\t\t\tvar list = [], // Output List\n\t\t\t\tmids = [], // An array of modules that are not yet loaded\n\t\t\t\tmidsHash = {}; // Used to keep the mids array unique\n\n\t\t\tvar dojoType = (options.scope || dojo._scopeName) + \"Type\", // typically \"dojoType\"\n\t\t\t\tattrData = \"data-\" + (options.scope || dojo._scopeName) + \"-\", // typically \"data-dojo-\"\n\t\t\t\tdataDojoType = attrData + \"type\", // typically \"data-dojo-type\"\n\t\t\t\tdataDojoTextDir = attrData + \"textdir\", // typically \"data-dojo-textdir\"\n\t\t\t\tdataDojoMixins = attrData + \"mixins\";\t\t\t\t\t// typically \"data-dojo-mixins\"\n\n\t\t\t// Info on DOMNode currently being processed\n\t\t\tvar node = root.firstChild;\n\n\t\t\t// Info on parent of DOMNode currently being processed\n\t\t\t//\t- inherited: dir, lang, and textDir setting of parent, or inherited by parent\n\t\t\t//\t- parent: pointer to identical structure for my parent (or null if no parent)\n\t\t\t//\t- scripts: if specified, collects <script type=\"dojo/...\"> type nodes from children\n\t\t\tvar inherited = options.inherited;\n\t\t\tif(!inherited){\n\t\t\t\tfunction findAncestorAttr(node, attr){\n\t\t\t\t\treturn (node.getAttribute && node.getAttribute(attr)) ||\n\t\t\t\t\t\t(node.parentNode && findAncestorAttr(node.parentNode, attr));\n\t\t\t\t}\n\n\t\t\t\tinherited = {\n\t\t\t\t\tdir: findAncestorAttr(root, \"dir\"),\n\t\t\t\t\tlang: findAncestorAttr(root, \"lang\"),\n\t\t\t\t\ttextDir: findAncestorAttr(root, dataDojoTextDir)\n\t\t\t\t};\n\t\t\t\tfor(var key in inherited){\n\t\t\t\t\tif(!inherited[key]){\n\t\t\t\t\t\tdelete inherited[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Metadata about parent node\n\t\t\tvar parent = {\n\t\t\t\tinherited: inherited\n\t\t\t};\n\n\t\t\t// For collecting <script type=\"dojo/...\"> type nodes (when null, we don't need to collect)\n\t\t\tvar scripts;\n\n\t\t\t// when true, only look for <script type=\"dojo/...\"> tags, and don't recurse to children\n\t\t\tvar scriptsOnly;\n\n\t\t\tfunction getEffective(parent){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tGet effective dir, lang, textDir settings for specified obj\n\t\t\t\t//\t\t(matching \"parent\" object structure above), and do caching.\n\t\t\t\t//\t\tTake care not to return null entries.\n\t\t\t\tif(!parent.inherited){\n\t\t\t\t\tparent.inherited = {};\n\t\t\t\t\tvar node = parent.node,\n\t\t\t\t\t\tgrandparent = getEffective(parent.parent);\n\t\t\t\t\tvar inherited = {\n\t\t\t\t\t\tdir: node.getAttribute(\"dir\") || grandparent.dir,\n\t\t\t\t\t\tlang: node.getAttribute(\"lang\") || grandparent.lang,\n\t\t\t\t\t\ttextDir: node.getAttribute(dataDojoTextDir) || grandparent.textDir\n\t\t\t\t\t};\n\t\t\t\t\tfor(var key in inherited){\n\t\t\t\t\t\tif(inherited[key]){\n\t\t\t\t\t\t\tparent.inherited[key] = inherited[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn parent.inherited;\n\t\t\t}\n\n\t\t\t// DFS on DOM tree, collecting nodes with data-dojo-type specified.\n\t\t\twhile(true){\n\t\t\t\tif(!node){\n\t\t\t\t\t// Finished this level, continue to parent's next sibling\n\t\t\t\t\tif(!parent || !parent.node){\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tnode = parent.node.nextSibling;\n\t\t\t\t\tscriptsOnly = false;\n\t\t\t\t\tparent = parent.parent;\n\t\t\t\t\tscripts = parent.scripts;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif(node.nodeType != 1){\n\t\t\t\t\t// Text or comment node, skip to next sibling\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif(scripts && node.nodeName.toLowerCase() == \"script\"){\n\t\t\t\t\t// Save <script type=\"dojo/...\"> for parent, then continue to next sibling\n\t\t\t\t\ttype = node.getAttribute(\"type\");\n\t\t\t\t\tif(type && /^dojo\\/\\w/i.test(type)){\n\t\t\t\t\t\tscripts.push(node);\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(scriptsOnly){\n\t\t\t\t\t// scriptsOnly flag is set, we have already collected scripts if the parent wants them, so now we shouldn't\n\t\t\t\t\t// continue further analysis of the node and will continue to the next sibling\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Check for data-dojo-type attribute, fallback to backward compatible dojoType\n\t\t\t\t// TODO: Remove dojoType in 2.0\n\t\t\t\tvar type = node.getAttribute(dataDojoType) || node.getAttribute(dojoType);\n\n\t\t\t\t// Short circuit for leaf nodes containing nothing [but text]\n\t\t\t\tvar firstChild = node.firstChild;\n\t\t\t\tif(!type && (!firstChild || (firstChild.nodeType == 3 && !firstChild.nextSibling))){\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Meta data about current node\n\t\t\t\tvar current;\n\n\t\t\t\tvar ctor = null;\n\t\t\t\tif(type){\n\t\t\t\t\t// If dojoType/data-dojo-type specified, add to output array of nodes to instantiate.\n\t\t\t\t\tvar mixinsValue = node.getAttribute(dataDojoMixins),\n\t\t\t\t\t\ttypes = mixinsValue ? [type].concat(mixinsValue.split(/\\s*,\\s*/)) : [type];\n\n\t\t\t\t\t// Note: won't find classes declared via dojo/Declaration or any modules that haven't been\n\t\t\t\t\t// loaded yet so use try/catch to avoid throw from require()\n\t\t\t\t\ttry{\n\t\t\t\t\t\tctor = getCtor(types, options.contextRequire);\n\t\t\t\t\t}catch(e){}\n\n\t\t\t\t\t// If the constructor was not found, check to see if it has modules that can be loaded\n\t\t\t\t\tif(!ctor){\n\t\t\t\t\t\tdarray.forEach(types, function(t){\n\t\t\t\t\t\t\tif(~t.indexOf('/') && !midsHash[t]){\n\t\t\t\t\t\t\t\t// If the type looks like a MID and it currently isn't in the array of MIDs to load, add it.\n\t\t\t\t\t\t\t\tmidsHash[t] = true;\n\t\t\t\t\t\t\t\tmids[mids.length] = t;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tvar childScripts = ctor && !ctor.prototype._noScript ? [] : null; // <script> nodes that are parent's children\n\n\t\t\t\t\t// Setup meta data about this widget node, and save it to list of nodes to instantiate\n\t\t\t\t\tcurrent = {\n\t\t\t\t\t\ttypes: types,\n\t\t\t\t\t\tctor: ctor,\n\t\t\t\t\t\tparent: parent,\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\tscripts: childScripts\n\t\t\t\t\t};\n\t\t\t\t\tcurrent.inherited = getEffective(current); // dir & lang settings for current node, explicit or inherited\n\t\t\t\t\tlist.push(current);\n\t\t\t\t}else{\n\t\t\t\t\t// Meta data about this non-widget node\n\t\t\t\t\tcurrent = {\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\tscripts: scripts,\n\t\t\t\t\t\tparent: parent\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Recurse, collecting <script type=\"dojo/...\"> children, and also looking for\n\t\t\t\t// descendant nodes with dojoType specified (unless the widget has the stopParser flag).\n\t\t\t\t// When finished with children, go to my next sibling.\n\t\t\t\tscripts = childScripts;\n\t\t\t\tscriptsOnly = node.stopParser || (ctor && ctor.prototype.stopParser && !(options.template));\n\t\t\t\tparent = current;\n\t\t\t\tnode = firstChild;\n\t\t\t}\n\n\t\t\tvar d = new Deferred();\n\n\t\t\t// If there are modules to load then require them in\n\t\t\tif(mids.length){\n\t\t\t\t// Warn that there are modules being auto-required\n\t\t\t\tif(has(\"dojo-debug-messages\")){\n\t\t\t\t\tconsole.warn(\"WARNING: Modules being Auto-Required: \" + mids.join(\", \"));\n\t\t\t\t}\n\t\t\t\tvar r = options.contextRequire || require;\n\t\t\t\tr(mids, function(){\n\t\t\t\t\t// Go through list of widget nodes, filling in missing constructors, and filtering out nodes that shouldn't\n\t\t\t\t\t// be instantiated due to a stopParser flag on an ancestor that we belatedly learned about due to\n\t\t\t\t\t// auto-require of a module like ContentPane.   Assumes list is in DFS order.\n\t\t\t\t\td.resolve(darray.filter(list, function(widget){\n\t\t\t\t\t\tif(!widget.ctor){\n\t\t\t\t\t\t\t// Attempt to find the constructor again.   Still won't find classes defined via\n\t\t\t\t\t\t\t// dijit/Declaration so need to try/catch.\n\t\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\t\twidget.ctor = getCtor(widget.types, options.contextRequire);\n\t\t\t\t\t\t\t}catch(e){}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get the parent widget\n\t\t\t\t\t\tvar parent = widget.parent;\n\t\t\t\t\t\twhile(parent && !parent.types){\n\t\t\t\t\t\t\tparent = parent.parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Return false if this node should be skipped due to stopParser on an ancestor.\n\t\t\t\t\t\t// Since list[] is in DFS order, this loop will always set parent.instantiateChildren before\n\t\t\t\t\t\t// trying to compute widget.instantiate.\n\t\t\t\t\t\tvar proto = widget.ctor && widget.ctor.prototype;\n\t\t\t\t\t\twidget.instantiateChildren = !(proto && proto.stopParser && !(options.template));\n\t\t\t\t\t\twidget.instantiate = !parent || (parent.instantiate && parent.instantiateChildren);\n\t\t\t\t\t\treturn widget.instantiate;\n\t\t\t\t\t}));\n\t\t\t\t});\n\t\t\t}else{\n\t\t\t\t// There were no modules to load, so just resolve with the parsed nodes.   This separate code path is for\n\t\t\t\t// efficiency, to avoid running the require() and the callback code above.\n\t\t\t\td.resolve(list);\n\t\t\t}\n\n\t\t\t// Return the promise\n\t\t\treturn d.promise;\n\t\t},\n\n\t\t_require: function(/*DOMNode*/ script, /*Object?*/ options){\n\t\t\t// summary:\n\t\t\t//\t\tHelper for _scanAMD().  Takes a `<script type=dojo/require>bar: \"acme/bar\", ...</script>` node,\n\t\t\t//\t\tcalls require() to load the specified modules and (asynchronously) assign them to the specified global\n\t\t\t//\t\tvariables, and returns a Promise for when that operation completes.\n\t\t\t//\n\t\t\t//\t\tIn the example above, it is effectively doing a require([\"acme/bar\", ...], function(a){ bar = a; }).\n\n\t\t\tvar hash = myEval(\"{\" + script.innerHTML + \"}\"), // can't use dojo/json::parse() because maybe no quotes\n\t\t\t\tvars = [],\n\t\t\t\tmids = [],\n\t\t\t\td = new Deferred();\n\n\t\t\tvar contextRequire = (options && options.contextRequire) || require;\n\n\t\t\tfor(var name in hash){\n\t\t\t\tvars.push(name);\n\t\t\t\tmids.push(hash[name]);\n\t\t\t}\n\n\t\t\tcontextRequire(mids, function(){\n\t\t\t\tfor(var i = 0; i < vars.length; i++){\n\t\t\t\t\tdlang.setObject(vars[i], arguments[i]);\n\t\t\t\t}\n\t\t\t\td.resolve(arguments);\n\t\t\t});\n\n\t\t\treturn d.promise;\n\t\t},\n\n\t\t_scanAmd: function(root, options){\n\t\t\t// summary:\n\t\t\t//\t\tScans the DOM for any declarative requires and returns their values.\n\t\t\t// description:\n\t\t\t//\t\tLooks for `<script type=dojo/require>bar: \"acme/bar\", ...</script>` node, calls require() to load the\n\t\t\t//\t\tspecified modules and (asynchronously) assign them to the specified global variables,\n\t\t\t//\t\tand returns a Promise for when those operations complete.\n\t\t\t// root: DomNode\n\t\t\t//\t\tThe node to base the scan from.\n\t\t\t// options: Object?\n\t\t\t//\t\ta kwArgs options object, see parse() for details\n\n\t\t\t// Promise that resolves when all the <script type=dojo/require> nodes have finished loading.\n\t\t\tvar deferred = new Deferred(),\n\t\t\t\tpromise = deferred.promise;\n\t\t\tdeferred.resolve(true);\n\n\t\t\tvar self = this;\n\t\t\tquery(\"script[type='dojo/require']\", root).forEach(function(node){\n\t\t\t\t// Fire off require() call for specified modules.  Chain this require to fire after\n\t\t\t\t// any previous requires complete, so that layers can be loaded before individual module require()'s fire.\n\t\t\t\tpromise = promise.then(function(){\n\t\t\t\t\treturn self._require(node, options);\n\t\t\t\t});\n\n\t\t\t\t// Remove from DOM so it isn't seen again\n\t\t\t\tnode.parentNode.removeChild(node);\n\t\t\t});\n\n\t\t\treturn promise;\n\t\t},\n\n\t\tparse: function(rootNode, options){\n\t\t\t// summary:\n\t\t\t//\t\tScan the DOM for class instances, and instantiate them.\n\t\t\t// description:\n\t\t\t//\t\tSearch specified node (or root node) recursively for class instances,\n\t\t\t//\t\tand instantiate them. Searches for either data-dojo-type=\"Class\" or\n\t\t\t//\t\tdojoType=\"Class\" where \"Class\" is a a fully qualified class name,\n\t\t\t//\t\tlike `dijit/form/Button`\n\t\t\t//\n\t\t\t//\t\tUsing `data-dojo-type`:\n\t\t\t//\t\tAttributes using can be mixed into the parameters used to instantiate the\n\t\t\t//\t\tClass by using a `data-dojo-props` attribute on the node being converted.\n\t\t\t//\t\t`data-dojo-props` should be a string attribute to be converted from JSON.\n\t\t\t//\n\t\t\t//\t\tUsing `dojoType`:\n\t\t\t//\t\tAttributes are read from the original domNode and converted to appropriate\n\t\t\t//\t\ttypes by looking up the Class prototype values. This is the default behavior\n\t\t\t//\t\tfrom Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will\n\t\t\t//\t\tgo away in Dojo 2.0.\n\t\t\t// rootNode: DomNode?\n\t\t\t//\t\tA default starting root node from which to start the parsing. Can be\n\t\t\t//\t\tomitted, defaulting to the entire document. If omitted, the `options`\n\t\t\t//\t\tobject can be passed in this place. If the `options` object has a\n\t\t\t//\t\t`rootNode` member, that is used.\n\t\t\t// options: Object?\n\t\t\t//\t\tA hash of options.\n\t\t\t//\n\t\t\t//\t\t- noStart: Boolean?:\n\t\t\t//\t\t\twhen set will prevent the parser from calling .startup()\n\t\t\t//\t\t\twhen locating the nodes.\n\t\t\t//\t\t- rootNode: DomNode?:\n\t\t\t//\t\t\tidentical to the function's `rootNode` argument, though\n\t\t\t//\t\t\tallowed to be passed in via this `options object.\n\t\t\t//\t\t- template: Boolean:\n\t\t\t//\t\t\tIf true, ignores ContentPane's stopParser flag and parses contents inside of\n\t\t\t//\t\t\ta ContentPane inside of a template.   This allows dojoAttachPoint on widgets/nodes\n\t\t\t//\t\t\tnested inside the ContentPane to work.\n\t\t\t//\t\t- inherited: Object:\n\t\t\t//\t\t\tHash possibly containing dir and lang settings to be applied to\n\t\t\t//\t\t\tparsed widgets, unless there's another setting on a sub-node that overrides\n\t\t\t//\t\t- scope: String:\n\t\t\t//\t\t\tRoot for attribute names to search for.   If scopeName is dojo,\n\t\t\t//\t\t\twill search for data-dojo-type (or dojoType).   For backwards compatibility\n\t\t\t//\t\t\treasons defaults to dojo._scopeName (which is \"dojo\" except when\n\t\t\t//\t\t\tmulti-version support is used, when it will be something like dojo16, dojo20, etc.)\n\t\t\t//\t\t- propsThis: Object:\n\t\t\t//\t\t\tIf specified, \"this\" referenced from data-dojo-props will refer to propsThis.\n\t\t\t//\t\t\tIntended for use from the widgets-in-template feature of `dijit._WidgetsInTemplateMixin`\n\t\t\t//\t\t- contextRequire: Function:\n\t\t\t//\t\t\tIf specified, this require is utilised for looking resolving modules instead of the\n\t\t\t//\t\t\t`dojo/parser` context `require()`.  Intended for use from the widgets-in-template feature of\n\t\t\t//\t\t\t`dijit._WidgetsInTemplateMixin`.\n\t\t\t// returns: Mixed\n\t\t\t//\t\tReturns a blended object that is an array of the instantiated objects, but also can include\n\t\t\t//\t\ta promise that is resolved with the instantiated objects.  This is done for backwards\n\t\t\t//\t\tcompatibility.  If the parser auto-requires modules, it will always behave in a promise\n\t\t\t//\t\tfashion and `parser.parse().then(function(instances){...})` should be used.\n\t\t\t// example:\n\t\t\t//\t\tParse all widgets on a page:\n\t\t\t//\t|\t\tparser.parse();\n\t\t\t// example:\n\t\t\t//\t\tParse all classes within the node with id=\"foo\"\n\t\t\t//\t|\t\tparser.parse(dojo.byId('foo'));\n\t\t\t// example:\n\t\t\t//\t\tParse all classes in a page, but do not call .startup() on any\n\t\t\t//\t\tchild\n\t\t\t//\t|\t\tparser.parse({ noStart: true })\n\t\t\t// example:\n\t\t\t//\t\tParse all classes in a node, but do not call .startup()\n\t\t\t//\t|\t\tparser.parse(someNode, { noStart:true });\n\t\t\t//\t|\t\t// or\n\t\t\t//\t|\t\tparser.parse({ noStart:true, rootNode: someNode });\n\n\t\t\t// determine the root node and options based on the passed arguments.\n\t\t\tif(rootNode && typeof rootNode != \"string\" && !(\"nodeType\" in rootNode)){\n\t\t\t\t// If called as parse(options) rather than parse(), parse(rootNode), or parse(rootNode, options)...\n\t\t\t\toptions = rootNode;\n\t\t\t\trootNode = options.rootNode;\n\t\t\t}\n\t\t\tvar root = rootNode ? dom.byId(rootNode) : dwindow.body();\n\t\t\toptions = options || {};\n\n\t\t\tvar mixin = options.template ? { template: true } : {},\n\t\t\t\tinstances = [],\n\t\t\t\tself = this;\n\n\t\t\t// First scan for any <script type=dojo/require> nodes, and execute.\n\t\t\t// Then scan for all nodes with data-dojo-type, and load any unloaded modules.\n\t\t\t// Then build the object instances.  Add instances to already existing (but empty) instances[] array,\n\t\t\t// which may already have been returned to caller.  Also, use otherwise to collect and throw any errors\n\t\t\t// that occur during the parse().\n\t\t\tvar p =\n\t\t\t\tthis._scanAmd(root, options).then(function(){\n\t\t\t\t\treturn self.scan(root, options);\n\t\t\t\t}).then(function(parsedNodes){\n\t\t\t\t\treturn self._instantiate(parsedNodes, mixin, options, true);\n\t\t\t\t}).then(function(_instances){\n\t\t\t\t\t// Copy the instances into the instances[] array we declared above, and are accessing as\n\t\t\t\t\t// our return value.\n\t\t\t\t\treturn instances = instances.concat(_instances);\n\t\t\t\t}).otherwise(function(e){\n\t\t\t\t\t// TODO Modify to follow better pattern for promise error management when available\n\t\t\t\t\tconsole.error(\"dojo/parser::parse() error\", e);\n\t\t\t\t\tthrow e;\n\t\t\t\t});\n\n\t\t\t// Blend the array with the promise\n\t\t\tdlang.mixin(instances, p);\n\t\t\treturn instances;\n\t\t}\n\t};\n\n\tif(has(\"extend-dojo\")){\n\t\tdojo.parser = parser;\n\t}\n\n\t// Register the parser callback. It should be the first callback\n\t// after the a11y test.\n\tif(config.parseOnLoad){\n\t\tready(100, parser, \"parse\");\n\t}\n\n\treturn parser;\n});\n","define([\"./_base/kernel\", \"./has\", \"./dom\", \"./on\", \"./_base/array\", \"./_base/lang\", \"./selector/_loader\", \"./selector/_loader!default\"],\n\tfunction(dojo, has, dom, on, array, lang, loader, defaultEngine){\n\n\t\"use strict\";\n\n\thas.add(\"array-extensible\", function(){\n\t\t// test to see if we can extend an array (not supported in old IE)\n\t\treturn lang.delegate([], {length: 1}).length == 1 && !has(\"bug-for-in-skips-shadowed\");\n\t});\n\t\n\tvar ap = Array.prototype, aps = ap.slice, apc = ap.concat, forEach = array.forEach;\n\n\tvar tnl = function(/*Array*/ a, /*dojo/NodeList?*/ parent, /*Function?*/ NodeListCtor){\n\t\t// summary:\n\t\t//\t\tdecorate an array to make it look like a `dojo/NodeList`.\n\t\t// a:\n\t\t//\t\tArray of nodes to decorate.\n\t\t// parent:\n\t\t//\t\tAn optional parent NodeList that generated the current\n\t\t//\t\tlist of nodes. Used to call _stash() so the parent NodeList\n\t\t//\t\tcan be accessed via end() later.\n\t\t// NodeListCtor:\n\t\t//\t\tAn optional constructor function to use for any\n\t\t//\t\tnew NodeList calls. This allows a certain chain of\n\t\t//\t\tNodeList calls to use a different object than dojo/NodeList.\n\t\tvar nodeList = new (NodeListCtor || this._NodeListCtor || nl)(a);\n\t\treturn parent ? nodeList._stash(parent) : nodeList;\n\t};\n\n\tvar loopBody = function(f, a, o){\n\t\ta = [0].concat(aps.call(a, 0));\n\t\to = o || dojo.global;\n\t\treturn function(node){\n\t\t\ta[0] = node;\n\t\t\treturn f.apply(o, a);\n\t\t};\n\t};\n\n\t// adapters\n\n\tvar adaptAsForEach = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the forEach-type\n\t\t//\t\tactions. The initial object is returned from the specialized\n\t\t//\t\tfunction.\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\tthis.forEach(loopBody(f, arguments, o));\n\t\t\treturn this;\t// Object\n\t\t};\n\t};\n\n\tvar adaptAsMap = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the map-type\n\t\t//\t\tactions. The return is a new array of values, as via `dojo/_base/array.map`\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\treturn this.map(loopBody(f, arguments, o));\n\t\t};\n\t};\n\n\tvar adaptAsFilter = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the filter-type actions\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\treturn this.filter(loopBody(f, arguments, o));\n\t\t};\n\t};\n\n\tvar adaptWithCondition = function(f, g, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the map-type\n\t\t//\t\tactions, behaves like forEach() or map() depending on arguments\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// g: Function\n\t\t//\t\ta condition function, if true runs as map(), otherwise runs as forEach()\n\t\t// o: Object?\n\t\t//\t\tan optional context for f and g\n\t\treturn function(){\n\t\t\tvar a = arguments, body = loopBody(f, a, o);\n\t\t\tif(g.call(o || dojo.global, a)){\n\t\t\t\treturn this.map(body);\t// self\n\t\t\t}\n\t\t\tthis.forEach(body);\n\t\t\treturn this;\t// self\n\t\t};\n\t};\n\n\tvar NodeList = function(array){\n\t\t// summary:\n\t\t//\t\tArray-like object which adds syntactic\n\t\t//\t\tsugar for chaining, common iteration operations, animation, and\n\t\t//\t\tnode manipulation. NodeLists are most often returned as the\n\t\t//\t\tresult of dojo/query() calls.\n\t\t// description:\n\t\t//\t\tNodeList instances provide many utilities that reflect\n\t\t//\t\tcore Dojo APIs for Array iteration and manipulation, DOM\n\t\t//\t\tmanipulation, and event handling. Instead of needing to dig up\n\t\t//\t\tfunctions in the dojo package, NodeLists generally make the\n\t\t//\t\tfull power of Dojo available for DOM manipulation tasks in a\n\t\t//\t\tsimple, chainable way.\n\t\t// example:\n\t\t//\t\tcreate a node list from a node\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/dom\"\n\t\t//\t\t|\t], function(query, dom){\n\t\t//\t\t|\t\tquery.NodeList(dom.byId(\"foo\"));\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tget a NodeList from a CSS query and iterate on it\n\t\t//\t\t|\trequire([\"dojo/on\", \"dojo/dom\"\n\t\t//\t\t|\t], function(on, dom){\n\t\t//\t\t|\t\tvar l = query(\".thinger\");\n\t\t//\t\t|\t\tl.forEach(function(node, index, nodeList){\n\t\t//\t\t|\t\t\tconsole.log(index, node.innerHTML);\n\t\t//\t\t|\t\t});\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tuse native and Dojo-provided array methods to manipulate a\n\t\t//\t\tNodeList without needing to use dojo.* functions explicitly:\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/dom-construct\", \"dojo/dom\"\n\t\t//\t\t|\t], function(query, domConstruct, dom){\n\t\t//\t\t|\t\tvar l = query(\".thinger\");\n\t\t//\t\t|\t\t// since NodeLists are real arrays, they have a length\n\t\t//\t\t|\t\t// property that is both readable and writable and\n\t\t//\t\t|\t\t// push/pop/shift/unshift methods\n\t\t//\t\t|\t\tconsole.log(l.length);\n\t\t//\t\t|\t\tl.push(domConstruct.create(\"span\"));\n\t\t//\t\t|\n\t\t//\t\t|\t\t// dojo's normalized array methods work too:\n\t\t//\t\t|\t\tconsole.log( l.indexOf(dom.byId(\"foo\")) );\n\t\t//\t\t|\t\t// ...including the special \"function as string\" shorthand\n\t\t//\t\t|\t\tconsole.log( l.every(\"item.nodeType == 1\") );\n\t\t//\t\t|\n\t\t//\t\t|\t\t// NodeLists can be [..] indexed, or you can use the at()\n\t\t//\t\t|\t\t// function to get specific items wrapped in a new NodeList:\n\t\t//\t\t|\t\tvar node = l[3]; // the 4th element\n\t\t//\t\t|\t\tvar newList = l.at(1, 3); // the 2nd and 4th elements\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tchainability is a key advantage of NodeLists:\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t//\t\t|\t], function(query){\n\t\t//\t\t|\t\tquery(\".thinger\")\n\t\t//\t\t|\t\t\t.onclick(function(e){ /* ... */ })\n\t\t//\t\t|\t\t\t.at(1, 3, 8) // get a subset\n\t\t//\t\t|\t\t\t\t.style(\"padding\", \"5px\")\n\t\t//\t\t|\t\t\t\t.forEach(console.log);\n\t\t//\t\t|\t});\n\n\t\tvar isNew = this instanceof nl && has(\"array-extensible\");\n\t\tif(typeof array == \"number\"){\n\t\t\tarray = Array(array);\n\t\t}\n\t\tvar nodeArray = (array && \"length\" in array) ? array : arguments;\n\t\tif(isNew || !nodeArray.sort){\n\t\t\t// make sure it's a real array before we pass it on to be wrapped \n\t\t\tvar target = isNew ? this : [],\n\t\t\t\tl = target.length = nodeArray.length;\n\t\t\tfor(var i = 0; i < l; i++){\n\t\t\t\ttarget[i] = nodeArray[i];\n\t\t\t}\n\t\t\tif(isNew){\n\t\t\t\t// called with new operator, this means we are going to use this instance and push\n\t\t\t\t// the nodes on to it. This is usually much faster since the NodeList properties\n\t\t\t\t//\tdon't need to be copied (unless the list of nodes is extremely large).\n\t\t\t\treturn target;\n\t\t\t}\n\t\t\tnodeArray = target;\n\t\t}\n\t\t// called without new operator, use a real array and copy prototype properties,\n\t\t// this is slower and exists for back-compat. Should be removed in 2.0.\n\t\tlang._mixin(nodeArray, nlp);\n\t\tnodeArray._NodeListCtor = function(array){\n\t\t\t// call without new operator to preserve back-compat behavior\n\t\t\treturn nl(array);\n\t\t};\n\t\treturn nodeArray;\n\t};\n\t\n\tvar nl = NodeList, nlp = nl.prototype = \n\t\thas(\"array-extensible\") ? [] : {};// extend an array if it is extensible\n\n\t// expose adapters and the wrapper as private functions\n\n\tnl._wrap = nlp._wrap = tnl;\n\tnl._adaptAsMap = adaptAsMap;\n\tnl._adaptAsForEach = adaptAsForEach;\n\tnl._adaptAsFilter  = adaptAsFilter;\n\tnl._adaptWithCondition = adaptWithCondition;\n\n\t// mass assignment\n\n\t// add array redirectors\n\tforEach([\"slice\", \"splice\"], function(name){\n\t\tvar f = ap[name];\n\t\t//Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.\n\t\t// CANNOT apply ._stash()/end() to splice since it currently modifies\n\t\t// the existing this array -- it would break backward compatibility if we copy the array before\n\t\t// the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.\n\t\tnlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == \"slice\" ? this : null); };\n\t});\n\t// concat should be here but some browsers with native NodeList have problems with it\n\n\t// add array.js redirectors\n\tforEach([\"indexOf\", \"lastIndexOf\", \"every\", \"some\"], function(name){\n\t\tvar f = array[name];\n\t\tnlp[name] = function(){ return f.apply(dojo, [this].concat(aps.call(arguments, 0))); };\n\t});\n\n\tlang.extend(NodeList, {\n\t\t// copy the constructors\n\t\tconstructor: nl,\n\t\t_NodeListCtor: nl,\n\t\ttoString: function(){\n\t\t\t// Array.prototype.toString can't be applied to objects, so we use join\n\t\t\treturn this.join(\",\");\n\t\t},\n\t\t_stash: function(parent){\n\t\t\t// summary:\n\t\t\t//\t\tprivate function to hold to a parent NodeList. end() to return the parent NodeList.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tHow to make a `dojo/NodeList` method that only returns the third node in\n\t\t\t//\t\tthe dojo/NodeList but allows access to the original NodeList by using this._stash:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/_base/lang\", \"dojo/NodeList\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query, lang){\n\t\t\t//\t|\t\tlang.extend(NodeList, {\n\t\t\t//\t|\t\t\tthird: function(){\n\t\t\t//\t|\t\t\t\tvar newNodeList = NodeList(this[2]);\n\t\t\t//\t|\t\t\t\treturn newNodeList._stash(this);\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t});\n\t\t\t//\t|\t\t// then see how _stash applies a sub-list, to be .end()'ed out of\n\t\t\t//\t|\t\tquery(\".foo\")\n\t\t\t//\t|\t\t\t.third()\n\t\t\t//\t|\t\t\t\t.addClass(\"thirdFoo\")\n\t\t\t//\t|\t\t\t.end()\n\t\t\t//\t|\t\t\t// access to the orig .foo list\n\t\t\t//\t|\t\t\t.removeClass(\"foo\")\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\tthis._parent = parent;\n\t\t\treturn this; // dojo/NodeList\n\t\t},\n\n\t\ton: function(eventName, listener){\n\t\t\t// summary:\n\t\t\t//\t\tListen for events on the nodes in the NodeList. Basic usage is:\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\t|\trequire([\"dojo/query\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\".my-class\").on(\"click\", listener);\n\t\t\t//\t\t\tThis supports event delegation by using selectors as the first argument with the event names as\n\t\t\t//\t\t\tpseudo selectors. For example:\n\t\t\t//\t\t| \t\tquery(\"#my-list\").on(\"li:click\", listener);\n\t\t\t//\t\t\tThis will listen for click events within `<li>` elements that are inside the `#my-list` element.\n\t\t\t//\t\t\tBecause on supports CSS selector syntax, we can use comma-delimited events as well:\n\t\t\t//\t\t| \t\tquery(\"#my-list\").on(\"li button:mouseover, li:click\", listener);\n\t\t\t//\t\t|\t});\n\t\t\tvar handles = this.map(function(node){\n\t\t\t\treturn on(node, eventName, listener); // TODO: apply to the NodeList so the same selector engine is used for matches\n\t\t\t});\n\t\t\thandles.remove = function(){\n\t\t\t\tfor(var i = 0; i < handles.length; i++){\n\t\t\t\t\thandles[i].remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn handles;\n\t\t},\n\n\t\tend: function(){\n\t\t\t// summary:\n\t\t\t//\t\tEnds use of the current `NodeList` by returning the previous NodeList\n\t\t\t//\t\tthat generated the current NodeList.\n\t\t\t// description:\n\t\t\t//\t\tReturns the `NodeList` that generated the current `NodeList`. If there\n\t\t\t//\t\tis no parent NodeList, an empty NodeList is returned.\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\")\n\t\t\t//\t|\t\t\t.filter(\".disabled\")\n\t\t\t//\t|\t\t\t\t// operate on the anchors that only have a disabled class\n\t\t\t//\t|\t\t\t\t.style(\"color\", \"grey\")\n\t\t\t//\t|\t\t\t.end()\n\t\t\t//\t|\t\t\t// jump back to the list of anchors\n\t\t\t//\t|\t\t\t.style(...)\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\tif(this._parent){\n\t\t\t\treturn this._parent;\n\t\t\t}else{\n\t\t\t\t//Just return empty list.\n\t\t\t\treturn new this._NodeListCtor(0);\n\t\t\t}\n\t\t},\n\n\t\t// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods\n\n\t\t// FIXME: handle return values for #3244\n\t\t//\t\thttp://trac.dojotoolkit.org/ticket/3244\n\n\t\t// FIXME:\n\t\t//\t\tneed to wrap or implement:\n\t\t//\t\t\tjoin (perhaps w/ innerHTML/outerHTML overload for toString() of items?)\n\t\t//\t\t\treduce\n\t\t//\t\t\treduceRight\n\n\t\t/*=====\n\t\tslice: function(begin, end){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList, maintaining this one in place\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.slice method\n\t\t\t//\t\twith the caveat that it returns a `dojo/NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see Mozilla's [slice\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice)\n\t\t\t// begin: Integer\n\t\t\t//\t\tCan be a positive or negative integer, with positive\n\t\t\t//\t\tintegers noting the offset to begin at, and negative\n\t\t\t//\t\tintegers denoting an offset from the end (i.e., to the left\n\t\t\t//\t\tof the end)\n\t\t\t// end: Integer?\n\t\t\t//\t\tOptional parameter to describe what position relative to\n\t\t\t//\t\tthe NodeList's zero index to end the slice at. Like begin,\n\t\t\t//\t\tcan be positive or negative.\n\t\t\treturn this._wrap(a.slice.apply(this, arguments));\n\t\t},\n\n\t\tsplice: function(index, howmany, item){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList, manipulating this NodeList based on\n\t\t\t//\t\tthe arguments passed, potentially splicing in new elements\n\t\t\t//\t\tat an offset, optionally deleting elements\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.splice method\n\t\t\t//\t\twith the caveat that it returns a `dojo/NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see Mozilla's [splice\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice)\n\t\t\t//\t\tFor backwards compatibility, calling .end() on the spliced NodeList\n\t\t\t//\t\tdoes not return the original NodeList -- splice alters the NodeList in place.\n\t\t\t// index: Integer\n\t\t\t//\t\tbegin can be a positive or negative integer, with positive\n\t\t\t//\t\tintegers noting the offset to begin at, and negative\n\t\t\t//\t\tintegers denoting an offset from the end (i.e., to the left\n\t\t\t//\t\tof the end)\n\t\t\t// howmany: Integer?\n\t\t\t//\t\tOptional parameter to describe what position relative to\n\t\t\t//\t\tthe NodeList's zero index to end the slice at. Like begin,\n\t\t\t//\t\tcan be positive or negative.\n\t\t\t// item: Object...?\n\t\t\t//\t\tAny number of optional parameters may be passed in to be\n\t\t\t//\t\tspliced into the NodeList\n\t\t\treturn this._wrap(a.splice.apply(this, arguments));\t// dojo/NodeList\n\t\t},\n\n\t\tindexOf: function(value, fromIndex){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.indexOf()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList\n\t\t\t// value: Object\n\t\t\t//\t\tThe value to search for.\n\t\t\t// fromIndex: Integer?\n\t\t\t//\t\tThe location to start searching from. Optional. Defaults to 0.\n\t\t\t// description:\n\t\t\t//\t\tFor more details on the behavior of indexOf, see Mozilla's\n\t\t\t//\t\t[indexOf\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf)\n\t\t\t// returns:\n\t\t\t//\t\tPositive Integer or 0 for a match, -1 of not found.\n\t\t\treturn d.indexOf(this, value, fromIndex); // Integer\n\t\t},\n\n\t\tlastIndexOf: function(value, fromIndex){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.lastIndexOf()`. The primary difference is that the\n\t\t\t//\t\tacted-on array is implicitly this NodeList\n\t\t\t// description:\n\t\t\t//\t\tFor more details on the behavior of lastIndexOf, see\n\t\t\t//\t\tMozilla's [lastIndexOf\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf)\n\t\t\t// value: Object\n\t\t\t//\t\tThe value to search for.\n\t\t\t// fromIndex: Integer?\n\t\t\t//\t\tThe location to start searching from. Optional. Defaults to 0.\n\t\t\t// returns:\n\t\t\t//\t\tPositive Integer or 0 for a match, -1 of not found.\n\t\t\treturn d.lastIndexOf(this, value, fromIndex); // Integer\n\t\t},\n\n\t\tevery: function(callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.every()` and the [Array.every\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every).\n\t\t\t//\t\tTakes the same structure of arguments and returns as\n\t\t\t//\t\tdojo/_base/array.every() with the caveat that the passed array is\n\t\t\t//\t\timplicitly this NodeList\n\t\t\t// callback: Function\n\t\t\t//\t\tthe callback\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tthe context\n\t\t\treturn d.every(this, callback, thisObject); // Boolean\n\t\t},\n\n\t\tsome: function(callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tTakes the same structure of arguments and returns as\n\t\t\t//\t\t`dojo/_base/array.some()` with the caveat that the passed array is\n\t\t\t//\t\timplicitly this NodeList.  See `dojo/_base/array.some()` and Mozilla's\n\t\t\t//\t\t[Array.some\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some).\n\t\t\t// callback: Function\n\t\t\t//\t\tthe callback\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tthe context\n\t\t\treturn d.some(this, callback, thisObject); // Boolean\n\t\t},\n\t\t=====*/\n\n\t\tconcat: function(item){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList comprised of items in this NodeList\n\t\t\t//\t\tas well as items passed in as parameters\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.concat method\n\t\t\t//\t\twith the caveat that it returns a `NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see the [Array.concat\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat)\n\t\t\t// item: Object?\n\t\t\t//\t\tAny number of optional parameters may be passed in to be\n\t\t\t//\t\tspliced into the NodeList\n\n\t\t\t//return this._wrap(apc.apply(this, arguments));\n\t\t\t// the line above won't work for the native NodeList, or for Dojo NodeLists either :-(\n\n\t\t\t// implementation notes:\n\t\t\t// Array.concat() doesn't recognize native NodeLists or Dojo NodeLists\n\t\t\t// as arrays, and so does not inline them into a unioned array, but\n\t\t\t// appends them as single entities. Both the original NodeList and the\n\t\t\t// items passed in as parameters must be converted to raw Arrays\n\t\t\t// and then the concatenation result may be re-_wrap()ed as a Dojo NodeList.\n\n\t\t\tvar t = aps.call(this, 0),\n\t\t\t\tm = array.map(arguments, function(a){\n\t\t\t\t\treturn aps.call(a, 0);\n\t\t\t\t});\n\t\t\treturn this._wrap(apc.apply(t, m), this);\t// dojo/NodeList\n\t\t},\n\n\t\tmap: function(/*Function*/ func, /*Function?*/ obj){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.map()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList and the return is a\n\t\t\t//\t\tNodeList (a subclass of Array)\n\t\t\treturn this._wrap(array.map(this, func, obj), this); // dojo/NodeList\n\t\t},\n\n\t\tforEach: function(callback, thisObj){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.forEach()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList. If you want the option to break out\n\t\t\t//\t\tof the forEach loop, use every() or some() instead.\n\t\t\tforEach(this, callback, thisObj);\n\t\t\t// non-standard return to allow easier chaining\n\t\t\treturn this; // dojo/NodeList\n\t\t},\n\t\tfilter: function(/*String|Function*/ filter){\n\t\t\t// summary:\n\t\t\t//\t\t\"masks\" the built-in javascript filter() method (supported\n\t\t\t//\t\tin Dojo via `dojo/_base/array.filter`) to support passing a simple\n\t\t\t//\t\tstring filter in addition to supporting filtering function\n\t\t\t//\t\tobjects.\n\t\t\t// filter:\n\t\t\t//\t\tIf a string, a CSS rule like \".thinger\" or \"div > span\".\n\t\t\t// example:\n\t\t\t//\t\t\"regular\" JS filter syntax as exposed in `dojo/_base/array.filter`:\n\t\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\"*\").filter(function(item){\n\t\t\t//\t\t|\t\t\t// highlight every paragraph\n\t\t\t//\t\t|\t\t\treturn (item.nodeName == \"p\");\n\t\t\t//\t\t|\t\t}).style(\"backgroundColor\", \"yellow\");\n\t\t\t//\t\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tthe same filtering using a CSS selector\n\t\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\"*\").filter(\"p\").styles(\"backgroundColor\", \"yellow\");\n\t\t\t//\t\t|\t});\n\n\t\t\tvar a = arguments, items = this, start = 0;\n\t\t\tif(typeof filter == \"string\"){ // inline'd type check\n\t\t\t\titems = query._filterResult(this, a[0]);\n\t\t\t\tif(a.length == 1){\n\t\t\t\t\t// if we only got a string query, pass back the filtered results\n\t\t\t\t\treturn items._stash(this); // dojo/NodeList\n\t\t\t\t}\n\t\t\t\t// if we got a callback, run it over the filtered items\n\t\t\t\tstart = 1;\n\t\t\t}\n\t\t\treturn this._wrap(array.filter(items, a[start], a[start + 1]), this);\t// dojo/NodeList\n\t\t},\n\t\tinstantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){\n\t\t\t// summary:\n\t\t\t//\t\tCreate a new instance of a specified class, using the\n\t\t\t//\t\tspecified properties and each node in the NodeList as a\n\t\t\t//\t\tsrcNodeRef.\n\t\t\t// example:\n\t\t\t//\t\tGrabs all buttons in the page and converts them to dijit/form/Button's.\n\t\t\t//\t|\tvar buttons = query(\"button\").instantiate(Button, {showLabel: true});\n\t\t\tvar c = lang.isFunction(declaredClass) ? declaredClass : lang.getObject(declaredClass);\n\t\t\tproperties = properties || {};\n\t\t\treturn this.forEach(function(node){\n\t\t\t\tnew c(properties, node);\n\t\t\t});\t// dojo/NodeList\n\t\t},\n\t\tat: function(/*===== index =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList comprised of items in this NodeList\n\t\t\t//\t\tat the given index or indices.\n\t\t\t//\n\t\t\t// index: Integer...\n\t\t\t//\t\tOne or more 0-based indices of items in the current\n\t\t\t//\t\tNodeList. A negative index will start at the end of the\n\t\t\t//\t\tlist and go backwards.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tShorten the list to the first, second, and third elements\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\").at(0, 1, 2).forEach(fn);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tRetrieve the first and last elements of a unordered list:\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").at(0, -1).forEach(cb);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tDo something for the first element only, but end() out back to\n\t\t\t//\tthe original list and continue chaining:\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\").at(0).onclick(fn).end().forEach(function(n){\n\t\t\t//\t|\t\t\tconsole.log(n); // all anchors on the page.\n\t\t\t//\t|\t})\n\t\t\t//\t|\t});\n\n\t\t\tvar t = new this._NodeListCtor(0);\n\t\t\tforEach(arguments, function(i){\n\t\t\t\tif(i < 0){ i = this.length + i; }\n\t\t\t\tif(this[i]){ t.push(this[i]); }\n\t\t\t}, this);\n\t\t\treturn t._stash(this); // dojo/NodeList\n\t\t}\n\t});\n\n\tfunction queryForEngine(engine, NodeList){\n\t\tvar query = function(/*String*/ query, /*String|DOMNode?*/ root){\n\t\t\t// summary:\n\t\t\t//\t\tReturns nodes which match the given CSS selector, searching the\n\t\t\t//\t\tentire document by default but optionally taking a node to scope\n\t\t\t//\t\tthe search by. Returns an instance of NodeList.\n\t\t\tif(typeof root == \"string\"){\n\t\t\t\troot = dom.byId(root);\n\t\t\t\tif(!root){\n\t\t\t\t\treturn new NodeList([]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar results = typeof query == \"string\" ? engine(query, root) : query ? (query.end && query.on) ? query : [query] : [];\n\t\t\tif(results.end && results.on){\n\t\t\t\t// already wrapped\n\t\t\t\treturn results;\n\t\t\t}\n\t\t\treturn new NodeList(results);\n\t\t};\n\t\tquery.matches = engine.match || function(node, selector, root){\n\t\t\t// summary:\n\t\t\t//\t\tTest to see if a node matches a selector\n\t\t\treturn query.filter([node], selector, root).length > 0;\n\t\t};\n\t\t// the engine provides a filtering function, use it to for matching\n\t\tquery.filter = engine.filter || function(nodes, selector, root){\n\t\t\t// summary:\n\t\t\t//\t\tFilters an array of nodes. Note that this does not guarantee to return a NodeList, just an array.\n\t\t\treturn query(selector, root).filter(function(node){\n\t\t\t\treturn array.indexOf(nodes, node) > -1;\n\t\t\t});\n\t\t};\n\t\tif(typeof engine != \"function\"){\n\t\t\tvar search = engine.search;\n\t\t\tengine = function(selector, root){\n\t\t\t\t// Slick does it backwards (or everyone else does it backwards, probably the latter)\n\t\t\t\treturn search(root || document, selector);\n\t\t\t};\n\t\t}\n\t\treturn query;\n\t}\n\tvar query = queryForEngine(defaultEngine, NodeList);\n\t/*=====\n\tquery = function(selector, context){\n\t\t// summary:\n\t\t//\t\tThis modules provides DOM querying functionality. The module export is a function\n\t\t//\t\tthat can be used to query for DOM nodes by CSS selector and returns a NodeList\n\t\t//\t\trepresenting the matching nodes.\n\t\t// selector: String\n\t\t//\t\tA CSS selector to search for.\n\t\t// context: String|DomNode?\n\t\t//\t\tAn optional context to limit the searching scope. Only nodes under `context` will be\n\t\t//\t\tscanned.\n\t\t// example:\n\t\t//\t\tadd an onclick handler to every submit button in the document\n\t\t//\t\twhich causes the form to be sent via Ajax instead:\n\t\t//\t|\trequire([\"dojo/query\", \"dojo/request\", \"dojo/dom-form\", \"dojo/dom-construct\", \"dojo/dom-style\"\n\t\t//\t|\t], function(query, request, domForm, domConstruct, domStyle){\n\t\t//\t|\t\tquery(\"input[type='submit']\").on(\"click\", function(e){\n\t\t//\t|\t\t\te.preventDefault(); // prevent sending the form\n\t\t//\t|\t\t\tvar btn = e.target;\n\t\t//\t|\t\t\trequest.post(\"http://example.com/\", {\n\t\t//\t|\t\t\t\tdata: domForm.toObject(btn.form)\n\t\t//\t|\t\t\t}).then(function(response){\n\t\t//\t|\t\t\t\t// replace the form with the response\n\t\t//\t|\t\t\t\tdomConstruct.create(div, {innerHTML: response}, btn.form, \"after\");\n\t\t//\t|\t\t\t\tdomStyle.set(btn.form, \"display\", \"none\");\n\t\t//\t|\t\t\t});\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// description:\n\t\t//\t\tdojo/query is responsible for loading the appropriate query engine and wrapping\n\t\t//\t\tits results with a `NodeList`. You can use dojo/query with a specific selector engine\n\t\t//\t\tby using it as a plugin. For example, if you installed the sizzle package, you could\n\t\t//\t\tuse it as the selector engine with:\n\t\t//\t\t|\trequire([\"dojo/query!sizzle\"], function(query){\n\t\t//\t\t|\t\tquery(\"div\")...\n\t\t//\n\t\t//\t\tThe id after the ! can be a module id of the selector engine or one of the following values:\n\t\t//\n\t\t//\t\t- acme: This is the default engine used by Dojo base, and will ensure that the full\n\t\t//\t\tAcme engine is always loaded.\n\t\t//\n\t\t//\t\t- css2: If the browser has a native selector engine, this will be used, otherwise a\n\t\t//\t\tvery minimal lightweight selector engine will be loaded that can do simple CSS2 selectors\n\t\t//\t\t(by #id, .class, tag, and [name=value] attributes, with standard child or descendant (>)\n\t\t//\t\toperators) and nothing more.\n\t\t//\n\t\t//\t\t- css2.1: If the browser has a native selector engine, this will be used, otherwise the\n\t\t//\t\tfull Acme engine will be loaded.\n\t\t//\n\t\t//\t\t- css3: If the browser has a native selector engine with support for CSS3 pseudo\n\t\t//\t\tselectors (most modern browsers except IE8), this will be used, otherwise the\n\t\t//\t\tfull Acme engine will be loaded.\n\t\t//\n\t\t//\t\t- Or the module id of a selector engine can be used to explicitly choose the selector engine\n\t\t//\n\t\t//\t\tFor example, if you are using CSS3 pseudo selectors in module, you can specify that\n\t\t//\t\tyou will need support them with:\n\t\t//\t\t|\trequire([\"dojo/query!css3\"], function(query){\n\t\t//\t\t|\t\tquery('#t > h3:nth-child(odd)')...\n\t\t//\n\t\t//\t\tYou can also choose the selector engine/load configuration by setting the query-selector:\n\t\t//\t\tFor example:\n\t\t//\t\t|\t<script data-dojo-config=\"query-selector:'css3'\" src=\"dojo.js\"></script>\n\t\t//\n\t\treturn new NodeList(); // dojo/NodeList\n\t };\n\t =====*/\n\n\t// the query that is returned from this module is slightly different than dojo.query,\n\t// because dojo.query has to maintain backwards compatibility with returning a\n\t// true array which has performance problems. The query returned from the module\n\t// does not use true arrays, but rather inherits from Array, making it much faster to\n\t// instantiate.\n\tdojo.query = queryForEngine(defaultEngine, function(array){\n\t\t// call it without the new operator to invoke the back-compat behavior that returns a true array\n\t\treturn NodeList(array);\t// dojo/NodeList\n\t});\n\n\tquery.load = function(id, parentRequire, loaded){\n\t\t// summary:\n\t\t//\t\tcan be used as AMD plugin to conditionally load new query engine\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/query!custom\"], function(qsa){\n\t\t//\t|\t\t// loaded selector/custom.js as engine\n\t\t//\t|\t\tqsa(\"#foobar\").forEach(...);\n\t\t//\t|\t});\n\t\tloader.load(id, parentRequire, function(engine){\n\t\t\tloaded(queryForEngine(engine, NodeList));\n\t\t});\n\t};\n\n\tdojo._filterQueryResult = query._filterResult = function(nodes, selector, root){\n\t\treturn new NodeList(query.filter(nodes, selector, root));\n\t};\n\tdojo.NodeList = query.NodeList = NodeList;\n\treturn query;\n});\n","define([\"./_base/kernel\", \"./has\", \"require\", \"./has!host-browser?./domReady\", \"./_base/lang\"], function(dojo, has, require, domReady, lang){\n\t// module:\n\t//\t\tdojo/ready\n\t// note:\n\t//\t\tThis module should be unnecessary in dojo 2.0\n\n\tvar\n\t\t// truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved\n\t\tisDomReady = 0,\n\n\t\t// The queue of functions waiting to execute as soon as dojo.ready conditions satisfied\n\t\tloadQ = [],\n\n\t\t// prevent recursion in onLoad\n\t\tonLoadRecursiveGuard = 0,\n\n\t\thandleDomReady = function(){\n\t\t\tisDomReady = 1;\n\t\t\tdojo._postLoad = dojo.config.afterOnLoad = true;\n\t\t\tonEvent();\n\t\t},\n\n\t\tonEvent = function(){\n\t\t\t// Called when some state changes:\n\t\t\t//\t\t- dom ready\n\t\t\t//\t\t- dojo/domReady has finished processing everything in its queue\n\t\t\t//\t\t- task added to loadQ\n\t\t\t//\t\t- require() has finished loading all currently requested modules\n\t\t\t//\n\t\t\t// Run the functions queued with dojo.ready if appropriate.\n\n\n\t\t\t//guard against recursions into this function\n\t\t\tif(onLoadRecursiveGuard){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonLoadRecursiveGuard = 1;\n\n\t\t\t// Run tasks in queue if require() is finished loading modules, the dom is ready, and there are no\n\t\t\t// pending tasks registered via domReady().\n\t\t\t// The last step is necessary so that a user defined dojo.ready() callback is delayed until after the\n\t\t\t// domReady() calls inside of dojo.\t  Failure can be seen on dijit/tests/robot/Dialog_ally.html on IE8\n\t\t\t// because the dijit/focus.js domReady() callback doesn't execute until after the test starts running.\n\t\t\twhile(isDomReady && (!domReady || domReady._Q.length == 0) && (require.idle ? require.idle() : true) && loadQ.length){\n\t\t\t\tvar f = loadQ.shift();\n\t\t\t\ttry{\n\t\t\t\t\tf();\n\t\t\t\t}catch(e){\n\t\t\t\t\t// force the dojo.js on(\"error\") handler do display the message\n\t\t\t\t\te.info = e.message;\n\t\t\t\t\tif(require.signal){\n\t\t\t\t\t\trequire.signal(\"error\", e);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonLoadRecursiveGuard = 0;\n\t\t};\n\n\t// Check if we should run the next queue operation whenever require() finishes loading modules or domReady\n\t// finishes processing it's queue.\n\trequire.on && require.on(\"idle\", onEvent);\n\tif(domReady){\n\t\tdomReady._onQEmpty = onEvent;\n\t}\n\n\tvar ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){\n\t\t// summary:\n\t\t//\t\tAdd a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.\n\t\t//\t\tIn most cases, the `domReady` plug-in should suffice and this method should not be needed.\n\t\t//\n\t\t//\t\tWhen called in a non-browser environment, just checks that all requested modules have arrived and been\n\t\t//\t\tevaluated.\n\t\t// priority: Integer?\n\t\t//\t\tThe order in which to exec this callback relative to other callbacks, defaults to 1000\n\t\t// context: Object?|Function\n\t\t//\t\tThe context in which to run execute callback, or a callback if not using context\n\t\t// callback: Function?\n\t\t//\t\tThe function to execute.\n\t\t//\n\t\t// example:\n\t\t//\tSimple DOM and Modules ready syntax\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(function(){ alert(\"Dom ready!\"); });\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing a priority\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(2, function(){ alert(\"low priority ready!\"); })\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing context\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(foo, function(){\n\t\t//\t|\t\t\t// in here, this == foo\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing dojo/hitch style args:\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tvar foo = { dojoReady: function(){ console.warn(this, \"dojo dom and modules ready.\"); } };\n\t\t//\t|\t\tready(foo, \"dojoReady\");\n\t\t//\t|\t});\n\n\t\tvar hitchArgs = lang._toArray(arguments);\n\t\tif(typeof priority != \"number\"){\n\t\t\tcallback = context;\n\t\t\tcontext = priority;\n\t\t\tpriority = 1000;\n\t\t}else{\n\t\t\thitchArgs.shift();\n\t\t}\n\t\tcallback = callback ?\n\t\t\tlang.hitch.apply(dojo, hitchArgs) :\n\t\t\tfunction(){\n\t\t\t\tcontext();\n\t\t\t};\n\t\tcallback.priority = priority;\n\t\tfor(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}\n\t\tloadQ.splice(i, 0, callback);\n\t\tonEvent();\n\t};\n\n\thas.add(\"dojo-config-addOnLoad\", 1);\n\tif(has(\"dojo-config-addOnLoad\")){\n\t\tvar dca = dojo.config.addOnLoad;\n\t\tif(dca){\n\t\t\tready[(lang.isArray(dca) ? \"apply\" : \"call\")](dojo, dca);\n\t\t}\n\t}\n\n\tif(has(\"dojo-sync-loader\") && dojo.config.parseOnLoad && !dojo.isAsync){\n\t\tready(99, function(){\n\t\t\tif(!dojo.parser){\n\t\t\t\tdojo.deprecated(\"Add explicit require(['dojo/parser']);\", \"\", \"2.0\");\n\t\t\t\trequire([\"dojo/parser\"]);\n\t\t\t}\n\t\t});\n\t}\n\n\tif(domReady){\n\t\tdomReady(handleDomReady);\n\t}else{\n\t\thandleDomReady();\n\t}\n\n\treturn ready;\n});\n","define([\n\t'./request/default!'/*=====,\n\t'./_base/declare',\n\t'./promise/Promise' =====*/\n], function(request/*=====, declare, Promise =====*/){\n\t/*=====\n\trequest = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend a request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tThe URL to request.\n\t\t// options: dojo/request.__Options?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.__Promise = declare(Promise, {\n\t\t// response: dojo/promise/Promise\n\t\t//\t\tA promise resolving to an object representing\n\t\t//\t\tthe response from the server.\n\t});\n\trequest.__BaseOptions = declare(null, {\n\t\t// query: String|Object?\n\t\t//\t\tQuery parameters to append to the URL.\n\t\t// data: String|Object?\n\t\t//\t\tData to transfer.  This is ignored for GET and DELETE\n\t\t//\t\trequests.\n\t\t// preventCache: Boolean?\n\t\t//\t\tWhether to append a cache-busting parameter to the URL.\n\t\t// timeout: Integer?\n\t\t//\t\tMilliseconds to wait for the response.  If this time\n\t\t//\t\tpasses, the then the promise is rejected.\n\t\t// handleAs: String?\n\t\t//\t\tHow to handle the response from the server.  Default is\n\t\t//\t\t'text'.  Other values are 'json', 'javascript', and 'xml'.\n\t});\n\trequest.__MethodOptions = declare(null, {\n\t\t// method: String?\n\t\t//\t\tThe HTTP method to use to make the request.  Must be\n\t\t//\t\tuppercase.\n\t});\n\trequest.__Options = declare([request.__BaseOptions, request.__MethodOptions]);\n\n\trequest.get = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP GET request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.post = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP POST request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.put = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP POST request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.del = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP DELETE request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\t=====*/\n\treturn request;\n});\n","define([\"../has\", \"require\"],\n\t\tfunction(has, require){\n\n\"use strict\";\nif (typeof document !== \"undefined\") {\n\tvar testDiv = document.createElement(\"div\");\n\thas.add(\"dom-qsa2.1\", !!testDiv.querySelectorAll);\n\thas.add(\"dom-qsa3\", function(){\n\t\t// test to see if we have a reasonable native selector engine available\n\t\ttry{\n\t\t\ttestDiv.innerHTML = \"<p class='TEST'></p>\"; // test kind of from sizzle\n\t\t\t// Safari can't handle uppercase or unicode characters when\n\t\t\t// in quirks mode, IE8 can't handle pseudos like :empty\n\t\t\treturn testDiv.querySelectorAll(\".TEST:empty\").length == 1;\n\t\t}catch(e){}\n\t});\n}\n\nvar fullEngine;\nvar acme = \"./acme\", lite = \"./lite\";\nreturn {\n\t// summary:\n\t//\t\tThis module handles loading the appropriate selector engine for the given browser\n\n\tload: function(id, parentRequire, loaded, config){\n\t\tif (config && config.isBuild) {\n\t\t\t//Indicate that the optimizer should not wait\n\t\t\t//for this resource any more and complete optimization.\n\t\t\t//This resource will be resolved dynamically during\n\t\t\t//run time in the web browser.\n\t\t\tloaded();\n\t\t\treturn;\n\t\t}\n\n\t\tvar req = require;\n\t\t// here we implement the default logic for choosing a selector engine\n\t\tid = id == \"default\" ? has(\"config-selectorEngine\") || \"css3\" : id;\n\t\tid = id == \"css2\" || id == \"lite\" ? lite :\n\t\t\t\tid == \"css2.1\" ? has(\"dom-qsa2.1\") ? lite : acme :\n\t\t\t\tid == \"css3\" ? has(\"dom-qsa3\") ? lite : acme :\n\t\t\t\tid == \"acme\" ? acme : (req = parentRequire) && id;\n\t\tif(id.charAt(id.length-1) == '?'){\n\t\t\tid = id.substring(0,id.length - 1);\n\t\t\tvar optionalLoad = true;\n\t\t}\n\t\t// the query engine is optional, only load it if a native one is not available or existing one has not been loaded\n\t\tif(optionalLoad && (has(\"dom-compliant-qsa\") || fullEngine)){\n\t\t\treturn loaded(fullEngine);\n\t\t}\n\t\t// load the referenced selector engine\n\t\treq([id], function(engine){\n\t\t\tif(id != \"./lite\"){\n\t\t\t\tfullEngine = engine;\n\t\t\t}\n\t\t\tloaded(engine);\n\t\t});\n\t}\n};\n});\n","define([\"../has\", \"../_base/kernel\"], function(has, dojo){\n\"use strict\";\n\nvar testDiv = document.createElement(\"div\");\nvar matchesSelector = testDiv.matches || testDiv.webkitMatchesSelector || testDiv.mozMatchesSelector || testDiv.msMatchesSelector || testDiv.oMatchesSelector;\nvar querySelectorAll = testDiv.querySelectorAll;\nvar unionSplit = /([^\\s,](?:\"(?:\\\\.|[^\"])+\"|'(?:\\\\.|[^'])+'|[^,])*)/g;\nhas.add(\"dom-matches-selector\", !!matchesSelector);\nhas.add(\"dom-qsa\", !!querySelectorAll); \n\n// this is a simple query engine. It has handles basic selectors, and for simple\n// common selectors is extremely fast\nvar liteEngine = function(selector, root){\n\t// summary:\n\t//\t\tA small lightweight query selector engine that implements CSS2.1 selectors\n\t//\t\tminus pseudo-classes and the sibling combinator, plus CSS3 attribute selectors\n\n\tif(combine && selector.indexOf(',') > -1){\n\t\treturn combine(selector, root);\n\t}\n\t// use the root's ownerDocument if provided, otherwise try to use dojo.doc. Note \n\t// that we don't use dojo/_base/window's doc to reduce dependencies, and \n\t// fallback to plain document if dojo.doc hasn't been defined (by dojo/_base/window).\n\t// presumably we will have a better way to do this in 2.0 \n\tvar doc = root ? root.ownerDocument || root : dojo.doc || document, \n\t\tmatch = (querySelectorAll ? \n\t\t\t/^([\\w]*)#([\\w\\-]+$)|^(\\.)([\\w\\-\\*]+$)|^(\\w+$)/ : // this one only matches on simple queries where we can beat qSA with specific methods\n\t\t\t/^([\\w]*)#([\\w\\-]+)(?:\\s+(.*))?$|(?:^|(>|.+\\s+))([\\w\\-\\*]+)(\\S*$)/) // this one matches parts of the query that we can use to speed up manual filtering\n\t\t\t.exec(selector);\n\troot = root || doc;\n\tif(match){\n\t\tvar isInsideDomTree = has('ie') === 8 && has('quirks')?\n\t\t\troot.nodeType === doc.nodeType:\n\t\t\troot.parentNode !== null && root.nodeType !== 9 && root.parentNode === doc;\n\n\t\t// fast path regardless of whether or not querySelectorAll exists\n\t\tif(match[2] && isInsideDomTree){\n\t\t\t// an #id\n\t\t\t// use dojo.byId if available as it fixes the id retrieval in IE, note that we can't use the dojo namespace in 2.0, but if there is a conditional module use, we will use that\n\t\t\tvar found = dojo.byId ? dojo.byId(match[2], doc) : doc.getElementById(match[2]);\n\t\t\tif(!found || (match[1] && match[1] != found.tagName.toLowerCase())){\n\t\t\t\t// if there is a tag qualifer and it doesn't match, no matches\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif(root != doc){\n\t\t\t\t// there is a root element, make sure we are a child of it\n\t\t\t\tvar parent = found;\n\t\t\t\twhile(parent != root){\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t\tif(!parent){\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn match[3] ?\n\t\t\t\t\tliteEngine(match[3], found) \n\t\t\t\t\t: [found];\n\t\t}\n\t\tif(match[3] && root.getElementsByClassName){\n\t\t\t// a .class\n\t\t\treturn root.getElementsByClassName(match[4]);\n\t\t}\n\t\tvar found;\n\t\tif(match[5]){\n\t\t\t// a tag\n\t\t\tfound = root.getElementsByTagName(match[5]);\n\t\t\tif(match[4] || match[6]){\n\t\t\t\tselector = (match[4] || \"\") + match[6];\n\t\t\t}else{\n\t\t\t\t// that was the entirety of the query, return results\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\t}\n\tif(querySelectorAll){\n\t\t// qSA works strangely on Element-rooted queries\n\t\t// We can work around this by specifying an extra ID on the root\n\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t// IE 8 doesn't work on object elements\n\t\tif (root.nodeType === 1 && root.nodeName.toLowerCase() !== \"object\"){\t\t\t\t\n\t\t\treturn useRoot(root, selector, root.querySelectorAll);\n\t\t}else{\n\t\t\t// we can use the native qSA\n\t\t\treturn root.querySelectorAll(selector);\n\t\t}\n\t}else if(!found){\n\t\t// search all children and then filter\n\t\tfound = root.getElementsByTagName(\"*\");\n\t}\n\t// now we filter the nodes that were found using the matchesSelector\n\tvar results = [];\n\tfor(var i = 0, l = found.length; i < l; i++){\n\t\tvar node = found[i];\n\t\tif(node.nodeType == 1 && jsMatchesSelector(node, selector, root)){\n\t\t\t// keep the nodes that match the selector\n\t\t\tresults.push(node);\n\t\t}\n\t}\n\treturn results;\n};\nvar useRoot = function(context, query, method){\n\t// this function creates a temporary id so we can do rooted qSA queries, this is taken from sizzle\n\tvar oldContext = context,\n\t\told = context.getAttribute(\"id\"),\n\t\tnid = old || \"__dojo__\",\n\t\thasParent = context.parentNode,\n\t\trelativeHierarchySelector = /^\\s*[+~]/.test(query);\n\n\tif(relativeHierarchySelector && !hasParent){\n\t\treturn [];\n\t}\n\tif(!old){\n\t\tcontext.setAttribute(\"id\", nid);\n\t}else{\n\t\tnid = nid.replace(/'/g, \"\\\\$&\");\n\t}\n\tif(relativeHierarchySelector && hasParent){\n\t\tcontext = context.parentNode;\n\t}\n\tvar selectors = query.match(unionSplit);\n\tfor(var i = 0; i < selectors.length; i++){\n\t\tselectors[i] = \"[id='\" + nid + \"'] \" + selectors[i];\n\t}\n\tquery = selectors.join(\",\");\n\n\ttry{\n\t\treturn method.call(context, query);\n\t}finally{\n\t\tif(!old){\n\t\t\toldContext.removeAttribute(\"id\");\n\t\t}\n\t}\n};\n\nif(!has(\"dom-matches-selector\")){\n\tvar jsMatchesSelector = (function(){\n\t\t// a JS implementation of CSS selector matching, first we start with the various handlers\n\t\tvar caseFix = testDiv.tagName == \"div\" ? \"toLowerCase\" : \"toUpperCase\";\n\t\tvar selectorTypes = {\n\t\t\t\"\": function(tagName){\n\t\t\t\ttagName = tagName[caseFix]();\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.tagName == tagName;\n\t\t\t\t};\n\t\t\t},\n\t\t\t\".\": function(className){\n\t\t\t\tvar classNameSpaced = ' ' + className + ' ';\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.className.indexOf(className) > -1 && (' ' + node.className + ' ').indexOf(classNameSpaced) > -1;\n\t\t\t\t};\n\t\t\t},\n\t\t\t\"#\": function(id){\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.id == id;\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tvar attrComparators = {\n\t\t\t\"^=\": function(attrValue, value){\n\t\t\t\treturn attrValue.indexOf(value) == 0;\n\t\t\t},\n\t\t\t\"*=\": function(attrValue, value){\n\t\t\t\treturn attrValue.indexOf(value) > -1;\n\t\t\t},\n\t\t\t\"$=\": function(attrValue, value){\n\t\t\t\treturn attrValue.substring(attrValue.length - value.length, attrValue.length) == value;\n\t\t\t},\n\t\t\t\"~=\": function(attrValue, value){\n\t\t\t\treturn (' ' + attrValue + ' ').indexOf(' ' + value + ' ') > -1;\n\t\t\t},\n\t\t\t\"|=\": function(attrValue, value){\n\t\t\t\treturn (attrValue + '-').indexOf(value + '-') == 0;\n\t\t\t},\n\t\t\t\"=\": function(attrValue, value){\n\t\t\t\treturn attrValue == value;\n\t\t\t},\n\t\t\t\"\": function(attrValue, value){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\tfunction attr(name, value, type){\n\t\t\tvar firstChar = value.charAt(0);\n\t\t\tif(firstChar == '\"' || firstChar == \"'\"){\n\t\t\t\t// it is quoted, remove the quotes\n\t\t\t\tvalue = value.slice(1, -1);\n\t\t\t}\n\t\t\tvalue = value.replace(/\\\\/g,'');\n\t\t\tvar comparator = attrComparators[type || \"\"];\n\t\t\treturn function(node){\n\t\t\t\tvar attrValue = node.getAttribute(name);\n\t\t\t\treturn attrValue && comparator(attrValue, value);\n\t\t\t};\n\t\t}\n\t\tfunction ancestor(matcher){\n\t\t\treturn function(node, root){\n\t\t\t\twhile((node = node.parentNode) != root){\n\t\t\t\t\tif(matcher(node, root)){\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tfunction parent(matcher){\n\t\t\treturn function(node, root){\n\t\t\t\tnode = node.parentNode;\n\t\t\t\treturn matcher ? \n\t\t\t\t\tnode != root && matcher(node, root)\n\t\t\t\t\t: node == root;\n\t\t\t};\n\t\t}\n\t\tvar cache = {};\n\t\tfunction and(matcher, next){\n\t\t\treturn matcher ?\n\t\t\t\tfunction(node, root){\n\t\t\t\t\treturn next(node) && matcher(node, root);\n\t\t\t\t}\n\t\t\t\t: next;\n\t\t}\n\t\treturn function(node, selector, root){\n\t\t\t// this returns true or false based on if the node matches the selector (optionally within the given root)\n\t\t\tvar matcher = cache[selector]; // check to see if we have created a matcher function for the given selector\n\t\t\tif(!matcher){\n\t\t\t\t// create a matcher function for the given selector\n\t\t\t\t// parse the selectors\n\t\t\t\tif(selector.replace(/(?:\\s*([> ])\\s*)|(#|\\.)?((?:\\\\.|[\\w-])+)|\\[\\s*([\\w-]+)\\s*(.?=)?\\s*(\"(?:\\\\.|[^\"])+\"|'(?:\\\\.|[^'])+'|(?:\\\\.|[^\\]])*)\\s*\\]/g, function(t, combinator, type, value, attrName, attrType, attrValue){\n\t\t\t\t\tif(value){\n\t\t\t\t\t\tmatcher = and(matcher, selectorTypes[type || \"\"](value.replace(/\\\\/g, '')));\n\t\t\t\t\t}\n\t\t\t\t\telse if(combinator){\n\t\t\t\t\t\tmatcher = (combinator == \" \" ? ancestor : parent)(matcher);\n\t\t\t\t\t}\n\t\t\t\t\telse if(attrName){\n\t\t\t\t\t\tmatcher = and(matcher, attr(attrName, attrValue, attrType));\n\t\t\t\t\t}\n\t\t\t\t\treturn \"\";\n\t\t\t\t})){\n\t\t\t\t\tthrow new Error(\"Syntax error in query\");\n\t\t\t\t}\n\t\t\t\tif(!matcher){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcache[selector] = matcher;\n\t\t\t}\n\t\t\t// now run the matcher function on the node\n\t\t\treturn matcher(node, root);\n\t\t};\n\t})();\n}\nif(!has(\"dom-qsa\")){\n\tvar combine = function(selector, root){\n\t\t// combined queries\n\t\tvar selectors = selector.match(unionSplit);\n\t\tvar indexed = [];\n\t\t// add all results and keep unique ones, this only runs in IE, so we take advantage \n\t\t// of known IE features, particularly sourceIndex which is unique and allows us to \n\t\t// order the results \n\t\tfor(var i = 0; i < selectors.length; i++){\n\t\t\tselector = new String(selectors[i].replace(/\\s*$/,''));\n\t\t\tselector.indexOf = escape; // keep it from recursively entering combine\n\t\t\tvar results = liteEngine(selector, root);\n\t\t\tfor(var j = 0, l = results.length; j < l; j++){\n\t\t\t\tvar node = results[j];\n\t\t\t\tindexed[node.sourceIndex] = node;\n\t\t\t}\n\t\t}\n\t\t// now convert from a sparse array to a dense array\n\t\tvar totalResults = [];\n\t\tfor(i in indexed){\n\t\t\ttotalResults.push(indexed[i]);\n\t\t}\n\t\treturn totalResults;\n\t};\n}\n\nliteEngine.match = matchesSelector ? function(node, selector, root){\n\tif(root && root.nodeType != 9){\n\t\t// doesn't support three args, use rooted id trick\n\t\treturn useRoot(root, selector, function(query){\n\t\t\treturn matchesSelector.call(node, query);\n\t\t});\n\t}\n\t// we have a native matchesSelector, use that\n\treturn matchesSelector.call(node, selector);\n} : jsMatchesSelector; // otherwise use the JS matches impl\n\nreturn liteEngine;\n});\n","define([\n\t\"./_base/kernel\",\t// kernel.global\n\t\"./_base/lang\"\n], function(kernel, lang){\n\n// module:\n//\t\tdojo/string\nvar ESCAPE_REGEXP = /[&<>'\"\\/]/g;\nvar ESCAPE_MAP = {\n\t'&': '&amp;',\n\t'<': '&lt;',\n\t'>': '&gt;',\n\t'\"': '&quot;',\n\t\"'\": '&#x27;',\n\t'/': '&#x2F;'\n};\nvar string = {\n\t// summary:\n\t//\t\tString utilities for Dojo\n};\nlang.setObject(\"dojo.string\", string);\n\nstring.escape = function(/*String*/str){\n\t// summary:\n\t//\t\tEfficiently escape a string for insertion into HTML (innerHTML or attributes), replacing &, <, >, \", ', and / characters.\n\t// str:\n\t//\t\tthe string to escape\n\tif(!str){ return \"\"; }\n\treturn str.replace(ESCAPE_REGEXP, function(c) {\n\t\treturn ESCAPE_MAP[c];\n\t});\n};\n\nstring.rep = function(/*String*/str, /*Integer*/num){\n\t// summary:\n\t//\t\tEfficiently replicate a string `n` times.\n\t// str:\n\t//\t\tthe string to replicate\n\t// num:\n\t//\t\tnumber of times to replicate the string\n\n\tif(num <= 0 || !str){ return \"\"; }\n\n\tvar buf = [];\n\tfor(;;){\n\t\tif(num & 1){\n\t\t\tbuf.push(str);\n\t\t}\n\t\tif(!(num >>= 1)){ break; }\n\t\tstr += str;\n\t}\n\treturn buf.join(\"\");\t// String\n};\n\nstring.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){\n\t// summary:\n\t//\t\tPad a string to guarantee that it is at least `size` length by\n\t//\t\tfilling with the character `ch` at either the start or end of the\n\t//\t\tstring. Pads at the start, by default.\n\t// text:\n\t//\t\tthe string to pad\n\t// size:\n\t//\t\tlength to provide padding\n\t// ch:\n\t//\t\tcharacter to pad, defaults to '0'\n\t// end:\n\t//\t\tadds padding at the end if true, otherwise pads at start\n\t// example:\n\t//\t|\t// Fill the string to length 10 with \"+\" characters on the right.  Yields \"Dojo++++++\".\n\t//\t|\tstring.pad(\"Dojo\", 10, \"+\", true);\n\n\tif(!ch){\n\t\tch = '0';\n\t}\n\tvar out = String(text),\n\t\tpad = string.rep(ch, Math.ceil((size - out.length) / ch.length));\n\treturn end ? out + pad : pad + out;\t// String\n};\n\nstring.substitute = function(\t/*String*/\t\ttemplate,\n\t\t\t\t\t\t\t\t\t/*Object|Array*/map,\n\t\t\t\t\t\t\t\t\t/*Function?*/\ttransform,\n\t\t\t\t\t\t\t\t\t/*Object?*/\t\tthisObject){\n\t// summary:\n\t//\t\tPerforms parameterized substitutions on a string. Throws an\n\t//\t\texception if any parameter is unmatched.\n\t// template:\n\t//\t\ta string with expressions in the form `${key}` to be replaced or\n\t//\t\t`${key:format}` which specifies a format function. keys are case-sensitive.\n\t//\t\tThe special sequence `${}` can be used escape `$`.\n\t// map:\n\t//\t\thash to search for substitutions\n\t// transform:\n\t//\t\ta function to process all parameters before substitution takes\n\t//\t\tplace, e.g. mylib.encodeXML\n\t// thisObject:\n\t//\t\twhere to look for optional format function; default to the global\n\t//\t\tnamespace\n\t// example:\n\t//\t\tSubstitutes two expressions in a string from an Array or Object\n\t//\t|\t// returns \"File 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\t// by providing substitution data in an Array\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"File '${0}' is not found in directory '${1}'.\",\n\t//\t|\t\t[\"foo.html\",\"/temp\"]\n\t//\t|\t);\n\t//\t|\n\t//\t|\t// also returns \"File 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\t// but provides substitution data in an Object structure.  Dotted\n\t//\t|\t// notation may be used to traverse the structure.\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"File '${name}' is not found in directory '${info.dir}'.\",\n\t//\t|\t\t{ name: \"foo.html\", info: { dir: \"/temp\" } }\n\t//\t|\t);\n\t// example:\n\t//\t\tUse a transform function to modify the values:\n\t//\t|\t// returns \"file 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"${0} is not found in ${1}.\",\n\t//\t|\t\t[\"foo.html\",\"/temp\"],\n\t//\t|\t\tfunction(str){\n\t//\t|\t\t\t// try to figure out the type\n\t//\t|\t\t\tvar prefix = (str.charAt(0) == \"/\") ? \"directory\": \"file\";\n\t//\t|\t\t\treturn prefix + \" '\" + str + \"'\";\n\t//\t|\t\t}\n\t//\t|\t);\n\t// example:\n\t//\t\tUse a formatter\n\t//\t|\t// returns \"thinger -- howdy\"\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"${0:postfix}\", [\"thinger\"], null, {\n\t//\t|\t\t\tpostfix: function(value, key){\n\t//\t|\t\t\t\treturn value + \" -- howdy\";\n\t//\t|\t\t\t}\n\t//\t|\t\t}\n\t//\t|\t);\n\n\tthisObject = thisObject || kernel.global;\n\ttransform = transform ?\n\t\tlang.hitch(thisObject, transform) : function(v){ return v; };\n\n\treturn template.replace(/\\$\\{([^\\s\\:\\}]*)(?:\\:([^\\s\\:\\}]+))?\\}/g,\n\t\tfunction(match, key, format){\n\t\t\tif (key == ''){\n\t\t\t\treturn '$';\n\t\t\t}\n\t\t\tvar value = lang.getObject(key, false, map);\n\t\t\tif(format){\n\t\t\t\tvalue = lang.getObject(format, false, thisObject).call(thisObject, value, key);\n\t\t\t}\n\t\t\tvar result = transform(value, key);\n\n\t\t\tif (typeof result === 'undefined') {\n\t\t\t\tthrow new Error('string.substitute could not find key \"' + key + '\" in template');\n\t\t\t}\n\n\t\t\treturn result.toString();\n\t\t}); // String\n};\n\nstring.trim = String.prototype.trim ?\n\tlang.trim : // aliasing to the native function\n\tfunction(str){\n\t\tstr = str.replace(/^\\s+/, '');\n\t\tfor(var i = str.length - 1; i >= 0; i--){\n\t\t\tif(/\\S/.test(str.charAt(i))){\n\t\t\t\tstr = str.substring(0, i + 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn str;\n\t};\n\n/*=====\n string.trim = function(str){\n\t // summary:\n\t //\t\tTrims whitespace from both sides of the string\n\t // str: String\n\t //\t\tString to be trimmed\n\t // returns: String\n\t //\t\tReturns the trimmed string\n\t // description:\n\t //\t\tThis version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).\n\t //\t\tThe short yet performant version of this function is dojo/_base/lang.trim(),\n\t //\t\twhich is part of Dojo base.  Uses String.prototype.trim instead, if available.\n\t return \"\";\t// String\n };\n =====*/\n\n\treturn string;\n});\n","define([\"./_base/kernel\", \"require\", \"./has\", \"./has!host-browser?./request\"], function(dojo, require, has, request){\n\t// module:\n\t//\t\tdojo/text\n\n\tvar getText;\n\tif(has(\"host-browser\")){\n\t\tgetText= function(url, sync, load){\n\t\t\trequest(url, {sync:!!sync, headers: { 'X-Requested-With': null } }).then(load);\n\t\t};\n\t}else{\n\t\t// Path for node.js and rhino, to load from local file system.\n\t\t// TODO: use node.js native methods rather than depending on a require.getText() method to exist.\n\t\tif(require.getText){\n\t\t\tgetText= require.getText;\n\t\t}else{\n\t\t\tconsole.error(\"dojo/text plugin failed to load because loader does not support getText\");\n\t\t}\n\t}\n\n\tvar\n\t\ttheCache = {},\n\n\t\tstrip= function(text){\n\t\t\t//Strips <?xml ...?> declarations so that external SVG and XML\n\t\t\t//documents can be added to a document without worry. Also, if the string\n\t\t\t//is an HTML document, only the part inside the body tag is returned.\n\t\t\tif(text){\n\t\t\t\ttext= text.replace(/^\\s*<\\?xml(\\s)+version=[\\'\\\"](\\d)*.(\\d)*[\\'\\\"](\\s)*\\?>/im, \"\");\n\t\t\t\tvar matches= text.match(/<body[^>]*>\\s*([\\s\\S]+)\\s*<\\/body>/im);\n\t\t\t\tif(matches){\n\t\t\t\t\ttext= matches[1];\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\ttext = \"\";\n\t\t\t}\n\t\t\treturn text;\n\t\t},\n\n\t\tnotFound = {},\n\n\t\tpending = {};\n\n\tdojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){\n\t\t// summary:\n\t\t//\t\tA getter and setter for storing the string content associated with the\n\t\t//\t\tmodule and url arguments.\n\t\t// description:\n\t\t//\t\tIf module is a string that contains slashes, then it is interpretted as a fully\n\t\t//\t\tresolved path (typically a result returned by require.toUrl), and url should not be\n\t\t//\t\tprovided. This is the preferred signature. If module is a string that does not\n\t\t//\t\tcontain slashes, then url must also be provided and module and url are used to\n\t\t//\t\tcall `dojo.moduleUrl()` to generate a module URL. This signature is deprecated.\n\t\t//\t\tIf value is specified, the cache value for the moduleUrl will be set to\n\t\t//\t\tthat value. Otherwise, dojo.cache will fetch the moduleUrl and store it\n\t\t//\t\tin its internal cache and return that cached value for the URL. To clear\n\t\t//\t\ta cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the\n\t\t//\t\tthe URL contents, only modules on the same domain of the page can use this capability.\n\t\t//\t\tThe build system can inline the cache values though, to allow for xdomain hosting.\n\t\t// module: String||Object\n\t\t//\t\tIf a String with slashes, a fully resolved path; if a String without slashes, the\n\t\t//\t\tmodule name to use for the base part of the URL, similar to module argument\n\t\t//\t\tto `dojo.moduleUrl`. If an Object, something that has a .toString() method that\n\t\t//\t\tgenerates a valid path for the cache item. For example, a dojo._Url object.\n\t\t// url: String\n\t\t//\t\tThe rest of the path to append to the path derived from the module argument. If\n\t\t//\t\tmodule is an object, then this second argument should be the \"value\" argument instead.\n\t\t// value: String||Object?\n\t\t//\t\tIf a String, the value to use in the cache for the module/url combination.\n\t\t//\t\tIf an Object, it can have two properties: value and sanitize. The value property\n\t\t//\t\tshould be the value to use in the cache, and sanitize can be set to true or false,\n\t\t//\t\tto indicate if XML declarations should be removed from the value and if the HTML\n\t\t//\t\tinside a body tag in the value should be extracted as the real value. The value argument\n\t\t//\t\tor the value property on the value argument are usually only used by the build system\n\t\t//\t\tas it inlines cache content.\n\t\t// example:\n\t\t//\t\tTo ask dojo.cache to fetch content and store it in the cache (the dojo[\"cache\"] style\n\t\t//\t\tof call is used to avoid an issue with the build system erroneously trying to intern\n\t\t//\t\tthis example. To get the build system to intern your dojo.cache calls, use the\n\t\t//\t\t\"dojo.cache\" style of call):\n\t\t//\t\t| //If template.html contains \"<h1>Hello</h1>\" that will be\n\t\t//\t\t| //the value for the text variable.\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](\"my.module\", \"template.html\");\n\t\t// example:\n\t\t//\t\tTo ask dojo.cache to fetch content and store it in the cache, and sanitize the input\n\t\t//\t\t (the dojo[\"cache\"] style of call is used to avoid an issue with the build system\n\t\t//\t\terroneously trying to intern this example. To get the build system to intern your\n\t\t//\t\tdojo.cache calls, use the \"dojo.cache\" style of call):\n\t\t//\t\t| //If template.html contains \"<html><body><h1>Hello</h1></body></html>\", the\n\t\t//\t\t| //text variable will contain just \"<h1>Hello</h1>\".\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](\"my.module\", \"template.html\", {sanitize: true});\n\t\t// example:\n\t\t//\t\tSame example as previous, but demonstrates how an object can be passed in as\n\t\t//\t\tthe first argument, then the value argument can then be the second argument.\n\t\t//\t\t| //If template.html contains \"<html><body><h1>Hello</h1></body></html>\", the\n\t\t//\t\t| //text variable will contain just \"<h1>Hello</h1>\".\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](new dojo._Url(\"my/module/template.html\"), {sanitize: true});\n\n\t\t//\t * (string string [value]) => (module, url, value)\n\t\t//\t * (object [value])        => (module, value), url defaults to \"\"\n\t\t//\n\t\t//\t * if module is an object, then it must be convertable to a string\n\t\t//\t * (module, url) module + (url ? (\"/\" + url) : \"\") must be a legal argument to require.toUrl\n\t\t//\t * value may be a string or an object; if an object then may have the properties \"value\" and/or \"sanitize\"\n\t\tvar key;\n\t\tif(typeof module==\"string\"){\n\t\t\tif(/\\//.test(module)){\n\t\t\t\t// module is a version 1.7+ resolved path\n\t\t\t\tkey = module;\n\t\t\t\tvalue = url;\n\t\t\t}else{\n\t\t\t\t// module is a version 1.6- argument to dojo.moduleUrl\n\t\t\t\tkey = require.toUrl(module.replace(/\\./g, \"/\") + (url ? (\"/\" + url) : \"\"));\n\t\t\t}\n\t\t}else{\n\t\t\tkey = module + \"\";\n\t\t\tvalue = url;\n\t\t}\n\t\tvar\n\t\t\tval = (value != undefined && typeof value != \"string\") ? value.value : value,\n\t\t\tsanitize = value && value.sanitize;\n\n\t\tif(typeof val == \"string\"){\n\t\t\t//We have a string, set cache value\n\t\t\ttheCache[key] = val;\n\t\t\treturn sanitize ? strip(val) : val;\n\t\t}else if(val === null){\n\t\t\t//Remove cached value\n\t\t\tdelete theCache[key];\n\t\t\treturn null;\n\t\t}else{\n\t\t\t//Allow cache values to be empty strings. If key property does\n\t\t\t//not exist, fetch it.\n\t\t\tif(!(key in theCache)){\n\t\t\t\tgetText(key, true, function(text){\n\t\t\t\t\ttheCache[key]= text;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn sanitize ? strip(theCache[key]) : theCache[key];\n\t\t}\n\t};\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module implements the dojo/text! plugin and the dojo.cache API.\n\t\t// description:\n\t\t//\t\tWe choose to include our own plugin to leverage functionality already contained in dojo\n\t\t//\t\tand thereby reduce the size of the plugin compared to various foreign loader implementations.\n\t\t//\t\tAlso, this allows foreign AMD loaders to be used without their plugins.\n\t\t//\n\t\t//\t\tCAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous\n\t\t//\t\tloader. This feature is outside the scope of the CommonJS plugins specification.\n\n\t\t// the dojo/text caches it's own resources because of dojo.cache\n\t\tdynamic: true,\n\n\t\tnormalize: function(id, toAbsMid){\n\t\t\t// id is something like (path may be relative):\n\t\t\t//\n\t\t\t//\t \"path/to/text.html\"\n\t\t\t//\t \"path/to/text.html!strip\"\n\t\t\tvar parts= id.split(\"!\"),\n\t\t\t\turl= parts[0];\n\t\t\treturn (/^\\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? \"!\" + parts[1] : \"\");\n\t\t},\n\n\t\tload: function(id, require, load){\n\t\t\t// id: String\n\t\t\t//\t\tPath to the resource.\n\t\t\t// require: Function\n\t\t\t//\t\tObject that include the function toUrl with given id returns a valid URL from which to load the text.\n\t\t\t// load: Function\n\t\t\t//\t\tCallback function which will be called, when the loading finished.\n\n\t\t\t// id is something like (path is always absolute):\n\t\t\t//\n\t\t\t//\t \"path/to/text.html\"\n\t\t\t//\t \"path/to/text.html!strip\"\n\t\t\tvar\n\t\t\t\tparts= id.split(\"!\"),\n\t\t\t\tstripFlag= parts.length>1,\n\t\t\t\tabsMid= parts[0],\n\t\t\t\turl = require.toUrl(parts[0]),\n\t\t\t\trequireCacheUrl = \"url:\" + url,\n\t\t\t\ttext = notFound,\n\t\t\t\tfinish = function(text){\n\t\t\t\t\tload(stripFlag ? strip(text) : text);\n\t\t\t\t};\n\t\t\tif(absMid in theCache){\n\t\t\t\ttext = theCache[absMid];\n\t\t\t}else if(require.cache && requireCacheUrl in require.cache){\n\t\t\t\ttext = require.cache[requireCacheUrl];\n\t\t\t}else if(url in theCache){\n\t\t\t\ttext = theCache[url];\n\t\t\t}\n\t\t\tif(text===notFound){\n\t\t\t\tif(pending[url]){\n\t\t\t\t\tpending[url].push(finish);\n\t\t\t\t}else{\n\t\t\t\t\tvar pendingList = pending[url] = [finish];\n\t\t\t\t\tgetText(url, !require.async, function(text){\n\t\t\t\t\t\ttheCache[absMid]= theCache[url]= text;\n\t\t\t\t\t\tfor(var i = 0; i<pendingList.length;){\n\t\t\t\t\t\t\tpendingList[i++](text);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdelete pending[url];\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfinish(text);\n\t\t\t}\n\t\t}\n\t};\n\n});\n\n","define([\"./_base/kernel\", \"./aspect\", \"./dom\", \"./dom-class\", \"./_base/lang\", \"./on\", \"./has\", \"./mouse\", \"./domReady\", \"./_base/window\"],\nfunction(dojo, aspect, dom, domClass, lang, on, has, mouse, domReady, win){\n\n\t// module:\n\t//\t\tdojo/touch\n\n\tvar ios4 = has(\"ios\") < 5;\n\n\t// Detect if platform supports Pointer Events, and if so, the names of the events (pointerdown vs. MSPointerDown).\n\tvar hasPointer = has(\"pointer-events\") || has(\"MSPointer\"),\n\t\tpointer = (function () {\n\t\t\tvar pointer = {};\n\t\t\tfor (var type in { down: 1, move: 1, up: 1, cancel: 1, over: 1, out: 1 }) {\n\t\t\t\tpointer[type] = has(\"MSPointer\") ?\n\t\t\t\t\t\"MSPointer\" + type.charAt(0).toUpperCase() + type.slice(1) :\n\t\t\t\t\t\"pointer\" + type;\n\t\t\t}\n\t\t\treturn pointer;\n\t\t})();\n\n\t// Detect if platform supports the webkit touchstart/touchend/... events\n\tvar hasTouch = has(\"touch-events\");\n\n\t// Click generation variables\n\tvar clicksInited, clickTracker, useTarget = false, clickTarget, clickX, clickY, clickDx, clickDy, clickTime;\n\n\t// Time of most recent touchstart, touchmove, or touchend event\n\tvar lastTouch;\n\n\tfunction dualEvent(mouseType, touchType, pointerType){\n\t\t// Returns synthetic event that listens for both the specified mouse event and specified touch event.\n\t\t// But ignore fake mouse events that were generated due to the user touching the screen.\n\t\tif(hasPointer && pointerType){\n\t\t\t// IE10+: MSPointer* events are designed to handle both mouse and touch in a uniform way,\n\t\t\t// so just use that regardless of hasTouch.\n\t\t\treturn function(node, listener){\n\t\t\t\treturn on(node, pointerType, listener);\n\t\t\t};\n\t\t}else if(hasTouch){\n\t\t\treturn function(node, listener){\n\t\t\t\tvar handle1 = on(node, touchType, function(evt){\n\t\t\t\t\t\tlistener.call(this, evt);\n\n\t\t\t\t\t\t// On slow mobile browsers (see https://bugs.dojotoolkit.org/ticket/17634),\n\t\t\t\t\t\t// a handler for a touch event may take >1s to run.  That time shouldn't\n\t\t\t\t\t\t// be included in the calculation for lastTouch.\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\t\t\t\t\t}),\n\t\t\t\t\thandle2 = on(node, mouseType, function(evt){\n\t\t\t\t\t\tif(!lastTouch || (new Date()).getTime() > lastTouch + 1000){\n\t\t\t\t\t\t\tlistener.call(this, evt);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tremove: function(){\n\t\t\t\t\t\thandle1.remove();\n\t\t\t\t\t\thandle2.remove();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t}else{\n\t\t\t// Avoid creating listeners for touch events on performance sensitive older browsers like IE6\n\t\t\treturn function(node, listener){\n\t\t\t\treturn on(node, mouseType, listener);\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction marked(/*DOMNode*/ node){\n\t\t// Search for node ancestor has been marked with the dojoClick property to indicate special processing.\n\t\t// Returns marked ancestor.\n\t\tdo{\n\t\t\tif(node.dojoClick !== undefined){ return node; }\n\t\t}while(node = node.parentNode);\n\t}\n\n\tfunction doClicks(e, moveType, endType){\n\t\t// summary:\n\t\t//\t\tSetup touch listeners to generate synthetic clicks immediately (rather than waiting for the browser\n\t\t//\t\tto generate clicks after the double-tap delay) and consistently (regardless of whether event.preventDefault()\n\t\t//\t\twas called in an event listener. Synthetic clicks are generated only if a node or one of its ancestors has\n\t\t//\t\tits dojoClick property set to truthy. If a node receives synthetic clicks because one of its ancestors has its\n\t\t//      dojoClick property set to truthy, you can disable synthetic clicks on this node by setting its own dojoClick property\n\t\t//      to falsy.\n\n\t\tif(mouse.isRight(e)){\n\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t}\n\n\t\tvar markedNode = marked(e.target);\n\t\tclickTracker  = !e.target.disabled && markedNode && markedNode.dojoClick; // click threshold = true, number, x/y object, or \"useTarget\"\n\t\tif(clickTracker){\n\t\t\tuseTarget = (clickTracker == \"useTarget\");\n\t\t\tclickTarget = (useTarget?markedNode:e.target);\n\t\t\tif(useTarget){\n\t\t\t\t// We expect a click, so prevent any other\n\t\t\t\t// default action on \"touchpress\"\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tclickX = e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX;\n\t\t\tclickY = e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY;\n\t\t\tclickDx = (typeof clickTracker == \"object\" ? clickTracker.x : (typeof clickTracker == \"number\" ? clickTracker : 0)) || 4;\n\t\t\tclickDy = (typeof clickTracker == \"object\" ? clickTracker.y : (typeof clickTracker == \"number\" ? clickTracker : 0)) || 4;\n\n\t\t\t// add move/end handlers only the first time a node with dojoClick is seen,\n\t\t\t// so we don't add too much overhead when dojoClick is never set.\n\t\t\tif(!clicksInited){\n\t\t\t\tclicksInited = true;\n\n\t\t\t\tfunction updateClickTracker(e){\n\t\t\t\t\tif(useTarget){\n\t\t\t\t\t\tclickTracker = dom.isDescendant(\n\t\t\t\t\t\t\twin.doc.elementFromPoint(\n\t\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX),\n\t\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY)),\n\t\t\t\t\t\t\tclickTarget);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tclickTracker = clickTracker &&\n\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].target : e.target) == clickTarget &&\n\t\t\t\t\t\t\tMath.abs((e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX) - clickX) <= clickDx &&\n\t\t\t\t\t\t\tMath.abs((e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY) - clickY) <= clickDy;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twin.doc.addEventListener(moveType, function(e){\n\t\t\t\t\tif(mouse.isRight(e)){\n\t\t\t\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t\t\t\t}\n\t\t\t\t\tupdateClickTracker(e);\n\t\t\t\t\tif(useTarget){\n\t\t\t\t\t\t// prevent native scroll event and ensure touchend is\n\t\t\t\t\t\t// fire after touch moves between press and release.\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\n\t\t\t\twin.doc.addEventListener(endType, function(e){\n\t\t\t\t\tif(mouse.isRight(e)){\n\t\t\t\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t\t\t\t}\n\t\t\t\t\tupdateClickTracker(e);\n\t\t\t\t\tif(clickTracker){\n\t\t\t\t\t\tclickTime = (new Date()).getTime();\n\t\t\t\t\t\tvar target = (useTarget?clickTarget:e.target);\n\t\t\t\t\t\tif(target.tagName === \"LABEL\"){\n\t\t\t\t\t\t\t// when clicking on a label, forward click to its associated input if any\n\t\t\t\t\t\t\ttarget = dom.byId(target.getAttribute(\"for\")) || target;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//some attributes can be on the Touch object, not on the Event:\n\t\t\t\t\t\t//http://www.w3.org/TR/touch-events/#touch-interface\n\t\t\t\t\t\tvar src = (e.changedTouches) ? e.changedTouches[0] : e;\n\t\t\t\t\t\tfunction createMouseEvent(type){\n\t\t\t\t\t\t\t//create the synthetic event.\n\t\t\t\t\t\t\t//http://www.w3.org/TR/DOM-Level-3-Events/#widl-MouseEvent-initMouseEvent\n\t\t\t\t\t\t\tvar evt = document.createEvent(\"MouseEvents\");\n\t\t\t\t\t\t\tevt._dojo_click = true;\n\t\t\t\t\t\t\tevt.initMouseEvent(type,\n\t\t\t\t\t\t\t\ttrue, //bubbles\n\t\t\t\t\t\t\t\ttrue, //cancelable\n\t\t\t\t\t\t\t\te.view,\n\t\t\t\t\t\t\t\te.detail,\n\t\t\t\t\t\t\t\tsrc.screenX,\n\t\t\t\t\t\t\t\tsrc.screenY,\n\t\t\t\t\t\t\t\tsrc.clientX,\n\t\t\t\t\t\t\t\tsrc.clientY,\n\t\t\t\t\t\t\t\te.ctrlKey,\n\t\t\t\t\t\t\t\te.altKey,\n\t\t\t\t\t\t\t\te.shiftKey,\n\t\t\t\t\t\t\t\te.metaKey,\n\t\t\t\t\t\t\t\t0, //button\n\t\t\t\t\t\t\t\tnull //related target\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn evt;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar mouseDownEvt = createMouseEvent(\"mousedown\");\n\t\t\t\t\t\tvar mouseUpEvt = createMouseEvent(\"mouseup\");\n\t\t\t\t\t\tvar clickEvt = createMouseEvent(\"click\");\n\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\ton.emit(target, \"mousedown\", mouseDownEvt);\n\t\t\t\t\t\t\ton.emit(target, \"mouseup\", mouseUpEvt);\n\t\t\t\t\t\t\ton.emit(target, \"click\", clickEvt);\n\n\t\t\t\t\t\t\t// refresh clickTime in case app-defined click handler took a long time to run\n\t\t\t\t\t\t\tclickTime = (new Date()).getTime();\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\n\t\t\t\tfunction stopNativeEvents(type){\n\t\t\t\t\twin.doc.addEventListener(type, function(e){\n\t\t\t\t\t\t// Stop native events when we emitted our own click event.  Note that the native click may occur\n\t\t\t\t\t\t// on a different node than the synthetic click event was generated on.  For example,\n\t\t\t\t\t\t// click on a menu item, causing the menu to disappear, and then (~300ms later) the browser\n\t\t\t\t\t\t// sends a click event to the node that was *underneath* the menu.  So stop all native events\n\t\t\t\t\t\t// sent shortly after ours, similar to what is done in dualEvent.\n\t\t\t\t\t\t// The INPUT.dijitOffScreen test is for offscreen inputs used in dijit/form/Button, on which\n\t\t\t\t\t\t// we call click() explicitly, we don't want to stop this event.\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\tif(clickTracker && !e._dojo_click &&\n\t\t\t\t\t\t\t\t(new Date()).getTime() <= clickTime + 1000 &&\n\t\t\t\t\t\t\t\t!(target.tagName == \"INPUT\" && domClass.contains(target, \"dijitOffScreen\"))){\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\te.stopImmediatePropagation && e.stopImmediatePropagation();\n\t\t\t\t\t\t\tif(type == \"click\" &&\n\t\t\t\t\t\t\t\t(target.tagName != \"INPUT\" ||\n\t\t\t\t\t\t\t\t(target.type == \"radio\" &&\n\t\t\t\t\t\t\t\t\t// #18352 Do not preventDefault for radios that are not dijit or\n\t\t\t\t\t\t\t\t\t// dojox/mobile widgets.\n\t\t\t\t\t\t\t\t\t// (The CSS class dijitCheckBoxInput holds for both checkboxes and radio buttons.)\n\t\t\t\t\t\t\t\t\t(domClass.contains(target, \"dijitCheckBoxInput\") ||\n\t\t\t\t\t\t\t\t\t\tdomClass.contains(target, \"mblRadioButton\"))) ||\n\t\t\t\t\t\t\t\t(target.type == \"checkbox\" &&\n\t\t\t\t\t\t\t\t\t// #18352 Do not preventDefault for checkboxes that are not dijit or\n\t\t\t\t\t\t\t\t\t// dojox/mobile widgets.\n\t\t\t\t\t\t\t\t\t(domClass.contains(target, \"dijitCheckBoxInput\") ||\n\t\t\t\t\t\t\t\t\t\tdomClass.contains(target, \"mblCheckBox\")))) &&\n\t\t\t\t\t\t\t\ttarget.tagName != \"TEXTAREA\" && target.tagName != \"AUDIO\" && target.tagName != \"VIDEO\"){\n\t\t\t\t\t\t\t\t// preventDefault() breaks textual <input>s on android, keyboard doesn't popup,\n\t\t\t\t\t\t\t\t// but it is still needed for checkboxes and radio buttons, otherwise in some cases\n\t\t\t\t\t\t\t\t// the checked state becomes inconsistent with the widget's state\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, true);\n\t\t\t\t}\n\n\t\t\t\tstopNativeEvents(\"click\");\n\n\t\t\t\t// We also stop mousedown/up since these would be sent well after with our \"fast\" click (300ms),\n\t\t\t\t// which can confuse some dijit widgets.\n\t\t\t\tstopNativeEvents(\"mousedown\");\n\t\t\t\tstopNativeEvents(\"mouseup\");\n\t\t\t}\n\t\t}\n\t}\n\n\tvar hoveredNode;\n\n\tif(has(\"touch\")){\n\t\tif(hasPointer){\n\t\t\t// MSPointer (IE10+) already has support for over and out, so we just need to init click support\n\t\t\tdomReady(function(){\n\t\t\t\twin.doc.addEventListener(pointer.down, function(evt){\n\t\t\t\t\tdoClicks(evt, pointer.move, pointer.up);\n\t\t\t\t}, true);\n\t\t\t});\n\t\t}else{\n\t\t\tdomReady(function(){\n\t\t\t\t// Keep track of currently hovered node\n\t\t\t\thoveredNode = win.body();\t// currently hovered node\n\n\t\t\t\twin.doc.addEventListener(\"touchstart\", function(evt){\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\n\t\t\t\t\t// Precede touchstart event with touch.over event.  DnD depends on this.\n\t\t\t\t\t// Use addEventListener(cb, true) to run cb before any touchstart handlers on node run,\n\t\t\t\t\t// and to ensure this code runs even if the listener on the node does event.stop().\n\t\t\t\t\tvar oldNode = hoveredNode;\n\t\t\t\t\thoveredNode = evt.target;\n\t\t\t\t\ton.emit(oldNode, \"dojotouchout\", {\n\t\t\t\t\t\trelatedTarget: hoveredNode,\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\t\t\t\t\ton.emit(hoveredNode, \"dojotouchover\", {\n\t\t\t\t\t\trelatedTarget: oldNode,\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\n\t\t\t\t\tdoClicks(evt, \"touchmove\", \"touchend\"); // init click generation\n\t\t\t\t}, true);\n\n\t\t\t\tfunction copyEventProps(evt){\n\t\t\t\t\t// Make copy of event object and also set bubbles:true.  Used when calling on.emit().\n\t\t\t\t\tvar props = lang.delegate(evt, {\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\n\t\t\t\t\tif(has(\"ios\") >= 6){\n\t\t\t\t\t\t// On iOS6 \"touches\" became a non-enumerable property, which\n\t\t\t\t\t\t// is not hit by for...in.  Ditto for the other properties below.\n\t\t\t\t\t\tprops.touches = evt.touches;\n\t\t\t\t\t\tprops.altKey = evt.altKey;\n\t\t\t\t\t\tprops.changedTouches = evt.changedTouches;\n\t\t\t\t\t\tprops.ctrlKey = evt.ctrlKey;\n\t\t\t\t\t\tprops.metaKey = evt.metaKey;\n\t\t\t\t\t\tprops.shiftKey = evt.shiftKey;\n\t\t\t\t\t\tprops.targetTouches = evt.targetTouches;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn props;\n\t\t\t\t}\n\n\t\t\t\ton(win.doc, \"touchmove\", function(evt){\n\t\t\t\t\tlastTouch = (new Date()).getTime();\n\n\t\t\t\t\tvar newNode = win.doc.elementFromPoint(\n\t\t\t\t\t\tevt.pageX - (ios4 ? 0 : win.global.pageXOffset), // iOS 4 expects page coords\n\t\t\t\t\t\tevt.pageY - (ios4 ? 0 : win.global.pageYOffset)\n\t\t\t\t\t);\n\n\t\t\t\t\tif(newNode){\n\t\t\t\t\t\t// Fire synthetic touchover and touchout events on nodes since the browser won't do it natively.\n\t\t\t\t\t\tif(hoveredNode !== newNode){\n\t\t\t\t\t\t\t// touch out on the old node\n\t\t\t\t\t\t\ton.emit(hoveredNode, \"dojotouchout\", {\n\t\t\t\t\t\t\t\trelatedTarget: newNode,\n\t\t\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// touchover on the new node\n\t\t\t\t\t\t\ton.emit(newNode, \"dojotouchover\", {\n\t\t\t\t\t\t\t\trelatedTarget: hoveredNode,\n\t\t\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thoveredNode = newNode;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Unlike a listener on \"touchmove\", on(node, \"dojotouchmove\", listener) fires when the finger\n\t\t\t\t\t\t// drags over the specified node, regardless of which node the touch started on.\n\t\t\t\t\t\tif(!on.emit(newNode, \"dojotouchmove\", copyEventProps(evt))){\n\t\t\t\t\t\t\t// emit returns false when synthetic event \"dojotouchmove\" is cancelled, so we prevent the\n\t\t\t\t\t\t\t// default behavior of the underlying native event \"touchmove\".\n\t\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Fire a dojotouchend event on the node where the finger was before it was removed from the screen.\n\t\t\t\t// This is different than the native touchend, which fires on the node where the drag started.\n\t\t\t\ton(win.doc, \"touchend\", function(evt){\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\t\t\t\t\tvar node = win.doc.elementFromPoint(\n\t\t\t\t\t\tevt.pageX - (ios4 ? 0 : win.global.pageXOffset), // iOS 4 expects page coords\n\t\t\t\t\t\tevt.pageY - (ios4 ? 0 : win.global.pageYOffset)\n\t\t\t\t\t) || win.body(); // if out of the screen\n\n\t\t\t\t\ton.emit(node, \"dojotouchend\", copyEventProps(evt));\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t//device neutral events - touch.press|move|release|cancel/over/out\n\tvar touch = {\n\t\tpress: dualEvent(\"mousedown\", \"touchstart\", pointer.down),\n\t\tmove: dualEvent(\"mousemove\", \"dojotouchmove\", pointer.move),\n\t\trelease: dualEvent(\"mouseup\", \"dojotouchend\", pointer.up),\n\t\tcancel: dualEvent(mouse.leave, \"touchcancel\", hasPointer ? pointer.cancel : null),\n\t\tover: dualEvent(\"mouseover\", \"dojotouchover\", pointer.over),\n\t\tout: dualEvent(\"mouseout\", \"dojotouchout\", pointer.out),\n\t\tenter: mouse._eventHandler(dualEvent(\"mouseover\",\"dojotouchover\", pointer.over)),\n\t\tleave: mouse._eventHandler(dualEvent(\"mouseout\", \"dojotouchout\", pointer.out))\n\t};\n\n\t/*=====\n\ttouch = {\n\t\t// summary:\n\t\t//\t\tThis module provides unified touch event handlers by exporting\n\t\t//\t\tpress, move, release and cancel which can also run well on desktop.\n\t\t//\t\tBased on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html\n\t\t//      Also, if the dojoClick property is set to truthy on a DOM node, dojo/touch generates\n\t\t//      click events immediately for this node and its descendants (except for descendants that\n\t\t//      have a dojoClick property set to falsy), to avoid the delay before native browser click events,\n\t\t//      and regardless of whether evt.preventDefault() was called in a touch.press event listener.\n\t\t//\n\t\t// example:\n\t\t//\t\tUsed with dojo/on\n\t\t//\t\t|\tdefine([\"dojo/on\", \"dojo/touch\"], function(on, touch){\n\t\t//\t\t|\t\ton(node, touch.press, function(e){});\n\t\t//\t\t|\t\ton(node, touch.move, function(e){});\n\t\t//\t\t|\t\ton(node, touch.release, function(e){});\n\t\t//\t\t|\t\ton(node, touch.cancel, function(e){});\n\t\t// example:\n\t\t//\t\tUsed with touch.* directly\n\t\t//\t\t|\ttouch.press(node, function(e){});\n\t\t//\t\t|\ttouch.move(node, function(e){});\n\t\t//\t\t|\ttouch.release(node, function(e){});\n\t\t//\t\t|\ttouch.cancel(node, function(e){});\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a default move threshold of 4 pixels\n\t\t//\t\t|\tnode.dojoClick = true;\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a move threshold of 10 pixels horizontally and vertically\n\t\t//\t\t|\tnode.dojoClick = 10;\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a move threshold of 50 pixels horizontally and 10 pixels vertically\n\t\t//\t\t|\tnode.dojoClick = {x:50, y:5};\n\t\t// example:\n\t\t//\t\tDisable clicks without delay generated by dojo/touch on a node that has an ancestor with property dojoClick set to truthy\n\t\t//\t\t|  node.dojoClick = false;\n\n\t\tpress: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'touchstart'|'mousedown' for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tmove: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener that fires when the mouse cursor or a finger is dragged over the given node.\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\trelease: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to releasing the mouse button while the cursor is over the given node\n\t\t\t//\t\t(i.e. \"mouseup\") or for removing the finger from the screen while touching the given node.\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tcancel: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'touchcancel'|'mouseleave' for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tover: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'mouseover' or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tout: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'mouseout' or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tenter: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to mouse.enter or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tleave: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to mouse.leave or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t}\n\t};\n\t=====*/\n\n\thas(\"extend-dojo\") && (dojo.touch = touch);\n\n\treturn touch;\n});\n","define([\"./dom-geometry\", \"./_base/lang\", \"./domReady\", \"./sniff\", \"./_base/window\"],\n\tfunction(geometry, lang, domReady, has, baseWindow){\n\n\t// module:\n\t//\t\tdojo/uacss\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tApplies pre-set CSS classes to the top-level HTML node, based on:\n\t\t//\n\t\t//\t\t- browser (ex: dj_ie)\n\t\t//\t\t- browser version (ex: dj_ie6)\n\t\t//\t\t- box model (ex: dj_contentBox)\n\t\t//\t\t- text direction (ex: dijitRtl)\n\t\t//\n\t\t//\t\tIn addition, browser, browser version, and box model are\n\t\t//\t\tcombined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.\n\t\t//\n\t\t//\t\tReturns the has() method.\n\t};\n\t=====*/\n\n\tvar\n\t\thtml = baseWindow.doc.documentElement,\n\t\tie = has(\"ie\"),\n\t\ttrident = has(\"trident\"),\n\t\topera = has(\"opera\"),\n\t\tmaj = Math.floor,\n\t\tff = has(\"ff\"),\n\t\tboxModel = geometry.boxModel.replace(/-/,''),\n\n\t\tclasses = {\n\t\t\t\"dj_quirks\": has(\"quirks\"),\n\n\t\t\t// NOTE: Opera not supported by dijit\n\t\t\t\"dj_opera\": opera,\n\n\t\t\t\"dj_khtml\": has(\"khtml\"),\n\n\t\t\t\"dj_webkit\": has(\"webkit\"),\n\t\t\t\"dj_safari\": has(\"safari\"),\n\t\t\t\"dj_chrome\": has(\"chrome\"),\n\t\t\t\"dj_edge\": has(\"edge\"),\n\n\t\t\t\"dj_gecko\": has(\"mozilla\"),\n\n\t\t\t\"dj_ios\": has(\"ios\"),\n\t\t\t\"dj_android\": has(\"android\")\n\t\t}; // no dojo unsupported browsers\n\n\tif(ie){\n\t\tclasses[\"dj_ie\"] = true;\n\t\tclasses[\"dj_ie\" + maj(ie)] = true;\n\t\tclasses[\"dj_iequirks\"] = has(\"quirks\");\n\t}\n\tif(trident){\n\t\tclasses[\"dj_trident\"] = true;\n\t\tclasses[\"dj_trident\" + maj(trident)] = true;\n\t}\n\tif(ff){\n\t\tclasses[\"dj_ff\" + maj(ff)] = true;\n\t}\n\n\tclasses[\"dj_\" + boxModel] = true;\n\n\t// apply browser, browser version, and box model class names\n\tvar classStr = \"\";\n\tfor(var clz in classes){\n\t\tif(classes[clz]){\n\t\t\tclassStr += clz + \" \";\n\t\t}\n\t}\n\thtml.className = lang.trim(html.className + \" \" + classStr);\n\n\t// If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.\n\t// We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).\n\tdomReady(function(){\n\t\tif(!geometry.isBodyLtr()){\n\t\t\tvar rtlClassStr = \"dj_rtl dijitRtl \" + classStr.replace(/ /g, \"-rtl \");\n\t\t\thtml.className = lang.trim(html.className + \" \" + rtlClassStr + \"dj_rtl dijitRtl \" + classStr.replace(/ /g, \"-rtl \"));\n\t\t}\n\t});\n\treturn has;\n});\n","define([\"./_base/lang\", \"./sniff\", \"./_base/window\", \"./dom\", \"./dom-geometry\", \"./dom-style\", \"./dom-construct\"],\n\tfunction(lang, has, baseWindow, dom, geom, style, domConstruct){\n\n\t// feature detection\n\t/* not needed but included here for future reference\n\thas.add(\"rtl-innerVerticalScrollBar-on-left\", function(win, doc){\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\tscrollable = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'scroll', overflowX:'hidden', direction:'rtl', visibility:'hidden', position:'absolute', left:'0', width:'64px', height:'64px'}\n\t\t\t}, body, \"last\"),\n\t\t\tcenter = domConstruct.create('center', {\n\t\t\t\tstyle: {overflow:'hidden', direction:'ltr'}\n\t\t\t}, scrollable, \"last\"),\n\t\t\tinner = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'visible', display:'inline' }\n\t\t\t}, center, \"last\");\n\t\tinner.innerHTML=\"&nbsp;\";\n\t\tvar midPoint = Math.max(inner.offsetLeft, geom.position(inner).x);\n\t\tvar ret = midPoint >= 32;\n\t\tcenter.removeChild(inner);\n\t\tscrollable.removeChild(center);\n\t\tbody.removeChild(scrollable);\n\t\treturn ret;\n\t});\n\t*/\n\thas.add(\"rtl-adjust-position-for-verticalScrollBar\", function(win, doc){\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\tscrollable = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'scroll', overflowX:'visible', direction:'rtl', visibility:'hidden', position:'absolute', left:'0', top:'0', width:'64px', height:'64px'}\n\t\t\t}, body, \"last\"),\n\t\t\tdiv = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'hidden', direction:'ltr'}\n\t\t\t}, scrollable, \"last\"),\n\t\t\tret = geom.position(div).x != 0;\n\t\tscrollable.removeChild(div);\n\t\tbody.removeChild(scrollable);\n\t\treturn ret;\n\t});\n\n\thas.add(\"position-fixed-support\", function(win, doc){\n\t\t// IE6, IE7+quirks, and some older mobile browsers don't support position:fixed\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\touter = domConstruct.create('span', {\n\t\t\t\tstyle: {visibility:'hidden', position:'fixed', left:'1px', top:'1px'}\n\t\t\t}, body, \"last\"),\n\t\t\tinner = domConstruct.create('span', {\n\t\t\t\tstyle: {position:'fixed', left:'0', top:'0'}\n\t\t\t}, outer, \"last\"),\n\t\t\tret = geom.position(inner).x != geom.position(outer).x;\n\t\touter.removeChild(inner);\n\t\tbody.removeChild(outer);\n\t\treturn ret;\n\t});\n\n\t// module:\n\t//\t\tdojo/window\n\n\tvar window = {\n\t\t// summary:\n\t\t//\t\tTODOC\n\n\t\tgetBox: function(/*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the dimensions and scroll position of the viewable area of a browser window\n\n\t\t\tdoc = doc || baseWindow.doc;\n\n\t\t\tvar\n\t\t\t\tscrollRoot = (doc.compatMode == 'BackCompat') ? baseWindow.body(doc) : doc.documentElement,\n\t\t\t\t// get scroll position\n\t\t\t\tscroll = geom.docScroll(doc), // scrollRoot.scrollTop/Left should work\n\t\t\t\tw, h;\n\n\t\t\tif(has(\"touch\")){ // if(scrollbars not supported)\n\t\t\t\tvar uiWindow = window.get(doc);   // use UI window, not dojo.global window\n\t\t\t\t// on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight\n\t\t\t\tw = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated\n\t\t\t\th = uiWindow.innerHeight || scrollRoot.clientHeight;\n\t\t\t}else{\n\t\t\t\t// on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight\n\t\t\t\t// uiWindow.innerWidth/Height includes the scrollbar and cannot be used\n\t\t\t\tw = scrollRoot.clientWidth;\n\t\t\t\th = scrollRoot.clientHeight;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tl: scroll.x,\n\t\t\t\tt: scroll.y,\n\t\t\t\tw: w,\n\t\t\t\th: h\n\t\t\t};\n\t\t},\n\n\t\tget: function(/*Document*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tGet window object associated with document doc.\n\t\t\t// doc:\n\t\t\t//\t\tThe document to get the associated window for.\n\n\t\t\t// In some IE versions (at least 6.0), document.parentWindow does not return a\n\t\t\t// reference to the real window object (maybe a copy), so we must fix it as well\n\t\t\t// We use IE specific execScript to attach the real window reference to\n\t\t\t// document._parentWindow for later use\n\t\t\tif(has(\"ie\") && window !== document.parentWindow){\n\t\t\t\t/*\n\t\t\t\tIn IE 6, only the variable \"window\" can be used to connect events (others\n\t\t\t\tmay be only copies).\n\t\t\t\t*/\n\t\t\t\tdoc.parentWindow.execScript(\"document._parentWindow = window;\", \"Javascript\");\n\t\t\t\t//to prevent memory leak, unset it after use\n\t\t\t\t//another possibility is to add an onUnload handler which seems overkill to me (liucougar)\n\t\t\t\tvar win = doc._parentWindow;\n\t\t\t\tdoc._parentWindow = null;\n\t\t\t\treturn win;\t//\tWindow\n\t\t\t}\n\n\t\t\treturn doc.parentWindow || doc.defaultView;\t//\tWindow\n\t\t},\n\n\t\tscrollIntoView: function(/*DomNode*/ node, /*Object?*/ pos){\n\t\t\t// summary:\n\t\t\t//\t\tScroll the passed node into view using minimal movement, if it is not already.\n\n\t\t\t// Don't rely on node.scrollIntoView working just because the function is there since\n\t\t\t// it forces the node to the page's bottom or top (and left or right in IE) without consideration for the minimal movement.\n\t\t\t// WebKit's node.scrollIntoViewIfNeeded doesn't work either for inner scrollbars in right-to-left mode\n\t\t\t// and when there's a fixed position scrollable element\n\n\t\t\ttry{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tvar\tdoc = node.ownerDocument || baseWindow.doc,\t// TODO: why baseWindow.doc?  Isn't node.ownerDocument always defined?\n\t\t\t\t\tbody = baseWindow.body(doc),\n\t\t\t\t\thtml = doc.documentElement || body.parentNode,\n\t\t\t\t\tisIE = has(\"ie\") || has(\"trident\"),\n\t\t\t\t\tisWK = has(\"webkit\");\n\t\t\t\t// if an untested browser, then use the native method\n\t\t\t\tif(node == body || node == html){ return; }\n\t\t\t\tif(!(has(\"mozilla\") || isIE || isWK || has(\"opera\") || has(\"trident\") || has(\"edge\"))\n\t\t\t\t\t\t&& (\"scrollIntoView\" in node)){\n\t\t\t\t\tnode.scrollIntoView(false); // short-circuit to native if possible\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar\tbackCompat = doc.compatMode == 'BackCompat',\n\t\t\t\t\trootWidth = Math.min(body.clientWidth || html.clientWidth, html.clientWidth || body.clientWidth),\n\t\t\t\t\trootHeight = Math.min(body.clientHeight || html.clientHeight, html.clientHeight || body.clientHeight),\n\t\t\t\t\tscrollRoot = (isWK || backCompat) ? body : html,\n\t\t\t\t\tnodePos = pos || geom.position(node),\n\t\t\t\t\tel = node.parentNode,\n\t\t\t\t\tisFixed = function(el){\n\t\t\t\t\t\treturn (isIE <= 6 || (isIE == 7 && backCompat))\n\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t: (has(\"position-fixed-support\") && (style.get(el, 'position').toLowerCase() == \"fixed\"));\n\t\t\t\t\t},\n\t\t\t\t\tself = this,\n\t\t\t\t\tscrollElementBy = function(el, x, y){\n\t\t\t\t\t\tif(el.tagName == \"BODY\" || el.tagName == \"HTML\"){\n\t\t\t\t\t\t\tself.get(el.ownerDocument).scrollBy(x, y);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tx && (el.scrollLeft += x);\n\t\t\t\t\t\t\ty && (el.scrollTop += y);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\tif(isFixed(node)){ return; } // nothing to do\n\t\t\t\twhile(el){\n\t\t\t\t\tif(el == body){ el = scrollRoot; }\n\t\t\t\t\tvar\telPos = geom.position(el),\n\t\t\t\t\t\tfixedPos = isFixed(el),\n\t\t\t\t\t\trtl = style.getComputedStyle(el).direction.toLowerCase() == \"rtl\";\n\n\t\t\t\t\tif(el == scrollRoot){\n\t\t\t\t\t\telPos.w = rootWidth; elPos.h = rootHeight;\n\t\t\t\t\t\tif(scrollRoot == html && (isIE || has(\"trident\")) && rtl){\n\t\t\t\t\t\t\telPos.x += scrollRoot.offsetWidth-elPos.w;// IE workaround where scrollbar causes negative x\n\t\t\t\t\t\t}\n\t\t\t\t\t\telPos.x = 0;\n\t\t\t\t\t\telPos.y = 0;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar pb = geom.getPadBorderExtents(el);\n\t\t\t\t\t\telPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;\n\t\t\t\t\t\tvar clientSize = el.clientWidth,\n\t\t\t\t\t\t\tscrollBarSize = elPos.w - clientSize;\n\t\t\t\t\t\tif(clientSize > 0 && scrollBarSize > 0){\n\t\t\t\t\t\t\tif(rtl && has(\"rtl-adjust-position-for-verticalScrollBar\")){\n\t\t\t\t\t\t\t\telPos.x += scrollBarSize;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telPos.w = clientSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclientSize = el.clientHeight;\n\t\t\t\t\t\tscrollBarSize = elPos.h - clientSize;\n\t\t\t\t\t\tif(clientSize > 0 && scrollBarSize > 0){\n\t\t\t\t\t\t\telPos.h = clientSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(fixedPos){ // bounded by viewport, not parents\n\t\t\t\t\t\tif(elPos.y < 0){\n\t\t\t\t\t\t\telPos.h += elPos.y; elPos.y = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.x < 0){\n\t\t\t\t\t\t\telPos.w += elPos.x; elPos.x = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.y + elPos.h > rootHeight){\n\t\t\t\t\t\t\telPos.h = rootHeight - elPos.y;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.x + elPos.w > rootWidth){\n\t\t\t\t\t\t\telPos.w = rootWidth - elPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// calculate overflow in all 4 directions\n\t\t\t\t\tvar\tl = nodePos.x - elPos.x, // beyond left: < 0\n//\t\t\t\t\t\tt = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0\n\t\t\t\t\t\tt = nodePos.y - elPos.y, // beyond top: < 0\n\t\t\t\t\t\tr = l + nodePos.w - elPos.w, // beyond right: > 0\n\t\t\t\t\t\tbot = t + nodePos.h - elPos.h; // beyond bottom: > 0\n\t\t\t\t\tvar s, old;\n\t\t\t\t\tif(r * l > 0 && (!!el.scrollLeft || el == scrollRoot || el.scrollWidth > el.offsetHeight)){\n\t\t\t\t\t\ts = Math[l < 0? \"max\" : \"min\"](l, r);\n\t\t\t\t\t\tif(rtl && ((isIE == 8 && !backCompat) || has(\"trident\") >= 5)){ s = -s; }\n\t\t\t\t\t\told = el.scrollLeft;\n\t\t\t\t\t\tscrollElementBy(el, s, 0);\n\t\t\t\t\t\ts = el.scrollLeft - old;\n\t\t\t\t\t\tnodePos.x -= s;\n\t\t\t\t\t}\n\t\t\t\t\tif(bot * t > 0 && (!!el.scrollTop || el == scrollRoot || el.scrollHeight > el.offsetHeight)){\n\t\t\t\t\t\ts = Math.ceil(Math[t < 0? \"max\" : \"min\"](t, bot));\n\t\t\t\t\t\told = el.scrollTop;\n\t\t\t\t\t\tscrollElementBy(el, 0, s);\n\t\t\t\t\t\ts = el.scrollTop - old;\n\t\t\t\t\t\tnodePos.y -= s;\n\t\t\t\t\t}\n\t\t\t\t\tel = (el != scrollRoot) && !fixedPos && el.parentNode;\n\t\t\t\t}\n\t\t\t}catch(error){\n\t\t\t\tconsole.error('scrollIntoView: ' + error);\n\t\t\t\tnode.scrollIntoView(false);\n\t\t\t}\n\t\t}\n\t};\n\n\thas(\"extend-dojo\") && lang.setObject(\"dojo.window\", window);\n\n\treturn window;\n});\n"],"sourceRoot":"webpack:///"}