[
  {
    "path": ".gitignore",
    "content": "# These are some examples of commonly ignored file patterns.\n# You should customize this list as applicable to your project.\n# Learn more about .gitignore:\n#     https://www.atlassian.com/git/tutorials/saving-changes/gitignore\n\n*UserInterfaceState.xcuserstate\nCarthage/\nauth.db\nbuild/\nold/\nproducts/\n\n# Node artifact files\nnode_modules/\ndist/\n\n# Compiled Java class files\n*.class\n\n# Compiled Python bytecode\n*.py[cod]\n\n# Log files\n*.log\n\n# Package files\n*.jar\n\n# Maven\ntarget/\ndist/\n\n# JetBrains IDE\n.idea/\n\n# Unit test reports\nTEST*.xml\n\n# Generated by MacOS\n.DS_Store\n\n# Generated by Windows\nThumbs.db\n\n# Applications\n*.app\n*.exe\n*.war\n\n# Large media files\n*.mp4\n*.tiff\n*.avi\n*.flv\n*.mov\n*.wmv\n\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"tcsopensourcetools\"]\n\tpath = tcsopensourcetools\n\turl = git@bitbucket.org:twocanoes/tcsopensourcetools.git\n"
  },
  {
    "path": "ADLDAPPing.swift",
    "content": "//\n//  ADLDAPPing.swift\n//  NoMAD\n//\n//  Created by Michael Lynn, Phillip Boushy on 10/8/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n\nstruct DS_FLAGS : OptionSet {\n    let rawValue: UInt32\n    init(rawValue value: UInt32) {\n        rawValue = value\n    }\n    // List of DS_FLAGS variables\n    // https://msdn.microsoft.com/en-us/library/cc223802.aspx\n    static let DS_PDC_FLAG = DS_FLAGS(rawValue: 1 << 0)\n    // 1 is reserved for future expansion\n    static let DS_GC_FLAG = DS_FLAGS(rawValue: 1 << 2)\n    static let DS_LDAP_FLAG = DS_FLAGS(rawValue: 1 << 3)\n    static let DS_DS_FLAG = DS_FLAGS(rawValue: 1 << 4) //\n    static let DS_KDC_FLAG = DS_FLAGS(rawValue: 1 << 5)\n    static let DS_TIMESERV_FLAG = DS_FLAGS(rawValue: 1 << 6)\n    static let DS_CLOSEST_FLAG = DS_FLAGS(rawValue: 1 << 7)\n    static let DS_WRITABLE_FLAG = DS_FLAGS(rawValue: 1 << 8)\n    static let DS_GOOD_TIMESERV_FLAG = DS_FLAGS(rawValue: 1 << 9)\n    static let DS_NDNC_FLAG = DS_FLAGS(rawValue: 1 << 10)\n    static let DS_SELECT_SECRET_DOMAIN_6_FLAG = DS_FLAGS(rawValue: 1 << 11)\n    static let DS_FULL_SECRET_DOMAIN_6_FLAG = DS_FLAGS(rawValue: 1 << 12)\n    static let DS_WS_FLAG = DS_FLAGS(rawValue: 1 << 13)\n    static let DS_DS_8_FLAG = DS_FLAGS(rawValue: 1 << 14)\n    static let DS_DS_9_FLAG = DS_FLAGS(rawValue: 1 << 15)\n    // 16 - 28 are reserved for future expansion\n    static let DS_DNS_CONTROLLER_FLAG = DS_FLAGS(rawValue: 1 << 29)\n    static let DS_DNS_DOMAIN_FLAG = DS_FLAGS(rawValue: 1 << 30)\n    static let DS_DNS_FOREST_FLAG = DS_FLAGS(rawValue: 1 << 31)\n}\n\nclass ADLDAPPing {\n    //var currentDataLocation: Int\n    var type: UInt32 //uint32\n    var flags: DS_FLAGS //uint32\n    var domainGUID: UUID\n    var forest: String //rfc1035\n    var domain: String //rfc1035\n    var hostname: String //rfc1035\n    var netbiosDomain: String //rfc1035\n    var netbiosHostname: String //rfc1035\n    var user: String //rfc1035\n    var clientSite: String //rfc1035\n    var serverSite: String\n\n    class func decodeGUID(_ buffer: Data, start: Int) -> UUID {\n        var bytes: [UInt8] = [UInt8](repeating: 0, count: 16)\n        let length: Int = 16\n        (buffer as NSData).getBytes(&bytes, range: NSRange(location: start, length: length))\n        return (NSUUID(uuidBytes: bytes) as UUID)\n    }\n\n    class func decodeUInt32(_ buffer: Data, start: Int) -> UInt32 {\n        var value: UInt32 = 0\n        let length: Int = 4\n        (buffer as NSData).getBytes(&value, range: NSRange(location: start, length: length))\n        return value\n    }\n\n    enum DecodeError: Error {\n        case illegalTag\n        case cyclicPointer\n    }\n\n    class func decodeRFC1035(_ buffer: Data, start: UInt16, seen: Set<UInt16>?) throws -> (r: String, c: UInt16) {\n        let marker: UInt8 = 0xc0\n        var cursor: UInt16 = start\n        var result: [String] = []\n        var pointers: Set<UInt16>\n        pointers = Set<UInt16>()\n        if (seen != nil) {\n            pointers.formUnion(seen!)\n        }\n        while true {\n            var tag: UInt8 = 0\n            (buffer as NSData).getBytes(&tag, range: NSRange(location: Int(cursor), length: 1))\n            cursor += 1\n            if (tag == 0) {\n                // end of a sequence, time to tally up and return results\n                break\n            } else if ((tag & marker) == marker) {\n                var byte: UInt8 = 0\n                (buffer as NSData).getBytes(&byte, range: NSRange(location: Int(cursor), length: 1))\n                cursor += 1\n                // we would appear to have a pointer, let's remember it\n                var ptr: UInt16 = 0\n                let d: [UInt8]  = [byte, (tag & ~marker)]\n                //\t\t\t\tptr += UnsafePointer<UInt16>(d).pointee\n                ptr += UnsafePointer(d).withMemoryRebound(to: UInt16.self,\n                                                          capacity: 1) {\n                                                            $0.pointee\n                }\n                // check if we've seen it before already\n                if pointers.contains(ptr) {\n                    throw DecodeError.cyclicPointer\n                }\n                pointers.insert(ptr)\n                let (sresult, _) = try ADLDAPPing.decodeRFC1035(buffer, start: ptr, seen: pointers)\n                result.append(sresult)\n                break\n            } else if ((tag & marker) > 0) {\n                throw DecodeError.illegalTag\n            } else {\n                // read 'tag'-many bytes\n                var s: [UInt8] = [UInt8](repeating: 0, count: Int(tag))\n                (buffer as NSData).getBytes(&s, range: NSRange(location: Int(cursor), length: Int(tag)))\n                cursor += UInt16(tag)\n                result.append(NSString(bytes: s, length: Int(tag), encoding: String.Encoding.utf8.rawValue)! as String)\n            }\n        }\n        let final = result.joined(separator: \".\")\n        return (final, cursor)\n    }\n\n    init?( ldapPingBase64String: String ) {\n        //let cleanedNetlogonBase64String = netlogonBase64String.componentsSeparatedByString(\": \")[1]\n        guard let netlogonData = Data(base64Encoded: ldapPingBase64String, options: []) else {\n            myLogger.logit(.notice, message: \"Netlogon base64 encoded string is invalid.\")\n            return nil\n        }\n        var cursor = UInt16(24)\n\n        type = ADLDAPPing.decodeUInt32(netlogonData, start: 0)\n        let tempFlags = ADLDAPPing.decodeUInt32(netlogonData, start: 4)\n        //flags = ADLDAPPing.decodeUInt32(netlogonData, start: 4)\n\n        // Decode Flags\n        flags = DS_FLAGS(rawValue: tempFlags)\n        //flags.contains(.DS_PDC_FLAG)\n\n        TCSLogWithMark(\"Is PDC: \" + flags.contains(.DS_PDC_FLAG).description)\n        TCSLogWithMark(\"Is GC: \" + flags.contains(.DS_GC_FLAG).description)\n        TCSLogWithMark(\"Is LDAP: \" + flags.contains(.DS_LDAP_FLAG).description)\n        TCSLogWithMark(\"Is Writable: \" + flags.contains(.DS_WRITABLE_FLAG).description)\n        TCSLogWithMark(\"Is Closest: \" + flags.contains(.DS_CLOSEST_FLAG).description)\n\n\n        // END\n\n        domainGUID = ADLDAPPing.decodeGUID(netlogonData, start: 8)\n        // Get forest\n        do {\n            (forest, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get domain\n        do {\n            (domain, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get hostname\n        do {\n            (hostname, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get netbiosDomain\n        do {\n            (netbiosDomain, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get netbiosHostname\n        do {\n            (netbiosHostname, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get user\n        do {\n            (user, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get the site the DC is in.\n        do {\n            (serverSite, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n        // Get the site the client is in.\n        do {\n            (clientSite, cursor) = try ADLDAPPing.decodeRFC1035(netlogonData, start: cursor, seen:nil)\n        } catch let error {\n            switch error {\n            case DecodeError.cyclicPointer:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string created loop.\")\n            case DecodeError.illegalTag:\n                myLogger.logit(.notice, message: \"Decoding RFC1035 string found an illegal tag.\")\n            default:\n                myLogger.logit(.notice, message: \"Unable to decode RFC1035 string.\")\n            }\n            return nil\n        }\n    }\n    \n}\n"
  },
  {
    "path": "BUILD.md",
    "content": "# Building XCreds\n\ngit clone https://github.com/twocanoes/xcreds.git\ncd xcreds\ngit submodule init\ngit submodule update\ncarthage update\nxcodebuild\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\r\n\r\n## 4.1.6375 (28/02/2024)\r\n## 4.1.6375 (2024-02-28)\r\n\r\n*  updated release notes, fixed script typo [View](https://github.com/twocanoes/xcreds/commit/cdd59f8bfe7b6153c038fb2bbfcc2e2b663b8380)\r\n*  updated release notes [View](https://github.com/twocanoes/xcreds/commit/88c96dff9b1de5199bf8511c4cf04c21bb42daa8)\r\n*  added remounting and refresh kerb ticket after network change [View](https://github.com/twocanoes/xcreds/commit/8db9ec64dab9655635cf7b5cd4f0a5911c1e344a)\r\n*  fixed \"Sign in\" window issue (OIDC and AD Configured) #170 and Admin user set to Standard user on Local Login #173 [View](https://github.com/twocanoes/xcreds/commit/0b8d9feab4e8dc9bf2d3c31377d2d7bacd49cb01)\r\n*  Sign in prompted (While not connected to a network) #168 [View](https://github.com/twocanoes/xcreds/commit/4ccca1c62d3308a1bcbefe9caf3af83a8c5ad7d9)\r\n*  updated profile manifest [View](https://github.com/twocanoes/xcreds/commit/fb8ca59c9951b13c458cb2a2391527dcd221085a)\r\n*  [Feature Request] Local User Behavior #174 [View](https://github.com/twocanoes/xcreds/commit/009d1bfc6d2c849194f207e0106cdafe5226e179)\r\n*  fixed crash on menu and edge case with both web and username password views showing [View](https://github.com/twocanoes/xcreds/commit/d6a1b173fc42c3a9724c3e484ab3f06afb26ba9c)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/d5840c37a8410fbf4076ee362d720da4910ff2dd)\r\n\r\n\r\n## 4.1.6346 (2024-02-13)\r\n\r\n*  added fix for override still prompting when overridesilent set [View](https://github.com/twocanoes/xcreds/commit/dec4a69c78ff5ee8876c6b00d33a1a09400ced92)\r\n*  fixed silentoverride issue [View](https://github.com/twocanoes/xcreds/commit/253a29c608e728c6177bd86e4ec70339611e95a8)\r\n*  fixed multiple share mounting [View](https://github.com/twocanoes/xcreds/commit/fbc40e45085a2c338f671f5fb827828e2683950d)\r\n*  fixed Update manifest pfm_last_modified and pfm_version #164 [View](https://github.com/twocanoes/xcreds/commit/a9f5ccc89dd7a7b673d3886aedef8073fe87c980)\r\n*  implemented [Feature Request] AD - Option to hide Sign-In menu item #150 [View](https://github.com/twocanoes/xcreds/commit/629dfe117cd0665192a536f6f984dbf00a31ee57)\r\n*  implemented [Feature Request] Standard wallpaper options for default background #155 [View](https://github.com/twocanoes/xcreds/commit/81509683f4e54462c6cc697331132980ee7b58a1)\r\n\r\n\r\n## 4.1.6313 (2024-02-06)\r\n\r\n*  fixed issue with menu item not updating tokens [View](https://github.com/twocanoes/xcreds/commit/7661fc2d703c065a9a71b0751a6427f1b636783e)\r\n*  fixed automount [View](https://github.com/twocanoes/xcreds/commit/8a9f8c2aa143ab3138e2741e2ce6061cdd35419b)\r\n*  remove admin if we made them admin [View](https://github.com/twocanoes/xcreds/commit/e87ec92d5bdb3ace68060f6db3469d76d0dbf0cc)\r\n*  added check for not removing last admin user [View](https://github.com/twocanoes/xcreds/commit/fbe883413f83d7f96fb5ba0da68ca93ced5e9484)\r\n*  fixed prompting when both AD and cloud are configured [View](https://github.com/twocanoes/xcreds/commit/32f2bebb4707ed70e21ccfb50f30d09eff076ce9)\r\n*  added kerberosprincipalname pref and getting kerb ticket with oidc login [View](https://github.com/twocanoes/xcreds/commit/c14fd13e6e347d9be49a709531ecb24b08bafb96)\r\n*  added menuItemWindowBackgroundImageURL [View](https://github.com/twocanoes/xcreds/commit/7c81253b3643a76c0468d4424344f61fe578d520)\r\n*  better selection of menu item prompting if both AD and OIDC is setup [View](https://github.com/twocanoes/xcreds/commit/a4140ace5ca7f22d26bf502da72fd928dc4388c6)\r\n*  fixed issue with ACL on tokens in keychain [View](https://github.com/twocanoes/xcreds/commit/4aeda19969b358ae27baa02aec067ac0f9318a29)\r\n*  added custom menu item pref [View](https://github.com/twocanoes/xcreds/commit/9453fbd3a3b09887ffd1807dee6ae9e6e8eb574a)\r\n*  ability to customize Share menu item; added username for AD and OIDC in menu [View](https://github.com/twocanoes/xcreds/commit/b67970aaa2a5ef450cb6d5888338ce4536a2e891)\r\n*  added pref for shares [View](https://github.com/twocanoes/xcreds/commit/9c8d920744cd44a2b27163db2c1a84d81c5665b3)\r\n*  added better descriptions to share manifest [View](https://github.com/twocanoes/xcreds/commit/2004767b7c99782c41f3b0a43079ce92daa22374)\r\n*  updated whats new [View](https://github.com/twocanoes/xcreds/commit/f81c831706a7fdbf124a5d0926fe790b728a4366)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/a3ca6493d51a71006d2e612df747ea1c1747acb9)\r\n\r\n\r\n## release-4.0 (2024-01-29)\r\n\r\n\r\n\r\n## 4.0.6274 (2024-01-29)\r\n\r\n*  fixed issue with local password update [View](https://github.com/twocanoes/xcreds/commit/b12e859184f6812080906256315d1d7b2f29e496)\r\n*  updated ropg prefs and checking [View](https://github.com/twocanoes/xcreds/commit/e3149de819f2b72a7e11f9891815de5d5c6511b9)\r\n*  Minor fixes for ropg [View](https://github.com/twocanoes/xcreds/commit/f99bdd5aa288331c469bd8d6fca83af3642fd622)\r\n*  fixed passwordElementID preference can cause issue with setting local password #161 [View](https://github.com/twocanoes/xcreds/commit/5b547377d591c7e8dcfc6165197fcf5d94bd881b)\r\n*  PasswordOverwriteSilent does not prevent user prompt for password #160 [View](https://github.com/twocanoes/xcreds/commit/a438d09a10fa35c914877559a8bab415083a428a)\r\n*  shouldUseROPGForMenuLogin hides offline login option at XCreds login window #158 [View](https://github.com/twocanoes/xcreds/commit/17f24dd92b8c83bb591b5cd9bb50e41c9ac4086f)\r\n*  Improvement for refreshRateMinutes description #157 [View](https://github.com/twocanoes/xcreds/commit/cc6e736f0429bb78ac0a925395b305f21d98af4a)\r\n*  Typos in manifest descriptions #156 [View](https://github.com/twocanoes/xcreds/commit/eae6dff1654237d13bbab857a5e1d8c30c5ffe11)\r\n*  added release notes [View](https://github.com/twocanoes/xcreds/commit/af102f94dd2fdf999b775f6c01cc2fbd98935819)\r\n\r\n\r\n## 4.0.6261 (2024-01-15)\r\n\r\n*  built release notes [View](https://github.com/twocanoes/xcreds/commit/7440e188957a5c489891d75513dad33df2ec6aec)\r\n*  applied patch from Jim Zajkowski to fix integration issues [View](https://github.com/twocanoes/xcreds/commit/278862f63decc361c2dcc1e99da541c431b7099d)\r\n*  fixed up kerb ticket status in menu [View](https://github.com/twocanoes/xcreds/commit/93371b9a3b32c7f09e23d1b55fb1c783ffd580de)\r\n*  refactored menu code [View](https://github.com/twocanoes/xcreds/commit/a76b7f843d4a156233abeb9039152748e2dc52c9)\r\n*  fixed issue with updating keychain [View](https://github.com/twocanoes/xcreds/commit/d0b70c3142e385a51c79c1f94812393a6067e178)\r\n*  more attempt at sharemounter integration [View](https://github.com/twocanoes/xcreds/commit/18e44d1d6b156ffb63686db8d52905e287dc5f24)\r\n*  implemented shares [View](https://github.com/twocanoes/xcreds/commit/8bd74a3ac8fe78088e280c19d9ee80eeb1658129)\r\n*  added additional sample profiles [View](https://github.com/twocanoes/xcreds/commit/721bf74a6f58cce0b09b1aa2e88f6317b643bede)\r\n*  fixed home mounting [View](https://github.com/twocanoes/xcreds/commit/b4ffa8ff9788cdd76694174c54dd0bc3ce9ddbcc)\r\n*  fixed enabing window state with AD [View](https://github.com/twocanoes/xcreds/commit/24d17c9845baa29acbd7ec408c02553dd4d7ea3d)\r\n*  pointed package to main branch for oidclite [View](https://github.com/twocanoes/xcreds/commit/7f23a07412363c7d45ce093eaff0bbac644265bb)\r\n*  Allow forcing of webview login window [View](https://github.com/twocanoes/xcreds/commit/88eaaf49ff27a7fb38c879d15e597912f06c0d29)\r\n*  Support separate client ID and secret for ropg [View](https://github.com/twocanoes/xcreds/commit/4e008168bbf206d6678d7c1649e26ec7424928a3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/7d5fba55eab2430038c2a86b79c08f714316e57b)\r\n*  fixed issue with ropg clientid/secret selection [View](https://github.com/twocanoes/xcreds/commit/1642241ea03ddc43b4a04b7e9a4f0885113ab4dc)\r\n*  Keychain is reset on cloud password change when user enters old local password #148 [View](https://github.com/twocanoes/xcreds/commit/79f1bb531ce5fa20389b4fed319bac3539314e96)\r\n*  Admin status does not change after removed from group #145 [View](https://github.com/twocanoes/xcreds/commit/f9821f992afe305d2be9bec0ee0aec9e1b5dbdca)\r\n*  Fix manifest key name for loadPageInfo #143 [View](https://github.com/twocanoes/xcreds/commit/b747d621e864a40906b13b85e6d184ead1fb485c)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/aad768b0f0b76345a3e7ee2ea0d02fbcf6e953b1)\r\n\r\n\r\n## 4.0.6203 (2024-01-01)\r\n\r\n*  added release notes and script to generate release notes [View](https://github.com/twocanoes/xcreds/commit/ff9dc64fea8e6f438755e1d72837fce4391d167c)\r\n*  Feature Request: Allow \"loadpage.html\" to be customized. #126. To test, add in new keys \"loadPageTitle\" and \"loadPageInfo\" or try the xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/37c7477f66362c1823c49138b49afcad388abbc5)\r\n*  Update description in manifest for loginWindowWidth and loginWindowHeight #138 [View](https://github.com/twocanoes/xcreds/commit/5951d753b391fda49534c5dda13d508479e66fd8)\r\n*  [feature request] LocalAD - make sync password with AD optional with preference key #130. To test, set the shouldPromptForADPasswordChange to false and set the user account to require password change on next login and verify the user is not prompted [View](https://github.com/twocanoes/xcreds/commit/0b85b4ffb8e95b8d79ffcf455ac034c05ce4d4f4)\r\n*  XCreds breaking Munki's logout/install @loginscreen logic #102. Test by defining hideIfPathExists to a path like /tmp/hide and then add/remove and UI should show /hide. Or use sample profile xcreds_example_azure_hide.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/770c179262658ccfd27f9de3808b931cc69a86e4)\r\n*  Option to enforce account to log in #21. To test, create allowedUsersArray with name of user allowed to log in and define allowUsersClaim with an OIDC claim that contains that value. Or use the xcreds_example_azure_allow_fred.mobileconfig to test [View](https://github.com/twocanoes/xcreds/commit/ee95927865f1e912898c4d030cb367fd589db114)\r\n*  Feature Request: Force Wi-Fi on option or Wi-Fi on/off switch in \"Configure Wi-Fi\" #58 [View](https://github.com/twocanoes/xcreds/commit/bfa28014c7d0c000369d49bf9a3896128616901a)\r\n*  added removeadmin function but not used since it can cause local admins to unadmin [View](https://github.com/twocanoes/xcreds/commit/cc322befaf88bf3440a9d086089468660a4354f3)\r\n*  loginWindowBackgroundImageURL image should be cached if not a file:// URL #72 [View](https://github.com/twocanoes/xcreds/commit/b2cfd643ac6419904cc30037eaceaf5bb939cc7b)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/500575b7dfa81c7a9a7231aeac88bd3cfe6a5497)\r\n\r\n\r\n## 4.0.6177 (2023-12-28)\r\n\r\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\r\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552)\r\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017)\r\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8)\r\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7)\r\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd)\r\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14)\r\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20)\r\n*  https://github.com/twocanoes/xcreds/issues/54 [View](https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\r\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f)\r\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3)\r\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f)\r\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)\r\n*  ropg at login window initial implementation [View](https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)\r\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)\r\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2)\r\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300)\r\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b)\r\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad)\r\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976)\r\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41)\r\n\r\n\r\n## 4.0.6023 (2023-12-12)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow [View](https://github.com/twocanoes/xcreds/commit/6f3737257205f4d2faa035b6f051bf6bfed2074b)\r\n*  refactored code to add admin to user account based on group membership each login (issue #109); added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) [View](https://github.com/twocanoes/xcreds/commit/8376942e6e23f8804bd5cec3cfff383792391031)\r\n*  updated license agreement (issue #90) [View](https://github.com/twocanoes/xcreds/commit/f41411c5a51706ba7b33776edc845a409400bf1e)\r\n*  Detect when no password was entered #17 [View](https://github.com/twocanoes/xcreds/commit/7cf2837f3d653a893f2f5c031c0a72298340aa70)\r\n*  updated animation when logging in [View](https://github.com/twocanoes/xcreds/commit/51387b15384032bc5f4e82a5d6fea8a49c6e2625)\r\n*  adding arbitrary claims to local DS user account [View](https://github.com/twocanoes/xcreds/commit/e47832e21a76d3ae86af3e7e5fee41f29772436f)\r\n*  fixed Active Directory issue after password change #112 [View](https://github.com/twocanoes/xcreds/commit/14e2a7c1e1d15e8655f44bef182a2e14bc0892ce)\r\n*  partial fix for #114 [View](https://github.com/twocanoes/xcreds/commit/856a3549bec86c6c52b4ed368b2e59d25c38c5a7)\r\n*  refactored windows to views [View](https://github.com/twocanoes/xcreds/commit/8a0994c7dfbe071ce5397d52070c2a4c9ab9a309)\r\n*  fixed centering and cloud login sizing [View](https://github.com/twocanoes/xcreds/commit/f83d523c57cf9f65f6f1b7931bdf34ad5a04c090)\r\n*  fixing timing for animation when logging in; tweaked UI [View](https://github.com/twocanoes/xcreds/commit/9c659dbb4a12c9ee4cbe396119a058d2594e6827)\r\n*  streamlined startup process [View](https://github.com/twocanoes/xcreds/commit/1895f0365a3aba91fc9c43961bca78ee6a9482e6)\r\n*  refactored dialogs for prompting for user info; fixed ad groups for making admin user [View](https://github.com/twocanoes/xcreds/commit/7c5af73cb91a83c8f323edc1d8bd9538b02fbd71)\r\n*  added missing template for package [View](https://github.com/twocanoes/xcreds/commit/281fe86d7bb33c7f278f05117794069c991efb47)\r\n*  fixed showing offline button [View](https://github.com/twocanoes/xcreds/commit/72ffc3fd5434eb742e1cffa3cb073228f4883292)\r\n*  implemented feature request: localad/kebereros support for saving groups to prefs #125 [View](https://github.com/twocanoes/xcreds/commit/1d3e2be0a87c3e5d2843767db28de90894bc12cc)\r\n*  fixed enabling views when logging in [View](https://github.com/twocanoes/xcreds/commit/3ac6e3739200a3ae6f708be731c4d7acdf279e7e)\r\n*  fixed javascript to key on input instead of keydown/keyup [View](https://github.com/twocanoes/xcreds/commit/3d41a199cfd92f233677cc6859f837ede388311c)\r\n*  implemented Prompt for Secure Token Admin Login When Required #123 [View](https://github.com/twocanoes/xcreds/commit/32b118fe0c96b6cee8bd8a37bcff22611f28e55b)\r\n*  fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 [View](https://github.com/twocanoes/xcreds/commit/21814425a055f0240fb4c11c37c0d01045620fd6)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/a5aca79363b6f3cc974442534bbc7818b0e4775b)\r\n*  fixed issue with updating password in userspace [View](https://github.com/twocanoes/xcreds/commit/9e483c451eccac80fc533f993fe21a526970fd9e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/867fc0f3337cde76a06cb821471de2bcd6fb9506)\r\n\r\n\r\n## v3.2.1.6002 (2023-12-11)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/e621f6a8da59c6923f0ba12b6a3abf5c9a916f34)\r\n*  bumped version and build [View](https://github.com/twocanoes/xcreds/commit/7140e72c2e619e26b2db99e21f917f6b3147570a)\r\n*  adde missing credits file [View](https://github.com/twocanoes/xcreds/commit/81f8e48a696c1eeab46bbcb4f36eea66fe6113f4)\r\n\r\n\r\n## v3.3.5269 (2023-11-27)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n\r\n\r\n## v3.2.5197 (2023-10-17)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated url in profile manifest [View](https://github.com/twocanoes/xcreds/commit/33ef0c9f2f30afc4260526b27ee4e6995e94fcfa)\r\n*  fixed issue 95: whitespace characters in password and username [View](https://github.com/twocanoes/xcreds/commit/63f4ca53c2c1ba31fd93fd4921042d21284570c6)\r\n*  shouldPreferLocalLoginInsteadOfCloudLogin [View](https://github.com/twocanoes/xcreds/commit/79e798afab9162255b7a019b74bbb3122330e83a)\r\n*  another attempt at fixing https://github.com/twocanoes/xcreds/issues/95 [View](https://github.com/twocanoes/xcreds/commit/819e9a047f8d1e9e6d5a4f26b32238cb7fc9da88)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/4ac36cbc2d085ee32bd8d82a66feeb925ff118fb)\r\n*  fixed keyboard nav for controls [View](https://github.com/twocanoes/xcreds/commit/c5c0cad10f5d5f22f8b6ce3d0993f5f1f72d8f3b)\r\n*  issue #100: Detect Offline [View](https://github.com/twocanoes/xcreds/commit/fe804f167446fc4b22e128cca576ddd7276fd96f)\r\n*  Add ability to check passwords via ROPG [View](https://github.com/twocanoes/xcreds/commit/f7c62c0466106cbc26f9f67be441dad847c32ecf)\r\n*  Rename prefkey to be more boolean [View](https://github.com/twocanoes/xcreds/commit/2909f625588fe25c2082fbf2ff88df468e19c79d)\r\n*  update to profile manifest [View](https://github.com/twocanoes/xcreds/commit/7fcb0a392b0e8d8c19e81f8e827d6de996da75c4)\r\n*  fixed typo in function name [View](https://github.com/twocanoes/xcreds/commit/8c12d454e393cc0c52a0feb314a67c357bbac1c9)\r\n*  added a smidge more logging [View](https://github.com/twocanoes/xcreds/commit/86256a2825eeeebf6eb63fe26451c372e149c2a2)\r\n*  added self healing for auth rights [View](https://github.com/twocanoes/xcreds/commit/9b43e1cb382cfea1b40a2f40b6cdf6189fed385b)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/7cdf884f2aed100080069e9b3a589af736062c99)\r\n\r\n\r\n## release_3_1 (2023-07-14)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated history.md [View](https://github.com/twocanoes/xcreds/commit/85b71172d3192616371ccc30ea16fb6dd092a54e)\r\n*  fixed check timer to still work if mac sleeps [View](https://github.com/twocanoes/xcreds/commit/af491f5febf433bfeb8478d71a2fa29309676765)\r\n*  fixed issue with token update time [View](https://github.com/twocanoes/xcreds/commit/0d14279e4003400a0fef812247f3c790fc802f5e)\r\n*  fixed fade; cleaned up user mappings for weird characters [View](https://github.com/twocanoes/xcreds/commit/c6304954d6b02109d4ff90ed2d3b94963f761461)\r\n*  final touches [View](https://github.com/twocanoes/xcreds/commit/df5f1110c5800ac8aa31293ac509817a62fedfbc)\r\n*  bumped to 3.2; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/5a544859855835a6c1d8bfb35a39aeb30cda5962)\r\n*  bumped build number to 5000 [View](https://github.com/twocanoes/xcreds/commit/6250fdf999d7e57bfd51fe55186fde6fce92a3c0)\r\n*  updated permission for override_script [View](https://github.com/twocanoes/xcreds/commit/fac2af918a65d5f92c211e4707e9e14d36e5bee1)\r\n*  changed version back to 3.1; added better about window with history; changed override script requirments to be owned by _securityagent and be 700 [View](https://github.com/twocanoes/xcreds/commit/2f8dd4e599a71d02a88fa4a66814e419c71c0e65)\r\n*  added command click login window for mac login window [View](https://github.com/twocanoes/xcreds/commit/f0a5b1fc76c133f199da75f31202401476da2af1)\r\n*  text fixes [View](https://github.com/twocanoes/xcreds/commit/97c383e24729982c364e456ba5c3d49aa983060a)\r\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/b4fd79d1d43d922fac3581282c7eb9126d33ed8c)\r\n*  added back sample profie [View](https://github.com/twocanoes/xcreds/commit/6aa3ec4a58842f9a4dd748cd129ed4c14226888a)\r\n*  fixed timer minutes [View](https://github.com/twocanoes/xcreds/commit/e78b306018cd996176b9530ba302689bd1d3e358)\r\n\r\n\r\n## v3.1.4144 (2023-06-08)\r\n\r\n*  updated AD support: kerb ticket now obtained at user space app launch from password in keychain. udpated profile manifest with better comments; delete cookes on webview each time it appears; added local login button; shows username password if discoveryURL is not defined [View](https://github.com/twocanoes/xcreds/commit/d17509bd2ce49313561632e15bc2698e38f09721)\r\n\r\n\r\n## v3.1.4143 (2023-06-07)\r\n\r\n*  updated fullname [View](https://github.com/twocanoes/xcreds/commit/627199474b42349bd42f6dc47c4cd442b9c3357a)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d2370669893dc37937617be59a5601109915e991)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d0f4efdbf886cbe9a21e449fe8d47f1ed671bdcd)\r\n*  get kerb ticket on login [View](https://github.com/twocanoes/xcreds/commit/b7f7ad622ceaa57d27e419fa3fad10f0e040f8e3)\r\n\r\n\r\n## v3.1.4081 (2023-05-27)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added Package.resolved [View](https://github.com/twocanoes/xcreds/commit/91fb7f3da5e789dabb37a5a8585592c69c1a732c)\r\n*  added XCredsLoginPlugIn/errorpage.html [View](https://github.com/twocanoes/xcreds/commit/7bf66a34a1ef091f532959de62247ba1fbead13e)\r\n*  cleaned up build system a bit [View](https://github.com/twocanoes/xcreds/commit/f99ec4a8ae38ff00adabe9b43c1ff8577c803dd1)\r\n*  improved javascript parsing [View](https://github.com/twocanoes/xcreds/commit/ecf710eb181fd3f6dbdce7aedf511b8840e33ca6)\r\n*  fixed issue with initial javascript listener [View](https://github.com/twocanoes/xcreds/commit/574a51b5b8329be4cc2ec8c045f710548aecf7d6)\r\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/dfbf57f4a3d9649e2b35231bfedc6d591a7c3e41)\r\n*  removed reset option [View](https://github.com/twocanoes/xcreds/commit/3150fa654f3b8a55018f0a1e0390aa6ec541e125)\r\n*  removed KeychainReset and PasswordOverwriteSilent because it makes things worse [View](https://github.com/twocanoes/xcreds/commit/39362899ee0c0813f416057cad203061869daa84)\r\n*  added lock screen switch to login window [View](https://github.com/twocanoes/xcreds/commit/77c52ad11ab01b1afd5e011b38a06b3de9527196)\r\n*  fixed window levels, progress screen, background and boot runner issues [View](https://github.com/twocanoes/xcreds/commit/4c887fbdc82a0f63fcd8876aa662c6bc96ef7bbd)\r\n*  improved logging [View](https://github.com/twocanoes/xcreds/commit/e92ffe9e65f1a95b4b3e9f1c8ea1089ae7720863)\r\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/488b66494c65e8460eefdf5bbb8c0d271102f298)\r\n*  added override script and secure token admin reset [View](https://github.com/twocanoes/xcreds/commit/6717b3aa2cd0ef9d387484e7571183e6f8ffbb5d)\r\n*  removed shouldFindPasswordElement since that is defaulit fallback behavior [View](https://github.com/twocanoes/xcreds/commit/2825ee7b6db005f6aa8ca6d60c72210ae7343af4)\r\n*  cleaned up ui a bit [View](https://github.com/twocanoes/xcreds/commit/b64496bcb55573dff889a9ab92be2ed3f9cdd5e3)\r\n*  dont refresh prefs so much [View](https://github.com/twocanoes/xcreds/commit/91ee8dcd371fe9e2182fd421674f9fcd484e4d81)\r\n*  added check for group membership in oidc claim [View](https://github.com/twocanoes/xcreds/commit/2c03586a59821a04948692dcb9a41006ebf735f7)\r\n*  added history file [View](https://github.com/twocanoes/xcreds/commit/5fa6c0436a58535e03fd457de9dd720186274a38)\r\n\r\n\r\n## release-3.0 (2023-05-08)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n\r\n\r\n## release_3_0 (2023-04-18)\r\n\r\n*  added trial license beginnings [View](https://github.com/twocanoes/xcreds/commit/5a6cc5a91715e909dc8f9510f800dfffe485b7d6)\r\n*  fixed regression for password change not capturing new password on azure [View](https://github.com/twocanoes/xcreds/commit/8db379d829d925409abfea85da72a788ead43d22)\r\n*  bumped version to 3600 [View](https://github.com/twocanoes/xcreds/commit/f9601726f3d7255414d4ad44e20b9ac526af0f7c)\r\n*  fixed issue with crash if time is far off [View](https://github.com/twocanoes/xcreds/commit/9c1d0d81ed62f525614b79e3a3dbc4b4bed3964b)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/f309f95218424ca8f67177b0daed79d98344e943)\r\n*  updated license [View](https://github.com/twocanoes/xcreds/commit/534be3e278d1daae48218952d20194e4e03b17b4)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/e3c87a548a9e682b75ec01b4216ddfdda8a2ced2)\r\n\r\n\r\n## release_v2_4 (2023-03-28)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added more logging for id token and bumped version to 2.3 [View](https://github.com/twocanoes/xcreds/commit/b8494ee343dab510fba1c1f304623efc985455a0)\r\n*  added remove keychain option [View](https://github.com/twocanoes/xcreds/commit/19032d8df58c0bdd6197fc47f9f3aa2d8d6694ea)\r\n*  updated language on keychain option and added pref in manifest [View](https://github.com/twocanoes/xcreds/commit/709a7f29e696c088cc8e13959dadba8f9c0f8c8e)\r\n*  added key for customizing return to xcreds; added preference and ability to automatically refresh login window [View](https://github.com/twocanoes/xcreds/commit/514a1ba5ddaec55bfb8e40ca3e6c98a43c50ec7b)\r\n*  added in login window height/width [View](https://github.com/twocanoes/xcreds/commit/18e974e67f2833862a1a6913a6c4563e339d4239)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/6090d5ec4895045448920e774e16dc0614223919)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/0a7dad70364bd830b8028da2cadd62c98b79271d)\r\n*  fixed login window size and background image [View](https://github.com/twocanoes/xcreds/commit/339a66e7fdf6e8484da8f7c0a5c2ee6eed0aaef7)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/992512bb1ac27f36c655d1e1a02eafdbd47a2b80)\r\n*  updated sample configu [View](https://github.com/twocanoes/xcreds/commit/cd482e69520c8a7994eb8233e26c8a008c5048e7)\r\n*  tweaked text for user space refresh token window and added pref to show or hide [View](https://github.com/twocanoes/xcreds/commit/9f29893203caef8799683cc2ded3345f306c4528)\r\n*  fixed names and links in manifest [View](https://github.com/twocanoes/xcreds/commit/e759138ca72f2a4153fbea02f7b0b5cfd031bd01)\r\n*  fixed crashing issue due to null refreshview outlet [View](https://github.com/twocanoes/xcreds/commit/d3931983b53633c91c33494fc1fcccd7614948ad)\r\n*  added frontmost when prompting for keychain password [View](https://github.com/twocanoes/xcreds/commit/92ee6ed5c41dfefc798f1c839193aaa4a4a09f67)\r\n*  fixed issue with autorefresh [View](https://github.com/twocanoes/xcreds/commit/d7126a026281afaac27c9381a9c4e42d472b4b31)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/7a3d45178e299b52014fb3dd0adf6c180667222f)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/9ef84939d56cce29c9b8e3a84b0f070a30f7e30c)\r\n*  added 802.1x support; added support for pref key for finding password based on type=password [View](https://github.com/twocanoes/xcreds/commit/38ddeff5cd86d0cd43a97844c9d160da0ee446f3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/72da3de9c054f4fb35fb19c9bb6ffd5c2ebbb47a)\r\n\r\n\r\n## release_v2_1 (2023-01-11)\r\n\r\n\r\n\r\n## realease_v2_2 (2023-01-11)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  support getting password with get and adfs [View](https://github.com/twocanoes/xcreds/commit/494fdf75c79d8aa3b2c3cc6dc947f4423b2b3674)\r\n*  Revert \"support getting password with get and adfs\" [View](https://github.com/twocanoes/xcreds/commit/425bda9a9323fd7eb9437f09f9da63747db9dc8d)\r\n*  changed pref names for custom IDP / ADFS [View](https://github.com/twocanoes/xcreds/commit/83947497ec00cdfd7ec3b9a3683fa3b8e007aadf)\r\n*  fixed package template issue and updated manifest [View](https://github.com/twocanoes/xcreds/commit/f2540a6c64b5bc9971833e8fa859821d4822af9c)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  enabled rekeying FileVault implementation [View](https://github.com/twocanoes/xcreds/commit/2ba233e3695b8a7bda297b0908da933d24bec1c4)\r\n*  Support a Azure AD host [View](https://github.com/twocanoes/xcreds/commit/c0415863273f9797808d32633d3e800d630f9a0f)\r\n*  If fullname is empty, shorname is used. [View](https://github.com/twocanoes/xcreds/commit/7764740647f8e4450b411fa08849e5f4cceba078)\r\n*  added autologin when fv enabled [View](https://github.com/twocanoes/xcreds/commit/c8b394e055e2aa176af8a7f9e8cce53a3066f408)\r\n*  added okta compatibility [View](https://github.com/twocanoes/xcreds/commit/5f38e70e641bc2c8129e940ae7e9f710380fea5b)\r\n*  added a bit more logging [View](https://github.com/twocanoes/xcreds/commit/e2d2330a5050ab419290de466cef9f0b63407215)\r\n*  removed \"prompt\":\"consent\" [View](https://github.com/twocanoes/xcreds/commit/3e0a5e6de6342f36c9622aba3ad55d2db4488942)\r\n*  fixed notification prompt [View](https://github.com/twocanoes/xcreds/commit/40423c3b3ba271483826e49b6010f95e5b5683c7)\r\n*  added shouldShowCloudLoginByDefault user default [View](https://github.com/twocanoes/xcreds/commit/d8658f333726d8151c2486a7fe38f94cc29cacb2)\r\n*  added idhostnames array so you can specify multiple tenants [View](https://github.com/twocanoes/xcreds/commit/663dfa99b6bfb54487ca5cbc8d83618c8d180496)\r\n*  removed registration reminder [View](https://github.com/twocanoes/xcreds/commit/738dff1ab4396e14d701da2dcb79c5c657533433)\r\n*  removed spaces [View](https://github.com/twocanoes/xcreds/commit/180c2b9f4c267479723810a22a1dcc7715d992ce)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added mappings for user info [View](https://github.com/twocanoes/xcreds/commit/074ac99d5b3b72f3a8fb553670968f6e67da8f10)\r\n*  bumped version to 2.2 and build [View](https://github.com/twocanoes/xcreds/commit/23d902d5227eab2f3e61a6c931ccf63b94bc0ccb)\r\n*  added new key for OIDC mapping [View](https://github.com/twocanoes/xcreds/commit/485be954afebf7cbe808a8b23e0be6a7c5efa495)\r\n*  made keys lowercase for mappings [View](https://github.com/twocanoes/xcreds/commit/7432620d1a5c7e22e98975a5e806b73a9140d5ee)\r\n*  changed case of keys [View](https://github.com/twocanoes/xcreds/commit/ecac4002bd45677fa72386cc73a56bfe6d3f53ed)\r\n*  renamed mapped prefs with a prefix [View](https://github.com/twocanoes/xcreds/commit/aadd1445d92ac12e084946e1b40d97cf9f5aa6c7)\r\n*  username hint was not being set [View](https://github.com/twocanoes/xcreds/commit/aba884ce568c39653fec406f7c95b21b1c554642)\r\n*  added startup script [View](https://github.com/twocanoes/xcreds/commit/9c374670c37ba1b522e1247ec96a850a4e663b8e)\r\n*  added credit to script [View](https://github.com/twocanoes/xcreds/commit/e36e74db471c955bd356f150dbc9b19d240a50d4)\r\n*  implemented KeychainReset [View](https://github.com/twocanoes/xcreds/commit/0c34708fdeb9c9aa4303daa8382948d4e7d8143d)\r\n*  implemented PasswordOverwriteSilent [View](https://github.com/twocanoes/xcreds/commit/8fcee904d23440051516c74228213a64b4ead348)\r\n*  removed show prefs menu [View](https://github.com/twocanoes/xcreds/commit/d34328d71ec93b2663b75c080e41c8e0707b1f8e)\r\n*  fixed timer issue [View](https://github.com/twocanoes/xcreds/commit/1d37d90a8ce81a142b90874b5d35641db4a9c1a8)\r\n*  fixed shouldShowCloudLoginByDefault not working [View](https://github.com/twocanoes/xcreds/commit/570576b00c63db1f11ab5d7799301c9faed7f1e9)\r\n*  fixed edge case when not showing xcreds login when logging out [View](https://github.com/twocanoes/xcreds/commit/3447f7be9e35a5e894911c0fa7366be4fa0d3b05)\r\n*  removed test time [View](https://github.com/twocanoes/xcreds/commit/5bd5f84563b2a05fd4c2c169e1601cf5c270d8a9)\r\n*  added sub as local user account if other methods not available; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/fd4067d3a54850244f5f456825cbb531800dca85)\r\n*  remove progress screen overlay because it was hiding filevault [View](https://github.com/twocanoes/xcreds/commit/453a9b79a19bbd05c4d638c01337b4752943898d)\r\n\r\n\r\n## release_v2_0 (2022-08-30)\r\n\r\n*  bumped version to 1.1 [View](https://github.com/twocanoes/xcreds/commit/d6a4c915da4e771335915c6aa1dae53d94c8c039)\r\n*  added sample profile for google [View](https://github.com/twocanoes/xcreds/commit/342c8590fd5392822a9a57dd9a3293aa5f276eb6)\r\n*  Cloud password verification dialog not centered... #15 [View](https://github.com/twocanoes/xcreds/commit/b1d8ee6069a92e6b231b8bce944f684fa36ec68e)\r\n*  add \"have token\" indicator #10 [View](https://github.com/twocanoes/xcreds/commit/db746fd65ae1623e1d69f3c075391f474c9ccc3e)\r\n*  Hide \"About XCreds\" menu item #18; Ability to add a custom URL and menu item for \"Change Password #18 [View](https://github.com/twocanoes/xcreds/commit/f1c4593b4ad1b73899f9bc2cbfe61cd2d37eac11)\r\n*  start of login window [View](https://github.com/twocanoes/xcreds/commit/ce6cc87d6f5e0ee87ecea89514865fd7b92df476)\r\n*  pass username and password for login window [View](https://github.com/twocanoes/xcreds/commit/6addc7950cf499fb9bdeee098af1e0f9d35bfb63)\r\n*  added fade to login window complete [View](https://github.com/twocanoes/xcreds/commit/3fd2f6dd2f69f8ec41e7eda52937e98cf0a30738)\r\n*  restart and shutdown buttons [View](https://github.com/twocanoes/xcreds/commit/fde13dea140cf02043c8f9404c08917868bb5ecc)\r\n*  implemented swiching back to mac login window [View](https://github.com/twocanoes/xcreds/commit/85545c29a8ad7c2b28daef1f8e8024bf377761ba)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/e755e305eb936a965cb0ef133d9f7c1cfb7cc765)\r\n*  fixed xcreds breakage due to refactoring for xcreds login window [View](https://github.com/twocanoes/xcreds/commit/f41778819ed0d04325880e641799f723732ca6f3)\r\n*  added keychain updating with tokens [View](https://github.com/twocanoes/xcreds/commit/2e3114e4f657761addd714abe7de790350623c83)\r\n*  xcreds login window [View](https://github.com/twocanoes/xcreds/commit/03e929f9fa582b394686bb7669b28d0e906c4cd9)\r\n*  added return to cloud login and wait message [View](https://github.com/twocanoes/xcreds/commit/f29ea30d43e51b6ef44bfbdad7d0ccd1d650a6b3)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/7fb698159e5f0b6cd54057d0938ddd0a448bd321)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/ce8b9197c101d106605d5ea8e6bf87f5b52412ac)\r\n*  added username to manifest [View](https://github.com/twocanoes/xcreds/commit/aa7945756f9c0a0573cf79b48c677c35dfbe7469)\r\n*  fixed install scripts [View](https://github.com/twocanoes/xcreds/commit/ad2152c8e24b03dd685627d052b3116e5badfd62)\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/690e6966e81bcb27f8859c010c230d2d0af4ba0a)\r\n*  updaed sample profiles [View](https://github.com/twocanoes/xcreds/commit/5cd70f021fc8a4b7321dbfe7bd5cf1298a901609)\r\n*  added arbitrary check for password in form [View](https://github.com/twocanoes/xcreds/commit/9d1dadac7750544dffa4db82fc258f0b7ed9663e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/bb90624c3d9a45870956621f22b41da5434e2bce)\r\n*  fixed idtoken required values causing failure [View](https://github.com/twocanoes/xcreds/commit/de5dd6affee913fc6f2f65125188a8e894460b65)\r\n*  added build number when starting up [View](https://github.com/twocanoes/xcreds/commit/2d4b70a192e119352cccc2d7318b8997e3c7fe74)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/5f6bdd336f311caa991f10c380b15f9acc2f5bb2)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/26b995a2173376ea6275a037a7866ea154b9ef31)\r\n*  create user mech [View](https://github.com/twocanoes/xcreds/commit/2bd3cb885f9cfc2557cc709404a8c665e99236f1)\r\n*  tweaked create user [View](https://github.com/twocanoes/xcreds/commit/4bfdd1017266b30d25e9fb0162decbe54fe3b5a9)\r\n*  added FDE enable [View](https://github.com/twocanoes/xcreds/commit/2422e5588412d4cc721f93c0695405d939096c42)\r\n*  updated prefs [View](https://github.com/twocanoes/xcreds/commit/14d39e3fe023b6412a73b6cba2a214b283a1b7d7)\r\n*  added fde option [View](https://github.com/twocanoes/xcreds/commit/2b022b47d6c23e2bbf6fcd6f0b7bb249df689bc1)\r\n*  added network changing detection to reload page [View](https://github.com/twocanoes/xcreds/commit/de4acf06e2e7b18c232dd0dcd5ce55e8944d2e2a)\r\n*  fixed status icon issue; fixed lack of prompting on first launch [View](https://github.com/twocanoes/xcreds/commit/9aa2d77b366fe963aed1ec78c932c467d83f5b63)\r\n*  added default to create keychain [View](https://github.com/twocanoes/xcreds/commit/27be41527d7716df6fbcd9ed276f542b80e53682)\r\n*  added better loading at start [View](https://github.com/twocanoes/xcreds/commit/1223e399814d061d9962a75d6c037445cd9862f9)\r\n*  updated loading message [View](https://github.com/twocanoes/xcreds/commit/d8d1b96e3e2927eb110747155942c4f000c8872c)\r\n*  smother transitions and background image [View](https://github.com/twocanoes/xcreds/commit/6f6f2b9c7b24a3724440b77b52d86cfaeca3169d)\r\n*  fixed background image url [View](https://github.com/twocanoes/xcreds/commit/8164b122c71f76b0bea9a3237d386ffac9ec0d30)\r\n*  fixed overlay not showing [View](https://github.com/twocanoes/xcreds/commit/6cedc60bbaad9747209ae73521a0af480a8301a0)\r\n*  fixed regression with back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/ff3dee83940377a8544283d207e011f5854be8c3)\r\n*  add tweak to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/7aafd66a0d75a3ee09dc6a4cd1c7f211877fb15b)\r\n*  more tweaks to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/b2ef99f2db8056933eb2c047f28d6449059103dd)\r\n*  fixed minor issues with prefs [View](https://github.com/twocanoes/xcreds/commit/18bccee23ceb28e47bd25f7ed38433dea76e787b)\r\n*  reverted default [View](https://github.com/twocanoes/xcreds/commit/5fe505fa6c90b1ae198bc1d5aeac6068e0e9ecdc)\r\n*  project update [View](https://github.com/twocanoes/xcreds/commit/4ea4da0da0260d9d9379ea599689d1c5ed1515b5)\r\n\r\n\r\n## prebeta (2022-06-15)\r\n\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/7289a72ae79005797fa4651dc61328354aca7c2b)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/07947e9e66f68db049481b6e35373a8a5b5a4bf5)\r\n*  added support for Google IdP [View](https://github.com/twocanoes/xcreds/commit/4733a6cdeef503db2e08a21bb9443700bfb9526d)\r\n\r\n\r\n---\r\n\r\n## 4.1.6346 (2024-02-13) (13/02/2024)\r\n## 4.1.6346 (2024-02-13)\r\n\r\n*  added fix for override still prompting when overridesilent set [View](https://github.com/twocanoes/xcreds/commit/dec4a69c78ff5ee8876c6b00d33a1a09400ced92)\r\n*  fixed silentoverride issue [View](https://github.com/twocanoes/xcreds/commit/253a29c608e728c6177bd86e4ec70339611e95a8)\r\n*  fixed multiple share mounting [View](https://github.com/twocanoes/xcreds/commit/fbc40e45085a2c338f671f5fb827828e2683950d)\r\n*  fixed Update manifest pfm_last_modified and pfm_version #164 [View](https://github.com/twocanoes/xcreds/commit/a9f5ccc89dd7a7b673d3886aedef8073fe87c980)\r\n*  implemented [Feature Request] AD - Option to hide Sign-In menu item #150 [View](https://github.com/twocanoes/xcreds/commit/629dfe117cd0665192a536f6f984dbf00a31ee57)\r\n*  implemented [Feature Request] Standard wallpaper options for default background #155 [View](https://github.com/twocanoes/xcreds/commit/81509683f4e54462c6cc697331132980ee7b58a1)\r\n\r\n\r\n## 4.1.6313 (2024-02-06)\r\n\r\n*  fixed issue with menu item not updating tokens [View](https://github.com/twocanoes/xcreds/commit/7661fc2d703c065a9a71b0751a6427f1b636783e)\r\n*  fixed automount [View](https://github.com/twocanoes/xcreds/commit/8a9f8c2aa143ab3138e2741e2ce6061cdd35419b)\r\n*  remove admin if we made them admin [View](https://github.com/twocanoes/xcreds/commit/e87ec92d5bdb3ace68060f6db3469d76d0dbf0cc)\r\n*  added check for not removing last admin user [View](https://github.com/twocanoes/xcreds/commit/fbe883413f83d7f96fb5ba0da68ca93ced5e9484)\r\n*  fixed prompting when both AD and cloud are configured [View](https://github.com/twocanoes/xcreds/commit/32f2bebb4707ed70e21ccfb50f30d09eff076ce9)\r\n*  added kerberosprincipalname pref and getting kerb ticket with oidc login [View](https://github.com/twocanoes/xcreds/commit/c14fd13e6e347d9be49a709531ecb24b08bafb96)\r\n*  added menuItemWindowBackgroundImageURL [View](https://github.com/twocanoes/xcreds/commit/7c81253b3643a76c0468d4424344f61fe578d520)\r\n*  better selection of menu item prompting if both AD and OIDC is setup [View](https://github.com/twocanoes/xcreds/commit/a4140ace5ca7f22d26bf502da72fd928dc4388c6)\r\n*  fixed issue with ACL on tokens in keychain [View](https://github.com/twocanoes/xcreds/commit/4aeda19969b358ae27baa02aec067ac0f9318a29)\r\n*  added custom menu item pref [View](https://github.com/twocanoes/xcreds/commit/9453fbd3a3b09887ffd1807dee6ae9e6e8eb574a)\r\n*  ability to customize Share menu item; added username for AD and OIDC in menu [View](https://github.com/twocanoes/xcreds/commit/b67970aaa2a5ef450cb6d5888338ce4536a2e891)\r\n*  added pref for shares [View](https://github.com/twocanoes/xcreds/commit/9c8d920744cd44a2b27163db2c1a84d81c5665b3)\r\n*  added better descriptions to share manifest [View](https://github.com/twocanoes/xcreds/commit/2004767b7c99782c41f3b0a43079ce92daa22374)\r\n*  updated whats new [View](https://github.com/twocanoes/xcreds/commit/f81c831706a7fdbf124a5d0926fe790b728a4366)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/a3ca6493d51a71006d2e612df747ea1c1747acb9)\r\n\r\n---\r\n\r\n## XCreds 4.1 (06/02/2024)\r\n## 4.1.6313 (2024-02-06)\r\n\r\nSee https://twocanoes.com/knowledge-base/whats-new-in-xcreds-4-1/ for full details\r\n\r\n\r\n*  fixed issue with menu item not updating tokens [View](https://github.com/twocanoes/xcreds/commit/7661fc2d703c065a9a71b0751a6427f1b636783e)\r\n*  fixed automount [View](https://github.com/twocanoes/xcreds/commit/8a9f8c2aa143ab3138e2741e2ce6061cdd35419b)\r\n*  remove admin if we made them admin [View](https://github.com/twocanoes/xcreds/commit/e87ec92d5bdb3ace68060f6db3469d76d0dbf0cc)\r\n*  added check for not removing last admin user [View](https://github.com/twocanoes/xcreds/commit/fbe883413f83d7f96fb5ba0da68ca93ced5e9484)\r\n*  fixed prompting when both AD and cloud are configured [View](https://github.com/twocanoes/xcreds/commit/32f2bebb4707ed70e21ccfb50f30d09eff076ce9)\r\n*  added kerberosprincipalname pref and getting kerb ticket with oidc login [View](https://github.com/twocanoes/xcreds/commit/c14fd13e6e347d9be49a709531ecb24b08bafb96)\r\n*  added menuItemWindowBackgroundImageURL [View](https://github.com/twocanoes/xcreds/commit/7c81253b3643a76c0468d4424344f61fe578d520)\r\n*  better selection of menu item prompting if both AD and OIDC is setup [View](https://github.com/twocanoes/xcreds/commit/a4140ace5ca7f22d26bf502da72fd928dc4388c6)\r\n*  fixed issue with ACL on tokens in keychain [View](https://github.com/twocanoes/xcreds/commit/4aeda19969b358ae27baa02aec067ac0f9318a29)\r\n*  added custom menu item pref [View](https://github.com/twocanoes/xcreds/commit/9453fbd3a3b09887ffd1807dee6ae9e6e8eb574a)\r\n*  ability to customize Share menu item; added username for AD and OIDC in menu [View](https://github.com/twocanoes/xcreds/commit/b67970aaa2a5ef450cb6d5888338ce4536a2e891)\r\n*  added pref for shares [View](https://github.com/twocanoes/xcreds/commit/9c8d920744cd44a2b27163db2c1a84d81c5665b3)\r\n*  added better descriptions to share manifest [View](https://github.com/twocanoes/xcreds/commit/2004767b7c99782c41f3b0a43079ce92daa22374)\r\n*  updated whats new [View](https://github.com/twocanoes/xcreds/commit/f81c831706a7fdbf124a5d0926fe790b728a4366)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/a3ca6493d51a71006d2e612df747ea1c1747acb9)\r\n\r\n\r\n---\r\n\r\n## XCreds 4.0 (29/01/2024)\r\n## 4.0.6274 (2024-01-26)\r\n\r\n*  fixed issue with local password update [View](https://github.com/twocanoes/xcreds/commit/b12e859184f6812080906256315d1d7b2f29e496)\r\n*  updated ropg prefs and checking [View](https://github.com/twocanoes/xcreds/commit/e3149de819f2b72a7e11f9891815de5d5c6511b9)\r\n*  Minor fixes for ropg [View](https://github.com/twocanoes/xcreds/commit/f99bdd5aa288331c469bd8d6fca83af3642fd622)\r\n*  fixed passwordElementID preference can cause issue with setting local password #161 [View](https://github.com/twocanoes/xcreds/commit/5b547377d591c7e8dcfc6165197fcf5d94bd881b)\r\n*  PasswordOverwriteSilent does not prevent user prompt for password #160 [View](https://github.com/twocanoes/xcreds/commit/a438d09a10fa35c914877559a8bab415083a428a)\r\n*  shouldUseROPGForMenuLogin hides offline login option at XCreds login window #158 [View](https://github.com/twocanoes/xcreds/commit/17f24dd92b8c83bb591b5cd9bb50e41c9ac4086f)\r\n*  Improvement for refreshRateMinutes description #157 [View](https://github.com/twocanoes/xcreds/commit/cc6e736f0429bb78ac0a925395b305f21d98af4a)\r\n*  Typos in manifest descriptions #156 [View](https://github.com/twocanoes/xcreds/commit/eae6dff1654237d13bbab857a5e1d8c30c5ffe11)\r\n\r\n\r\n## 4.0.6261 (2024-01-15)\r\n\r\n*  built release notes [View](https://github.com/twocanoes/xcreds/commit/7440e188957a5c489891d75513dad33df2ec6aec)\r\n*  applied patch from Jim Zajkowski to fix integration issues [View](https://github.com/twocanoes/xcreds/commit/278862f63decc361c2dcc1e99da541c431b7099d)\r\n*  fixed up kerb ticket status in menu [View](https://github.com/twocanoes/xcreds/commit/93371b9a3b32c7f09e23d1b55fb1c783ffd580de)\r\n*  refactored menu code [View](https://github.com/twocanoes/xcreds/commit/a76b7f843d4a156233abeb9039152748e2dc52c9)\r\n*  fixed issue with updating keychain [View](https://github.com/twocanoes/xcreds/commit/d0b70c3142e385a51c79c1f94812393a6067e178)\r\n*  more attempt at sharemounter integration [View](https://github.com/twocanoes/xcreds/commit/18e44d1d6b156ffb63686db8d52905e287dc5f24)\r\n*  implemented shares [View](https://github.com/twocanoes/xcreds/commit/8bd74a3ac8fe78088e280c19d9ee80eeb1658129)\r\n*  added additional sample profiles [View](https://github.com/twocanoes/xcreds/commit/721bf74a6f58cce0b09b1aa2e88f6317b643bede)\r\n*  fixed home mounting [View](https://github.com/twocanoes/xcreds/commit/b4ffa8ff9788cdd76694174c54dd0bc3ce9ddbcc)\r\n*  fixed enabing window state with AD [View](https://github.com/twocanoes/xcreds/commit/24d17c9845baa29acbd7ec408c02553dd4d7ea3d)\r\n*  pointed package to main branch for oidclite [View](https://github.com/twocanoes/xcreds/commit/7f23a07412363c7d45ce093eaff0bbac644265bb)\r\n*  Allow forcing of webview login window [View](https://github.com/twocanoes/xcreds/commit/88eaaf49ff27a7fb38c879d15e597912f06c0d29)\r\n*  Support separate client ID and secret for ropg [View](https://github.com/twocanoes/xcreds/commit/4e008168bbf206d6678d7c1649e26ec7424928a3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/7d5fba55eab2430038c2a86b79c08f714316e57b)\r\n*  fixed issue with ropg clientid/secret selection [View](https://github.com/twocanoes/xcreds/commit/1642241ea03ddc43b4a04b7e9a4f0885113ab4dc)\r\n*  Keychain is reset on cloud password change when user enters old local password #148 [View](https://github.com/twocanoes/xcreds/commit/79f1bb531ce5fa20389b4fed319bac3539314e96)\r\n*  Admin status does not change after removed from group #145 [View](https://github.com/twocanoes/xcreds/commit/f9821f992afe305d2be9bec0ee0aec9e1b5dbdca)\r\n*  Fix manifest key name for loadPageInfo #143 [View](https://github.com/twocanoes/xcreds/commit/b747d621e864a40906b13b85e6d184ead1fb485c)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/aad768b0f0b76345a3e7ee2ea0d02fbcf6e953b1)\r\n\r\n\r\n## 4.0.6203 (2024-01-01)\r\n\r\n*  added release notes and script to generate release notes [View](https://github.com/twocanoes/xcreds/commit/ff9dc64fea8e6f438755e1d72837fce4391d167c)\r\n*  Feature Request: Allow \"loadpage.html\" to be customized. #126. To test, add in new keys \"loadPageTitle\" and \"loadPageInfo\" or try the xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/37c7477f66362c1823c49138b49afcad388abbc5)\r\n*  Update description in manifest for loginWindowWidth and loginWindowHeight #138 [View](https://github.com/twocanoes/xcreds/commit/5951d753b391fda49534c5dda13d508479e66fd8)\r\n*  [feature request] LocalAD - make sync password with AD optional with preference key #130. To test, set the shouldPromptForADPasswordChange to false and set the user account to require password change on next login and verify the user is not prompted [View](https://github.com/twocanoes/xcreds/commit/0b85b4ffb8e95b8d79ffcf455ac034c05ce4d4f4)\r\n*  XCreds breaking Munki's logout/install @loginscreen logic #102. Test by defining hideIfPathExists to a path like /tmp/hide and then add/remove and UI should show /hide. Or use sample profile xcreds_example_azure_hide.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/770c179262658ccfd27f9de3808b931cc69a86e4)\r\n*  Option to enforce account to log in #21. To test, create allowedUsersArray with name of user allowed to log in and define allowUsersClaim with an OIDC claim that contains that value. Or use the xcreds_example_azure_allow_fred.mobileconfig to test [View](https://github.com/twocanoes/xcreds/commit/ee95927865f1e912898c4d030cb367fd589db114)\r\n*  Feature Request: Force Wi-Fi on option or Wi-Fi on/off switch in \"Configure Wi-Fi\" #58 [View](https://github.com/twocanoes/xcreds/commit/bfa28014c7d0c000369d49bf9a3896128616901a)\r\n*  added removeadmin function but not used since it can cause local admins to unadmin [View](https://github.com/twocanoes/xcreds/commit/cc322befaf88bf3440a9d086089468660a4354f3)\r\n*  loginWindowBackgroundImageURL image should be cached if not a file:// URL #72 [View](https://github.com/twocanoes/xcreds/commit/b2cfd643ac6419904cc30037eaceaf5bb939cc7b)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/500575b7dfa81c7a9a7231aeac88bd3cfe6a5497)\r\n\r\n\r\n## 4.0.6177 (2023-12-28)\r\n\r\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\r\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552)\r\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017)\r\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8)\r\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7)\r\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd)\r\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14)\r\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20)\r\n*  https://github.com/twocanoes/xcreds/issues/54 [View](https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\r\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f)\r\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3)\r\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f)\r\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)\r\n*  ropg at login window initial implementation [View](https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)\r\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)\r\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2)\r\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300)\r\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b)\r\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad)\r\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976)\r\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41)\r\n\r\n\r\n## 4.0.6023 (2023-12-12)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow [View](https://github.com/twocanoes/xcreds/commit/6f3737257205f4d2faa035b6f051bf6bfed2074b)\r\n*  refactored code to add admin to user account based on group membership each login (issue #109); added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) [View](https://github.com/twocanoes/xcreds/commit/8376942e6e23f8804bd5cec3cfff383792391031)\r\n*  updated license agreement (issue #90) [View](https://github.com/twocanoes/xcreds/commit/f41411c5a51706ba7b33776edc845a409400bf1e)\r\n*  Detect when no password was entered #17 [View](https://github.com/twocanoes/xcreds/commit/7cf2837f3d653a893f2f5c031c0a72298340aa70)\r\n*  updated animation when logging in [View](https://github.com/twocanoes/xcreds/commit/51387b15384032bc5f4e82a5d6fea8a49c6e2625)\r\n*  adding arbitrary claims to local DS user account [View](https://github.com/twocanoes/xcreds/commit/e47832e21a76d3ae86af3e7e5fee41f29772436f)\r\n*  fixed Active Directory issue after password change #112 [View](https://github.com/twocanoes/xcreds/commit/14e2a7c1e1d15e8655f44bef182a2e14bc0892ce)\r\n*  partial fix for #114 [View](https://github.com/twocanoes/xcreds/commit/856a3549bec86c6c52b4ed368b2e59d25c38c5a7)\r\n*  refactored windows to views [View](https://github.com/twocanoes/xcreds/commit/8a0994c7dfbe071ce5397d52070c2a4c9ab9a309)\r\n*  fixed centering and cloud login sizing [View](https://github.com/twocanoes/xcreds/commit/f83d523c57cf9f65f6f1b7931bdf34ad5a04c090)\r\n*  fixing timing for animation when logging in; tweaked UI [View](https://github.com/twocanoes/xcreds/commit/9c659dbb4a12c9ee4cbe396119a058d2594e6827)\r\n*  streamlined startup process [View](https://github.com/twocanoes/xcreds/commit/1895f0365a3aba91fc9c43961bca78ee6a9482e6)\r\n*  refactored dialogs for prompting for user info; fixed ad groups for making admin user [View](https://github.com/twocanoes/xcreds/commit/7c5af73cb91a83c8f323edc1d8bd9538b02fbd71)\r\n*  added missing template for package [View](https://github.com/twocanoes/xcreds/commit/281fe86d7bb33c7f278f05117794069c991efb47)\r\n*  fixed showing offline button [View](https://github.com/twocanoes/xcreds/commit/72ffc3fd5434eb742e1cffa3cb073228f4883292)\r\n*  implemented feature request: localad/kebereros support for saving groups to prefs #125 [View](https://github.com/twocanoes/xcreds/commit/1d3e2be0a87c3e5d2843767db28de90894bc12cc)\r\n*  fixed enabling views when logging in [View](https://github.com/twocanoes/xcreds/commit/3ac6e3739200a3ae6f708be731c4d7acdf279e7e)\r\n*  fixed javascript to key on input instead of keydown/keyup [View](https://github.com/twocanoes/xcreds/commit/3d41a199cfd92f233677cc6859f837ede388311c)\r\n*  implemented Prompt for Secure Token Admin Login When Required #123 [View](https://github.com/twocanoes/xcreds/commit/32b118fe0c96b6cee8bd8a37bcff22611f28e55b)\r\n*  fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 [View](https://github.com/twocanoes/xcreds/commit/21814425a055f0240fb4c11c37c0d01045620fd6)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/a5aca79363b6f3cc974442534bbc7818b0e4775b)\r\n*  fixed issue with updating password in userspace [View](https://github.com/twocanoes/xcreds/commit/9e483c451eccac80fc533f993fe21a526970fd9e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/867fc0f3337cde76a06cb821471de2bcd6fb9506)\r\n\r\n\r\n## v3.2.1.6002 (2023-12-11)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/e621f6a8da59c6923f0ba12b6a3abf5c9a916f34)\r\n*  bumped version and build [View](https://github.com/twocanoes/xcreds/commit/7140e72c2e619e26b2db99e21f917f6b3147570a)\r\n*  adde missing credits file [View](https://github.com/twocanoes/xcreds/commit/81f8e48a696c1eeab46bbcb4f36eea66fe6113f4)\r\n\r\n\r\n## v3.3.5269 (2023-11-27)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n\r\n\r\n## v3.2.5197 (2023-10-17)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated url in profile manifest [View](https://github.com/twocanoes/xcreds/commit/33ef0c9f2f30afc4260526b27ee4e6995e94fcfa)\r\n*  fixed issue 95: whitespace characters in password and username [View](https://github.com/twocanoes/xcreds/commit/63f4ca53c2c1ba31fd93fd4921042d21284570c6)\r\n*  shouldPreferLocalLoginInsteadOfCloudLogin [View](https://github.com/twocanoes/xcreds/commit/79e798afab9162255b7a019b74bbb3122330e83a)\r\n*  another attempt at fixing https://github.com/twocanoes/xcreds/issues/95 [View](https://github.com/twocanoes/xcreds/commit/819e9a047f8d1e9e6d5a4f26b32238cb7fc9da88)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/4ac36cbc2d085ee32bd8d82a66feeb925ff118fb)\r\n*  fixed keyboard nav for controls [View](https://github.com/twocanoes/xcreds/commit/c5c0cad10f5d5f22f8b6ce3d0993f5f1f72d8f3b)\r\n*  issue #100: Detect Offline [View](https://github.com/twocanoes/xcreds/commit/fe804f167446fc4b22e128cca576ddd7276fd96f)\r\n*  Add ability to check passwords via ROPG [View](https://github.com/twocanoes/xcreds/commit/f7c62c0466106cbc26f9f67be441dad847c32ecf)\r\n*  Rename prefkey to be more boolean [View](https://github.com/twocanoes/xcreds/commit/2909f625588fe25c2082fbf2ff88df468e19c79d)\r\n*  update to profile manifest [View](https://github.com/twocanoes/xcreds/commit/7fcb0a392b0e8d8c19e81f8e827d6de996da75c4)\r\n*  fixed typo in function name [View](https://github.com/twocanoes/xcreds/commit/8c12d454e393cc0c52a0feb314a67c357bbac1c9)\r\n*  added a smidge more logging [View](https://github.com/twocanoes/xcreds/commit/86256a2825eeeebf6eb63fe26451c372e149c2a2)\r\n*  added self healing for auth rights [View](https://github.com/twocanoes/xcreds/commit/9b43e1cb382cfea1b40a2f40b6cdf6189fed385b)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/7cdf884f2aed100080069e9b3a589af736062c99)\r\n\r\n\r\n## release_3_1 (2023-07-14)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated history.md [View](https://github.com/twocanoes/xcreds/commit/85b71172d3192616371ccc30ea16fb6dd092a54e)\r\n*  fixed check timer to still work if mac sleeps [View](https://github.com/twocanoes/xcreds/commit/af491f5febf433bfeb8478d71a2fa29309676765)\r\n*  fixed issue with token update time [View](https://github.com/twocanoes/xcreds/commit/0d14279e4003400a0fef812247f3c790fc802f5e)\r\n*  fixed fade; cleaned up user mappings for weird characters [View](https://github.com/twocanoes/xcreds/commit/c6304954d6b02109d4ff90ed2d3b94963f761461)\r\n*  final touches [View](https://github.com/twocanoes/xcreds/commit/df5f1110c5800ac8aa31293ac509817a62fedfbc)\r\n*  bumped to 3.2; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/5a544859855835a6c1d8bfb35a39aeb30cda5962)\r\n*  bumped build number to 5000 [View](https://github.com/twocanoes/xcreds/commit/6250fdf999d7e57bfd51fe55186fde6fce92a3c0)\r\n*  updated permission for override_script [View](https://github.com/twocanoes/xcreds/commit/fac2af918a65d5f92c211e4707e9e14d36e5bee1)\r\n*  changed version back to 3.1; added better about window with history; changed override script requirments to be owned by _securityagent and be 700 [View](https://github.com/twocanoes/xcreds/commit/2f8dd4e599a71d02a88fa4a66814e419c71c0e65)\r\n*  added command click login window for mac login window [View](https://github.com/twocanoes/xcreds/commit/f0a5b1fc76c133f199da75f31202401476da2af1)\r\n*  text fixes [View](https://github.com/twocanoes/xcreds/commit/97c383e24729982c364e456ba5c3d49aa983060a)\r\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/b4fd79d1d43d922fac3581282c7eb9126d33ed8c)\r\n*  added back sample profie [View](https://github.com/twocanoes/xcreds/commit/6aa3ec4a58842f9a4dd748cd129ed4c14226888a)\r\n*  fixed timer minutes [View](https://github.com/twocanoes/xcreds/commit/e78b306018cd996176b9530ba302689bd1d3e358)\r\n\r\n\r\n## v3.1.4144 (2023-06-08)\r\n\r\n*  updated AD support: kerb ticket now obtained at user space app launch from password in keychain. udpated profile manifest with better comments; delete cookes on webview each time it appears; added local login button; shows username password if discoveryURL is not defined [View](https://github.com/twocanoes/xcreds/commit/d17509bd2ce49313561632e15bc2698e38f09721)\r\n\r\n\r\n## v3.1.4143 (2023-06-07)\r\n\r\n*  updated fullname [View](https://github.com/twocanoes/xcreds/commit/627199474b42349bd42f6dc47c4cd442b9c3357a)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d2370669893dc37937617be59a5601109915e991)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d0f4efdbf886cbe9a21e449fe8d47f1ed671bdcd)\r\n*  get kerb ticket on login [View](https://github.com/twocanoes/xcreds/commit/b7f7ad622ceaa57d27e419fa3fad10f0e040f8e3)\r\n\r\n\r\n## v3.1.4081 (2023-05-27)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added Package.resolved [View](https://github.com/twocanoes/xcreds/commit/91fb7f3da5e789dabb37a5a8585592c69c1a732c)\r\n*  added XCredsLoginPlugIn/errorpage.html [View](https://github.com/twocanoes/xcreds/commit/7bf66a34a1ef091f532959de62247ba1fbead13e)\r\n*  cleaned up build system a bit [View](https://github.com/twocanoes/xcreds/commit/f99ec4a8ae38ff00adabe9b43c1ff8577c803dd1)\r\n*  improved javascript parsing [View](https://github.com/twocanoes/xcreds/commit/ecf710eb181fd3f6dbdce7aedf511b8840e33ca6)\r\n*  fixed issue with initial javascript listener [View](https://github.com/twocanoes/xcreds/commit/574a51b5b8329be4cc2ec8c045f710548aecf7d6)\r\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/dfbf57f4a3d9649e2b35231bfedc6d591a7c3e41)\r\n*  removed reset option [View](https://github.com/twocanoes/xcreds/commit/3150fa654f3b8a55018f0a1e0390aa6ec541e125)\r\n*  removed KeychainReset and PasswordOverwriteSilent because it makes things worse [View](https://github.com/twocanoes/xcreds/commit/39362899ee0c0813f416057cad203061869daa84)\r\n*  added lock screen switch to login window [View](https://github.com/twocanoes/xcreds/commit/77c52ad11ab01b1afd5e011b38a06b3de9527196)\r\n*  fixed window levels, progress screen, background and boot runner issues [View](https://github.com/twocanoes/xcreds/commit/4c887fbdc82a0f63fcd8876aa662c6bc96ef7bbd)\r\n*  improved logging [View](https://github.com/twocanoes/xcreds/commit/e92ffe9e65f1a95b4b3e9f1c8ea1089ae7720863)\r\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/488b66494c65e8460eefdf5bbb8c0d271102f298)\r\n*  added override script and secure token admin reset [View](https://github.com/twocanoes/xcreds/commit/6717b3aa2cd0ef9d387484e7571183e6f8ffbb5d)\r\n*  removed shouldFindPasswordElement since that is defaulit fallback behavior [View](https://github.com/twocanoes/xcreds/commit/2825ee7b6db005f6aa8ca6d60c72210ae7343af4)\r\n*  cleaned up ui a bit [View](https://github.com/twocanoes/xcreds/commit/b64496bcb55573dff889a9ab92be2ed3f9cdd5e3)\r\n*  dont refresh prefs so much [View](https://github.com/twocanoes/xcreds/commit/91ee8dcd371fe9e2182fd421674f9fcd484e4d81)\r\n*  added check for group membership in oidc claim [View](https://github.com/twocanoes/xcreds/commit/2c03586a59821a04948692dcb9a41006ebf735f7)\r\n*  added history file [View](https://github.com/twocanoes/xcreds/commit/5fa6c0436a58535e03fd457de9dd720186274a38)\r\n\r\n\r\n## release-3.0 (2023-05-08)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n\r\n\r\n## release_3_0 (2023-04-18)\r\n\r\n*  added trial license beginnings [View](https://github.com/twocanoes/xcreds/commit/5a6cc5a91715e909dc8f9510f800dfffe485b7d6)\r\n*  fixed regression for password change not capturing new password on azure [View](https://github.com/twocanoes/xcreds/commit/8db379d829d925409abfea85da72a788ead43d22)\r\n*  bumped version to 3600 [View](https://github.com/twocanoes/xcreds/commit/f9601726f3d7255414d4ad44e20b9ac526af0f7c)\r\n*  fixed issue with crash if time is far off [View](https://github.com/twocanoes/xcreds/commit/9c1d0d81ed62f525614b79e3a3dbc4b4bed3964b)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/f309f95218424ca8f67177b0daed79d98344e943)\r\n*  updated license [View](https://github.com/twocanoes/xcreds/commit/534be3e278d1daae48218952d20194e4e03b17b4)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/e3c87a548a9e682b75ec01b4216ddfdda8a2ced2)\r\n\r\n\r\n## release_v2_4 (2023-03-28)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added more logging for id token and bumped version to 2.3 [View](https://github.com/twocanoes/xcreds/commit/b8494ee343dab510fba1c1f304623efc985455a0)\r\n*  added remove keychain option [View](https://github.com/twocanoes/xcreds/commit/19032d8df58c0bdd6197fc47f9f3aa2d8d6694ea)\r\n*  updated language on keychain option and added pref in manifest [View](https://github.com/twocanoes/xcreds/commit/709a7f29e696c088cc8e13959dadba8f9c0f8c8e)\r\n*  added key for customizing return to xcreds; added preference and ability to automatically refresh login window [View](https://github.com/twocanoes/xcreds/commit/514a1ba5ddaec55bfb8e40ca3e6c98a43c50ec7b)\r\n*  added in login window height/width [View](https://github.com/twocanoes/xcreds/commit/18e974e67f2833862a1a6913a6c4563e339d4239)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/6090d5ec4895045448920e774e16dc0614223919)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/0a7dad70364bd830b8028da2cadd62c98b79271d)\r\n*  fixed login window size and background image [View](https://github.com/twocanoes/xcreds/commit/339a66e7fdf6e8484da8f7c0a5c2ee6eed0aaef7)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/992512bb1ac27f36c655d1e1a02eafdbd47a2b80)\r\n*  updated sample configu [View](https://github.com/twocanoes/xcreds/commit/cd482e69520c8a7994eb8233e26c8a008c5048e7)\r\n*  tweaked text for user space refresh token window and added pref to show or hide [View](https://github.com/twocanoes/xcreds/commit/9f29893203caef8799683cc2ded3345f306c4528)\r\n*  fixed names and links in manifest [View](https://github.com/twocanoes/xcreds/commit/e759138ca72f2a4153fbea02f7b0b5cfd031bd01)\r\n*  fixed crashing issue due to null refreshview outlet [View](https://github.com/twocanoes/xcreds/commit/d3931983b53633c91c33494fc1fcccd7614948ad)\r\n*  added frontmost when prompting for keychain password [View](https://github.com/twocanoes/xcreds/commit/92ee6ed5c41dfefc798f1c839193aaa4a4a09f67)\r\n*  fixed issue with autorefresh [View](https://github.com/twocanoes/xcreds/commit/d7126a026281afaac27c9381a9c4e42d472b4b31)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/7a3d45178e299b52014fb3dd0adf6c180667222f)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/9ef84939d56cce29c9b8e3a84b0f070a30f7e30c)\r\n*  added 802.1x support; added support for pref key for finding password based on type=password [View](https://github.com/twocanoes/xcreds/commit/38ddeff5cd86d0cd43a97844c9d160da0ee446f3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/72da3de9c054f4fb35fb19c9bb6ffd5c2ebbb47a)\r\n\r\n\r\n## release_v2_1 (2023-01-11)\r\n\r\n\r\n\r\n## realease_v2_2 (2023-01-11)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  support getting password with get and adfs [View](https://github.com/twocanoes/xcreds/commit/494fdf75c79d8aa3b2c3cc6dc947f4423b2b3674)\r\n*  Revert \"support getting password with get and adfs\" [View](https://github.com/twocanoes/xcreds/commit/425bda9a9323fd7eb9437f09f9da63747db9dc8d)\r\n*  changed pref names for custom IDP / ADFS [View](https://github.com/twocanoes/xcreds/commit/83947497ec00cdfd7ec3b9a3683fa3b8e007aadf)\r\n*  fixed package template issue and updated manifest [View](https://github.com/twocanoes/xcreds/commit/f2540a6c64b5bc9971833e8fa859821d4822af9c)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  enabled rekeying FileVault implementation [View](https://github.com/twocanoes/xcreds/commit/2ba233e3695b8a7bda297b0908da933d24bec1c4)\r\n*  Support a Azure AD host [View](https://github.com/twocanoes/xcreds/commit/c0415863273f9797808d32633d3e800d630f9a0f)\r\n*  If fullname is empty, shorname is used. [View](https://github.com/twocanoes/xcreds/commit/7764740647f8e4450b411fa08849e5f4cceba078)\r\n*  added autologin when fv enabled [View](https://github.com/twocanoes/xcreds/commit/c8b394e055e2aa176af8a7f9e8cce53a3066f408)\r\n*  added okta compatibility [View](https://github.com/twocanoes/xcreds/commit/5f38e70e641bc2c8129e940ae7e9f710380fea5b)\r\n*  added a bit more logging [View](https://github.com/twocanoes/xcreds/commit/e2d2330a5050ab419290de466cef9f0b63407215)\r\n*  removed \"prompt\":\"consent\" [View](https://github.com/twocanoes/xcreds/commit/3e0a5e6de6342f36c9622aba3ad55d2db4488942)\r\n*  fixed notification prompt [View](https://github.com/twocanoes/xcreds/commit/40423c3b3ba271483826e49b6010f95e5b5683c7)\r\n*  added shouldShowCloudLoginByDefault user default [View](https://github.com/twocanoes/xcreds/commit/d8658f333726d8151c2486a7fe38f94cc29cacb2)\r\n*  added idhostnames array so you can specify multiple tenants [View](https://github.com/twocanoes/xcreds/commit/663dfa99b6bfb54487ca5cbc8d83618c8d180496)\r\n*  removed registration reminder [View](https://github.com/twocanoes/xcreds/commit/738dff1ab4396e14d701da2dcb79c5c657533433)\r\n*  removed spaces [View](https://github.com/twocanoes/xcreds/commit/180c2b9f4c267479723810a22a1dcc7715d992ce)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added mappings for user info [View](https://github.com/twocanoes/xcreds/commit/074ac99d5b3b72f3a8fb553670968f6e67da8f10)\r\n*  bumped version to 2.2 and build [View](https://github.com/twocanoes/xcreds/commit/23d902d5227eab2f3e61a6c931ccf63b94bc0ccb)\r\n*  added new key for OIDC mapping [View](https://github.com/twocanoes/xcreds/commit/485be954afebf7cbe808a8b23e0be6a7c5efa495)\r\n*  made keys lowercase for mappings [View](https://github.com/twocanoes/xcreds/commit/7432620d1a5c7e22e98975a5e806b73a9140d5ee)\r\n*  changed case of keys [View](https://github.com/twocanoes/xcreds/commit/ecac4002bd45677fa72386cc73a56bfe6d3f53ed)\r\n*  renamed mapped prefs with a prefix [View](https://github.com/twocanoes/xcreds/commit/aadd1445d92ac12e084946e1b40d97cf9f5aa6c7)\r\n*  username hint was not being set [View](https://github.com/twocanoes/xcreds/commit/aba884ce568c39653fec406f7c95b21b1c554642)\r\n*  added startup script [View](https://github.com/twocanoes/xcreds/commit/9c374670c37ba1b522e1247ec96a850a4e663b8e)\r\n*  added credit to script [View](https://github.com/twocanoes/xcreds/commit/e36e74db471c955bd356f150dbc9b19d240a50d4)\r\n*  implemented KeychainReset [View](https://github.com/twocanoes/xcreds/commit/0c34708fdeb9c9aa4303daa8382948d4e7d8143d)\r\n*  implemented PasswordOverwriteSilent [View](https://github.com/twocanoes/xcreds/commit/8fcee904d23440051516c74228213a64b4ead348)\r\n*  removed show prefs menu [View](https://github.com/twocanoes/xcreds/commit/d34328d71ec93b2663b75c080e41c8e0707b1f8e)\r\n*  fixed timer issue [View](https://github.com/twocanoes/xcreds/commit/1d37d90a8ce81a142b90874b5d35641db4a9c1a8)\r\n*  fixed shouldShowCloudLoginByDefault not working [View](https://github.com/twocanoes/xcreds/commit/570576b00c63db1f11ab5d7799301c9faed7f1e9)\r\n*  fixed edge case when not showing xcreds login when logging out [View](https://github.com/twocanoes/xcreds/commit/3447f7be9e35a5e894911c0fa7366be4fa0d3b05)\r\n*  removed test time [View](https://github.com/twocanoes/xcreds/commit/5bd5f84563b2a05fd4c2c169e1601cf5c270d8a9)\r\n*  added sub as local user account if other methods not available; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/fd4067d3a54850244f5f456825cbb531800dca85)\r\n*  remove progress screen overlay because it was hiding filevault [View](https://github.com/twocanoes/xcreds/commit/453a9b79a19bbd05c4d638c01337b4752943898d)\r\n\r\n\r\n## release_v2_0 (2022-08-30)\r\n\r\n*  bumped version to 1.1 [View](https://github.com/twocanoes/xcreds/commit/d6a4c915da4e771335915c6aa1dae53d94c8c039)\r\n*  added sample profile for google [View](https://github.com/twocanoes/xcreds/commit/342c8590fd5392822a9a57dd9a3293aa5f276eb6)\r\n*  Cloud password verification dialog not centered... #15 [View](https://github.com/twocanoes/xcreds/commit/b1d8ee6069a92e6b231b8bce944f684fa36ec68e)\r\n*  add \"have token\" indicator #10 [View](https://github.com/twocanoes/xcreds/commit/db746fd65ae1623e1d69f3c075391f474c9ccc3e)\r\n*  Hide \"About XCreds\" menu item #18; Ability to add a custom URL and menu item for \"Change Password #18 [View](https://github.com/twocanoes/xcreds/commit/f1c4593b4ad1b73899f9bc2cbfe61cd2d37eac11)\r\n*  start of login window [View](https://github.com/twocanoes/xcreds/commit/ce6cc87d6f5e0ee87ecea89514865fd7b92df476)\r\n*  pass username and password for login window [View](https://github.com/twocanoes/xcreds/commit/6addc7950cf499fb9bdeee098af1e0f9d35bfb63)\r\n*  added fade to login window complete [View](https://github.com/twocanoes/xcreds/commit/3fd2f6dd2f69f8ec41e7eda52937e98cf0a30738)\r\n*  restart and shutdown buttons [View](https://github.com/twocanoes/xcreds/commit/fde13dea140cf02043c8f9404c08917868bb5ecc)\r\n*  implemented swiching back to mac login window [View](https://github.com/twocanoes/xcreds/commit/85545c29a8ad7c2b28daef1f8e8024bf377761ba)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/e755e305eb936a965cb0ef133d9f7c1cfb7cc765)\r\n*  fixed xcreds breakage due to refactoring for xcreds login window [View](https://github.com/twocanoes/xcreds/commit/f41778819ed0d04325880e641799f723732ca6f3)\r\n*  added keychain updating with tokens [View](https://github.com/twocanoes/xcreds/commit/2e3114e4f657761addd714abe7de790350623c83)\r\n*  xcreds login window [View](https://github.com/twocanoes/xcreds/commit/03e929f9fa582b394686bb7669b28d0e906c4cd9)\r\n*  added return to cloud login and wait message [View](https://github.com/twocanoes/xcreds/commit/f29ea30d43e51b6ef44bfbdad7d0ccd1d650a6b3)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/7fb698159e5f0b6cd54057d0938ddd0a448bd321)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/ce8b9197c101d106605d5ea8e6bf87f5b52412ac)\r\n*  added username to manifest [View](https://github.com/twocanoes/xcreds/commit/aa7945756f9c0a0573cf79b48c677c35dfbe7469)\r\n*  fixed install scripts [View](https://github.com/twocanoes/xcreds/commit/ad2152c8e24b03dd685627d052b3116e5badfd62)\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/690e6966e81bcb27f8859c010c230d2d0af4ba0a)\r\n*  updaed sample profiles [View](https://github.com/twocanoes/xcreds/commit/5cd70f021fc8a4b7321dbfe7bd5cf1298a901609)\r\n*  added arbitrary check for password in form [View](https://github.com/twocanoes/xcreds/commit/9d1dadac7750544dffa4db82fc258f0b7ed9663e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/bb90624c3d9a45870956621f22b41da5434e2bce)\r\n*  fixed idtoken required values causing failure [View](https://github.com/twocanoes/xcreds/commit/de5dd6affee913fc6f2f65125188a8e894460b65)\r\n*  added build number when starting up [View](https://github.com/twocanoes/xcreds/commit/2d4b70a192e119352cccc2d7318b8997e3c7fe74)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/5f6bdd336f311caa991f10c380b15f9acc2f5bb2)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/26b995a2173376ea6275a037a7866ea154b9ef31)\r\n*  create user mech [View](https://github.com/twocanoes/xcreds/commit/2bd3cb885f9cfc2557cc709404a8c665e99236f1)\r\n*  tweaked create user [View](https://github.com/twocanoes/xcreds/commit/4bfdd1017266b30d25e9fb0162decbe54fe3b5a9)\r\n*  added FDE enable [View](https://github.com/twocanoes/xcreds/commit/2422e5588412d4cc721f93c0695405d939096c42)\r\n*  updated prefs [View](https://github.com/twocanoes/xcreds/commit/14d39e3fe023b6412a73b6cba2a214b283a1b7d7)\r\n*  added fde option [View](https://github.com/twocanoes/xcreds/commit/2b022b47d6c23e2bbf6fcd6f0b7bb249df689bc1)\r\n*  added network changing detection to reload page [View](https://github.com/twocanoes/xcreds/commit/de4acf06e2e7b18c232dd0dcd5ce55e8944d2e2a)\r\n*  fixed status icon issue; fixed lack of prompting on first launch [View](https://github.com/twocanoes/xcreds/commit/9aa2d77b366fe963aed1ec78c932c467d83f5b63)\r\n*  added default to create keychain [View](https://github.com/twocanoes/xcreds/commit/27be41527d7716df6fbcd9ed276f542b80e53682)\r\n*  added better loading at start [View](https://github.com/twocanoes/xcreds/commit/1223e399814d061d9962a75d6c037445cd9862f9)\r\n*  updated loading message [View](https://github.com/twocanoes/xcreds/commit/d8d1b96e3e2927eb110747155942c4f000c8872c)\r\n*  smother transitions and background image [View](https://github.com/twocanoes/xcreds/commit/6f6f2b9c7b24a3724440b77b52d86cfaeca3169d)\r\n*  fixed background image url [View](https://github.com/twocanoes/xcreds/commit/8164b122c71f76b0bea9a3237d386ffac9ec0d30)\r\n*  fixed overlay not showing [View](https://github.com/twocanoes/xcreds/commit/6cedc60bbaad9747209ae73521a0af480a8301a0)\r\n*  fixed regression with back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/ff3dee83940377a8544283d207e011f5854be8c3)\r\n*  add tweak to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/7aafd66a0d75a3ee09dc6a4cd1c7f211877fb15b)\r\n*  more tweaks to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/b2ef99f2db8056933eb2c047f28d6449059103dd)\r\n*  fixed minor issues with prefs [View](https://github.com/twocanoes/xcreds/commit/18bccee23ceb28e47bd25f7ed38433dea76e787b)\r\n*  reverted default [View](https://github.com/twocanoes/xcreds/commit/5fe505fa6c90b1ae198bc1d5aeac6068e0e9ecdc)\r\n*  project update [View](https://github.com/twocanoes/xcreds/commit/4ea4da0da0260d9d9379ea599689d1c5ed1515b5)\r\n\r\n\r\n## prebeta (2022-06-15)\r\n\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/7289a72ae79005797fa4651dc61328354aca7c2b)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/07947e9e66f68db049481b6e35373a8a5b5a4bf5)\r\n*  added support for Google IdP [View](https://github.com/twocanoes/xcreds/commit/4733a6cdeef503db2e08a21bb9443700bfb9526d)\r\n\r\n\r\n---\r\n\r\n## XCreds 4 Beta 5 (15/01/2024)\r\n## 4.0.6261 (2024-01-15)\r\n\r\n*  built release notes [View](https://github.com/twocanoes/xcreds/commit/7440e188957a5c489891d75513dad33df2ec6aec)\r\n*  applied patch from Jim Zajkowski to fix integration issues [View](https://github.com/twocanoes/xcreds/commit/278862f63decc361c2dcc1e99da541c431b7099d)\r\n*  fixed up kerb ticket status in menu [View](https://github.com/twocanoes/xcreds/commit/93371b9a3b32c7f09e23d1b55fb1c783ffd580de)\r\n*  refactored menu code [View](https://github.com/twocanoes/xcreds/commit/a76b7f843d4a156233abeb9039152748e2dc52c9)\r\n*  fixed issue with updating keychain [View](https://github.com/twocanoes/xcreds/commit/d0b70c3142e385a51c79c1f94812393a6067e178)\r\n*  more attempt at sharemounter integration [View](https://github.com/twocanoes/xcreds/commit/18e44d1d6b156ffb63686db8d52905e287dc5f24)\r\n*  implemented shares [View](https://github.com/twocanoes/xcreds/commit/8bd74a3ac8fe78088e280c19d9ee80eeb1658129)\r\n*  added additional sample profiles [View](https://github.com/twocanoes/xcreds/commit/721bf74a6f58cce0b09b1aa2e88f6317b643bede)\r\n*  fixed home mounting [View](https://github.com/twocanoes/xcreds/commit/b4ffa8ff9788cdd76694174c54dd0bc3ce9ddbcc)\r\n*  fixed enabing window state with AD [View](https://github.com/twocanoes/xcreds/commit/24d17c9845baa29acbd7ec408c02553dd4d7ea3d)\r\n*  pointed package to main branch for oidclite [View](https://github.com/twocanoes/xcreds/commit/7f23a07412363c7d45ce093eaff0bbac644265bb)\r\n*  Allow forcing of webview login window [View](https://github.com/twocanoes/xcreds/commit/88eaaf49ff27a7fb38c879d15e597912f06c0d29)\r\n*  Support separate client ID and secret for ropg [View](https://github.com/twocanoes/xcreds/commit/4e008168bbf206d6678d7c1649e26ec7424928a3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/7d5fba55eab2430038c2a86b79c08f714316e57b)\r\n*  fixed issue with ropg clientid/secret selection [View](https://github.com/twocanoes/xcreds/commit/1642241ea03ddc43b4a04b7e9a4f0885113ab4dc)\r\n*  Keychain is reset on cloud password change when user enters old local password #148 [View](https://github.com/twocanoes/xcreds/commit/79f1bb531ce5fa20389b4fed319bac3539314e96)\r\n*  Admin status does not change after removed from group #145 [View](https://github.com/twocanoes/xcreds/commit/f9821f992afe305d2be9bec0ee0aec9e1b5dbdca)\r\n*  Fix manifest key name for loadPageInfo #143 [View](https://github.com/twocanoes/xcreds/commit/b747d621e864a40906b13b85e6d184ead1fb485c)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/aad768b0f0b76345a3e7ee2ea0d02fbcf6e953b1)\r\n\r\n\r\n## 4.0.6203 (2024-01-01)\r\n\r\n*  added release notes and script to generate release notes [View](https://github.com/twocanoes/xcreds/commit/ff9dc64fea8e6f438755e1d72837fce4391d167c)\r\n*  Feature Request: Allow \"loadpage.html\" to be customized. #126. To test, add in new keys \"loadPageTitle\" and \"loadPageInfo\" or try the xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/37c7477f66362c1823c49138b49afcad388abbc5)\r\n*  Update description in manifest for loginWindowWidth and loginWindowHeight #138 [View](https://github.com/twocanoes/xcreds/commit/5951d753b391fda49534c5dda13d508479e66fd8)\r\n*  [feature request] LocalAD - make sync password with AD optional with preference key #130. To test, set the shouldPromptForADPasswordChange to false and set the user account to require password change on next login and verify the user is not prompted [View](https://github.com/twocanoes/xcreds/commit/0b85b4ffb8e95b8d79ffcf455ac034c05ce4d4f4)\r\n*  XCreds breaking Munki's logout/install @loginscreen logic #102. Test by defining hideIfPathExists to a path like /tmp/hide and then add/remove and UI should show /hide. Or use sample profile xcreds_example_azure_hide.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/770c179262658ccfd27f9de3808b931cc69a86e4)\r\n*  Option to enforce account to log in #21. To test, create allowedUsersArray with name of user allowed to log in and define allowUsersClaim with an OIDC claim that contains that value. Or use the xcreds_example_azure_allow_fred.mobileconfig to test [View](https://github.com/twocanoes/xcreds/commit/ee95927865f1e912898c4d030cb367fd589db114)\r\n*  Feature Request: Force Wi-Fi on option or Wi-Fi on/off switch in \"Configure Wi-Fi\" #58 [View](https://github.com/twocanoes/xcreds/commit/bfa28014c7d0c000369d49bf9a3896128616901a)\r\n*  added removeadmin function but not used since it can cause local admins to unadmin [View](https://github.com/twocanoes/xcreds/commit/cc322befaf88bf3440a9d086089468660a4354f3)\r\n*  loginWindowBackgroundImageURL image should be cached if not a file:// URL #72 [View](https://github.com/twocanoes/xcreds/commit/b2cfd643ac6419904cc30037eaceaf5bb939cc7b)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/500575b7dfa81c7a9a7231aeac88bd3cfe6a5497)\r\n\r\n\r\n## 4.0.6177 (2023-12-28)\r\n\r\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\r\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552)\r\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017)\r\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8)\r\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7)\r\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd)\r\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14)\r\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20)\r\n*  https://github.com/twocanoes/xcreds/issues/54 [View](https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\r\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f)\r\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3)\r\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f)\r\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)\r\n*  ropg at login window initial implementation [View](https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)\r\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)\r\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2)\r\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300)\r\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b)\r\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad)\r\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976)\r\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41)\r\n\r\n\r\n## 4.0.6023 (2023-12-12)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow [View](https://github.com/twocanoes/xcreds/commit/6f3737257205f4d2faa035b6f051bf6bfed2074b)\r\n*  refactored code to add admin to user account based on group membership each login (issue #109); added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) [View](https://github.com/twocanoes/xcreds/commit/8376942e6e23f8804bd5cec3cfff383792391031)\r\n*  updated license agreement (issue #90) [View](https://github.com/twocanoes/xcreds/commit/f41411c5a51706ba7b33776edc845a409400bf1e)\r\n*  Detect when no password was entered #17 [View](https://github.com/twocanoes/xcreds/commit/7cf2837f3d653a893f2f5c031c0a72298340aa70)\r\n*  updated animation when logging in [View](https://github.com/twocanoes/xcreds/commit/51387b15384032bc5f4e82a5d6fea8a49c6e2625)\r\n*  adding arbitrary claims to local DS user account [View](https://github.com/twocanoes/xcreds/commit/e47832e21a76d3ae86af3e7e5fee41f29772436f)\r\n*  fixed Active Directory issue after password change #112 [View](https://github.com/twocanoes/xcreds/commit/14e2a7c1e1d15e8655f44bef182a2e14bc0892ce)\r\n*  partial fix for #114 [View](https://github.com/twocanoes/xcreds/commit/856a3549bec86c6c52b4ed368b2e59d25c38c5a7)\r\n*  refactored windows to views [View](https://github.com/twocanoes/xcreds/commit/8a0994c7dfbe071ce5397d52070c2a4c9ab9a309)\r\n*  fixed centering and cloud login sizing [View](https://github.com/twocanoes/xcreds/commit/f83d523c57cf9f65f6f1b7931bdf34ad5a04c090)\r\n*  fixing timing for animation when logging in; tweaked UI [View](https://github.com/twocanoes/xcreds/commit/9c659dbb4a12c9ee4cbe396119a058d2594e6827)\r\n*  streamlined startup process [View](https://github.com/twocanoes/xcreds/commit/1895f0365a3aba91fc9c43961bca78ee6a9482e6)\r\n*  refactored dialogs for prompting for user info; fixed ad groups for making admin user [View](https://github.com/twocanoes/xcreds/commit/7c5af73cb91a83c8f323edc1d8bd9538b02fbd71)\r\n*  added missing template for package [View](https://github.com/twocanoes/xcreds/commit/281fe86d7bb33c7f278f05117794069c991efb47)\r\n*  fixed showing offline button [View](https://github.com/twocanoes/xcreds/commit/72ffc3fd5434eb742e1cffa3cb073228f4883292)\r\n*  implemented feature request: localad/kebereros support for saving groups to prefs #125 [View](https://github.com/twocanoes/xcreds/commit/1d3e2be0a87c3e5d2843767db28de90894bc12cc)\r\n*  fixed enabling views when logging in [View](https://github.com/twocanoes/xcreds/commit/3ac6e3739200a3ae6f708be731c4d7acdf279e7e)\r\n*  fixed javascript to key on input instead of keydown/keyup [View](https://github.com/twocanoes/xcreds/commit/3d41a199cfd92f233677cc6859f837ede388311c)\r\n*  implemented Prompt for Secure Token Admin Login When Required #123 [View](https://github.com/twocanoes/xcreds/commit/32b118fe0c96b6cee8bd8a37bcff22611f28e55b)\r\n*  fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 [View](https://github.com/twocanoes/xcreds/commit/21814425a055f0240fb4c11c37c0d01045620fd6)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/a5aca79363b6f3cc974442534bbc7818b0e4775b)\r\n*  fixed issue with updating password in userspace [View](https://github.com/twocanoes/xcreds/commit/9e483c451eccac80fc533f993fe21a526970fd9e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/867fc0f3337cde76a06cb821471de2bcd6fb9506)\r\n\r\n\r\n## v3.2.1.6002 (2023-12-11)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/e621f6a8da59c6923f0ba12b6a3abf5c9a916f34)\r\n*  bumped version and build [View](https://github.com/twocanoes/xcreds/commit/7140e72c2e619e26b2db99e21f917f6b3147570a)\r\n*  adde missing credits file [View](https://github.com/twocanoes/xcreds/commit/81f8e48a696c1eeab46bbcb4f36eea66fe6113f4)\r\n\r\n\r\n## v3.3.5269 (2023-11-27)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n\r\n\r\n## v3.2.5197 (2023-10-17)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated url in profile manifest [View](https://github.com/twocanoes/xcreds/commit/33ef0c9f2f30afc4260526b27ee4e6995e94fcfa)\r\n*  fixed issue 95: whitespace characters in password and username [View](https://github.com/twocanoes/xcreds/commit/63f4ca53c2c1ba31fd93fd4921042d21284570c6)\r\n*  shouldPreferLocalLoginInsteadOfCloudLogin [View](https://github.com/twocanoes/xcreds/commit/79e798afab9162255b7a019b74bbb3122330e83a)\r\n*  another attempt at fixing https://github.com/twocanoes/xcreds/issues/95 [View](https://github.com/twocanoes/xcreds/commit/819e9a047f8d1e9e6d5a4f26b32238cb7fc9da88)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/4ac36cbc2d085ee32bd8d82a66feeb925ff118fb)\r\n*  fixed keyboard nav for controls [View](https://github.com/twocanoes/xcreds/commit/c5c0cad10f5d5f22f8b6ce3d0993f5f1f72d8f3b)\r\n*  issue #100: Detect Offline [View](https://github.com/twocanoes/xcreds/commit/fe804f167446fc4b22e128cca576ddd7276fd96f)\r\n*  Add ability to check passwords via ROPG [View](https://github.com/twocanoes/xcreds/commit/f7c62c0466106cbc26f9f67be441dad847c32ecf)\r\n*  Rename prefkey to be more boolean [View](https://github.com/twocanoes/xcreds/commit/2909f625588fe25c2082fbf2ff88df468e19c79d)\r\n*  update to profile manifest [View](https://github.com/twocanoes/xcreds/commit/7fcb0a392b0e8d8c19e81f8e827d6de996da75c4)\r\n*  fixed typo in function name [View](https://github.com/twocanoes/xcreds/commit/8c12d454e393cc0c52a0feb314a67c357bbac1c9)\r\n*  added a smidge more logging [View](https://github.com/twocanoes/xcreds/commit/86256a2825eeeebf6eb63fe26451c372e149c2a2)\r\n*  added self healing for auth rights [View](https://github.com/twocanoes/xcreds/commit/9b43e1cb382cfea1b40a2f40b6cdf6189fed385b)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/7cdf884f2aed100080069e9b3a589af736062c99)\r\n\r\n\r\n## release_3_1 (2023-07-14)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated history.md [View](https://github.com/twocanoes/xcreds/commit/85b71172d3192616371ccc30ea16fb6dd092a54e)\r\n*  fixed check timer to still work if mac sleeps [View](https://github.com/twocanoes/xcreds/commit/af491f5febf433bfeb8478d71a2fa29309676765)\r\n*  fixed issue with token update time [View](https://github.com/twocanoes/xcreds/commit/0d14279e4003400a0fef812247f3c790fc802f5e)\r\n*  fixed fade; cleaned up user mappings for weird characters [View](https://github.com/twocanoes/xcreds/commit/c6304954d6b02109d4ff90ed2d3b94963f761461)\r\n*  final touches [View](https://github.com/twocanoes/xcreds/commit/df5f1110c5800ac8aa31293ac509817a62fedfbc)\r\n*  bumped to 3.2; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/5a544859855835a6c1d8bfb35a39aeb30cda5962)\r\n*  bumped build number to 5000 [View](https://github.com/twocanoes/xcreds/commit/6250fdf999d7e57bfd51fe55186fde6fce92a3c0)\r\n*  updated permission for override_script [View](https://github.com/twocanoes/xcreds/commit/fac2af918a65d5f92c211e4707e9e14d36e5bee1)\r\n*  changed version back to 3.1; added better about window with history; changed override script requirments to be owned by _securityagent and be 700 [View](https://github.com/twocanoes/xcreds/commit/2f8dd4e599a71d02a88fa4a66814e419c71c0e65)\r\n*  added command click login window for mac login window [View](https://github.com/twocanoes/xcreds/commit/f0a5b1fc76c133f199da75f31202401476da2af1)\r\n*  text fixes [View](https://github.com/twocanoes/xcreds/commit/97c383e24729982c364e456ba5c3d49aa983060a)\r\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/b4fd79d1d43d922fac3581282c7eb9126d33ed8c)\r\n*  added back sample profie [View](https://github.com/twocanoes/xcreds/commit/6aa3ec4a58842f9a4dd748cd129ed4c14226888a)\r\n*  fixed timer minutes [View](https://github.com/twocanoes/xcreds/commit/e78b306018cd996176b9530ba302689bd1d3e358)\r\n\r\n\r\n## v3.1.4144 (2023-06-08)\r\n\r\n*  updated AD support: kerb ticket now obtained at user space app launch from password in keychain. udpated profile manifest with better comments; delete cookes on webview each time it appears; added local login button; shows username password if discoveryURL is not defined [View](https://github.com/twocanoes/xcreds/commit/d17509bd2ce49313561632e15bc2698e38f09721)\r\n\r\n\r\n## v3.1.4143 (2023-06-07)\r\n\r\n*  updated fullname [View](https://github.com/twocanoes/xcreds/commit/627199474b42349bd42f6dc47c4cd442b9c3357a)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d2370669893dc37937617be59a5601109915e991)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d0f4efdbf886cbe9a21e449fe8d47f1ed671bdcd)\r\n*  get kerb ticket on login [View](https://github.com/twocanoes/xcreds/commit/b7f7ad622ceaa57d27e419fa3fad10f0e040f8e3)\r\n\r\n\r\n## v3.1.4081 (2023-05-27)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added Package.resolved [View](https://github.com/twocanoes/xcreds/commit/91fb7f3da5e789dabb37a5a8585592c69c1a732c)\r\n*  added XCredsLoginPlugIn/errorpage.html [View](https://github.com/twocanoes/xcreds/commit/7bf66a34a1ef091f532959de62247ba1fbead13e)\r\n*  cleaned up build system a bit [View](https://github.com/twocanoes/xcreds/commit/f99ec4a8ae38ff00adabe9b43c1ff8577c803dd1)\r\n*  improved javascript parsing [View](https://github.com/twocanoes/xcreds/commit/ecf710eb181fd3f6dbdce7aedf511b8840e33ca6)\r\n*  fixed issue with initial javascript listener [View](https://github.com/twocanoes/xcreds/commit/574a51b5b8329be4cc2ec8c045f710548aecf7d6)\r\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/dfbf57f4a3d9649e2b35231bfedc6d591a7c3e41)\r\n*  removed reset option [View](https://github.com/twocanoes/xcreds/commit/3150fa654f3b8a55018f0a1e0390aa6ec541e125)\r\n*  removed KeychainReset and PasswordOverwriteSilent because it makes things worse [View](https://github.com/twocanoes/xcreds/commit/39362899ee0c0813f416057cad203061869daa84)\r\n*  added lock screen switch to login window [View](https://github.com/twocanoes/xcreds/commit/77c52ad11ab01b1afd5e011b38a06b3de9527196)\r\n*  fixed window levels, progress screen, background and boot runner issues [View](https://github.com/twocanoes/xcreds/commit/4c887fbdc82a0f63fcd8876aa662c6bc96ef7bbd)\r\n*  improved logging [View](https://github.com/twocanoes/xcreds/commit/e92ffe9e65f1a95b4b3e9f1c8ea1089ae7720863)\r\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/488b66494c65e8460eefdf5bbb8c0d271102f298)\r\n*  added override script and secure token admin reset [View](https://github.com/twocanoes/xcreds/commit/6717b3aa2cd0ef9d387484e7571183e6f8ffbb5d)\r\n*  removed shouldFindPasswordElement since that is defaulit fallback behavior [View](https://github.com/twocanoes/xcreds/commit/2825ee7b6db005f6aa8ca6d60c72210ae7343af4)\r\n*  cleaned up ui a bit [View](https://github.com/twocanoes/xcreds/commit/b64496bcb55573dff889a9ab92be2ed3f9cdd5e3)\r\n*  dont refresh prefs so much [View](https://github.com/twocanoes/xcreds/commit/91ee8dcd371fe9e2182fd421674f9fcd484e4d81)\r\n*  added check for group membership in oidc claim [View](https://github.com/twocanoes/xcreds/commit/2c03586a59821a04948692dcb9a41006ebf735f7)\r\n*  added history file [View](https://github.com/twocanoes/xcreds/commit/5fa6c0436a58535e03fd457de9dd720186274a38)\r\n\r\n\r\n## release-3.0 (2023-05-08)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n\r\n\r\n## release_3_0 (2023-04-18)\r\n\r\n*  added trial license beginnings [View](https://github.com/twocanoes/xcreds/commit/5a6cc5a91715e909dc8f9510f800dfffe485b7d6)\r\n*  fixed regression for password change not capturing new password on azure [View](https://github.com/twocanoes/xcreds/commit/8db379d829d925409abfea85da72a788ead43d22)\r\n*  bumped version to 3600 [View](https://github.com/twocanoes/xcreds/commit/f9601726f3d7255414d4ad44e20b9ac526af0f7c)\r\n*  fixed issue with crash if time is far off [View](https://github.com/twocanoes/xcreds/commit/9c1d0d81ed62f525614b79e3a3dbc4b4bed3964b)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/f309f95218424ca8f67177b0daed79d98344e943)\r\n*  updated license [View](https://github.com/twocanoes/xcreds/commit/534be3e278d1daae48218952d20194e4e03b17b4)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/e3c87a548a9e682b75ec01b4216ddfdda8a2ced2)\r\n\r\n\r\n## release_v2_4 (2023-03-28)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added more logging for id token and bumped version to 2.3 [View](https://github.com/twocanoes/xcreds/commit/b8494ee343dab510fba1c1f304623efc985455a0)\r\n*  added remove keychain option [View](https://github.com/twocanoes/xcreds/commit/19032d8df58c0bdd6197fc47f9f3aa2d8d6694ea)\r\n*  updated language on keychain option and added pref in manifest [View](https://github.com/twocanoes/xcreds/commit/709a7f29e696c088cc8e13959dadba8f9c0f8c8e)\r\n*  added key for customizing return to xcreds; added preference and ability to automatically refresh login window [View](https://github.com/twocanoes/xcreds/commit/514a1ba5ddaec55bfb8e40ca3e6c98a43c50ec7b)\r\n*  added in login window height/width [View](https://github.com/twocanoes/xcreds/commit/18e974e67f2833862a1a6913a6c4563e339d4239)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/6090d5ec4895045448920e774e16dc0614223919)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/0a7dad70364bd830b8028da2cadd62c98b79271d)\r\n*  fixed login window size and background image [View](https://github.com/twocanoes/xcreds/commit/339a66e7fdf6e8484da8f7c0a5c2ee6eed0aaef7)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/992512bb1ac27f36c655d1e1a02eafdbd47a2b80)\r\n*  updated sample configu [View](https://github.com/twocanoes/xcreds/commit/cd482e69520c8a7994eb8233e26c8a008c5048e7)\r\n*  tweaked text for user space refresh token window and added pref to show or hide [View](https://github.com/twocanoes/xcreds/commit/9f29893203caef8799683cc2ded3345f306c4528)\r\n*  fixed names and links in manifest [View](https://github.com/twocanoes/xcreds/commit/e759138ca72f2a4153fbea02f7b0b5cfd031bd01)\r\n*  fixed crashing issue due to null refreshview outlet [View](https://github.com/twocanoes/xcreds/commit/d3931983b53633c91c33494fc1fcccd7614948ad)\r\n*  added frontmost when prompting for keychain password [View](https://github.com/twocanoes/xcreds/commit/92ee6ed5c41dfefc798f1c839193aaa4a4a09f67)\r\n*  fixed issue with autorefresh [View](https://github.com/twocanoes/xcreds/commit/d7126a026281afaac27c9381a9c4e42d472b4b31)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/7a3d45178e299b52014fb3dd0adf6c180667222f)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/9ef84939d56cce29c9b8e3a84b0f070a30f7e30c)\r\n*  added 802.1x support; added support for pref key for finding password based on type=password [View](https://github.com/twocanoes/xcreds/commit/38ddeff5cd86d0cd43a97844c9d160da0ee446f3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/72da3de9c054f4fb35fb19c9bb6ffd5c2ebbb47a)\r\n\r\n\r\n## release_v2_1 (2023-01-11)\r\n\r\n\r\n\r\n## realease_v2_2 (2023-01-11)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  support getting password with get and adfs [View](https://github.com/twocanoes/xcreds/commit/494fdf75c79d8aa3b2c3cc6dc947f4423b2b3674)\r\n*  Revert \"support getting password with get and adfs\" [View](https://github.com/twocanoes/xcreds/commit/425bda9a9323fd7eb9437f09f9da63747db9dc8d)\r\n*  changed pref names for custom IDP / ADFS [View](https://github.com/twocanoes/xcreds/commit/83947497ec00cdfd7ec3b9a3683fa3b8e007aadf)\r\n*  fixed package template issue and updated manifest [View](https://github.com/twocanoes/xcreds/commit/f2540a6c64b5bc9971833e8fa859821d4822af9c)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  enabled rekeying FileVault implementation [View](https://github.com/twocanoes/xcreds/commit/2ba233e3695b8a7bda297b0908da933d24bec1c4)\r\n*  Support a Azure AD host [View](https://github.com/twocanoes/xcreds/commit/c0415863273f9797808d32633d3e800d630f9a0f)\r\n*  If fullname is empty, shorname is used. [View](https://github.com/twocanoes/xcreds/commit/7764740647f8e4450b411fa08849e5f4cceba078)\r\n*  added autologin when fv enabled [View](https://github.com/twocanoes/xcreds/commit/c8b394e055e2aa176af8a7f9e8cce53a3066f408)\r\n*  added okta compatibility [View](https://github.com/twocanoes/xcreds/commit/5f38e70e641bc2c8129e940ae7e9f710380fea5b)\r\n*  added a bit more logging [View](https://github.com/twocanoes/xcreds/commit/e2d2330a5050ab419290de466cef9f0b63407215)\r\n*  removed \"prompt\":\"consent\" [View](https://github.com/twocanoes/xcreds/commit/3e0a5e6de6342f36c9622aba3ad55d2db4488942)\r\n*  fixed notification prompt [View](https://github.com/twocanoes/xcreds/commit/40423c3b3ba271483826e49b6010f95e5b5683c7)\r\n*  added shouldShowCloudLoginByDefault user default [View](https://github.com/twocanoes/xcreds/commit/d8658f333726d8151c2486a7fe38f94cc29cacb2)\r\n*  added idhostnames array so you can specify multiple tenants [View](https://github.com/twocanoes/xcreds/commit/663dfa99b6bfb54487ca5cbc8d83618c8d180496)\r\n*  removed registration reminder [View](https://github.com/twocanoes/xcreds/commit/738dff1ab4396e14d701da2dcb79c5c657533433)\r\n*  removed spaces [View](https://github.com/twocanoes/xcreds/commit/180c2b9f4c267479723810a22a1dcc7715d992ce)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added mappings for user info [View](https://github.com/twocanoes/xcreds/commit/074ac99d5b3b72f3a8fb553670968f6e67da8f10)\r\n*  bumped version to 2.2 and build [View](https://github.com/twocanoes/xcreds/commit/23d902d5227eab2f3e61a6c931ccf63b94bc0ccb)\r\n*  added new key for OIDC mapping [View](https://github.com/twocanoes/xcreds/commit/485be954afebf7cbe808a8b23e0be6a7c5efa495)\r\n*  made keys lowercase for mappings [View](https://github.com/twocanoes/xcreds/commit/7432620d1a5c7e22e98975a5e806b73a9140d5ee)\r\n*  changed case of keys [View](https://github.com/twocanoes/xcreds/commit/ecac4002bd45677fa72386cc73a56bfe6d3f53ed)\r\n*  renamed mapped prefs with a prefix [View](https://github.com/twocanoes/xcreds/commit/aadd1445d92ac12e084946e1b40d97cf9f5aa6c7)\r\n*  username hint was not being set [View](https://github.com/twocanoes/xcreds/commit/aba884ce568c39653fec406f7c95b21b1c554642)\r\n*  added startup script [View](https://github.com/twocanoes/xcreds/commit/9c374670c37ba1b522e1247ec96a850a4e663b8e)\r\n*  added credit to script [View](https://github.com/twocanoes/xcreds/commit/e36e74db471c955bd356f150dbc9b19d240a50d4)\r\n*  implemented KeychainReset [View](https://github.com/twocanoes/xcreds/commit/0c34708fdeb9c9aa4303daa8382948d4e7d8143d)\r\n*  implemented PasswordOverwriteSilent [View](https://github.com/twocanoes/xcreds/commit/8fcee904d23440051516c74228213a64b4ead348)\r\n*  removed show prefs menu [View](https://github.com/twocanoes/xcreds/commit/d34328d71ec93b2663b75c080e41c8e0707b1f8e)\r\n*  fixed timer issue [View](https://github.com/twocanoes/xcreds/commit/1d37d90a8ce81a142b90874b5d35641db4a9c1a8)\r\n*  fixed shouldShowCloudLoginByDefault not working [View](https://github.com/twocanoes/xcreds/commit/570576b00c63db1f11ab5d7799301c9faed7f1e9)\r\n*  fixed edge case when not showing xcreds login when logging out [View](https://github.com/twocanoes/xcreds/commit/3447f7be9e35a5e894911c0fa7366be4fa0d3b05)\r\n*  removed test time [View](https://github.com/twocanoes/xcreds/commit/5bd5f84563b2a05fd4c2c169e1601cf5c270d8a9)\r\n*  added sub as local user account if other methods not available; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/fd4067d3a54850244f5f456825cbb531800dca85)\r\n*  remove progress screen overlay because it was hiding filevault [View](https://github.com/twocanoes/xcreds/commit/453a9b79a19bbd05c4d638c01337b4752943898d)\r\n\r\n\r\n## release_v2_0 (2022-08-30)\r\n\r\n*  bumped version to 1.1 [View](https://github.com/twocanoes/xcreds/commit/d6a4c915da4e771335915c6aa1dae53d94c8c039)\r\n*  added sample profile for google [View](https://github.com/twocanoes/xcreds/commit/342c8590fd5392822a9a57dd9a3293aa5f276eb6)\r\n*  Cloud password verification dialog not centered... #15 [View](https://github.com/twocanoes/xcreds/commit/b1d8ee6069a92e6b231b8bce944f684fa36ec68e)\r\n*  add \"have token\" indicator #10 [View](https://github.com/twocanoes/xcreds/commit/db746fd65ae1623e1d69f3c075391f474c9ccc3e)\r\n*  Hide \"About XCreds\" menu item #18; Ability to add a custom URL and menu item for \"Change Password #18 [View](https://github.com/twocanoes/xcreds/commit/f1c4593b4ad1b73899f9bc2cbfe61cd2d37eac11)\r\n*  start of login window [View](https://github.com/twocanoes/xcreds/commit/ce6cc87d6f5e0ee87ecea89514865fd7b92df476)\r\n*  pass username and password for login window [View](https://github.com/twocanoes/xcreds/commit/6addc7950cf499fb9bdeee098af1e0f9d35bfb63)\r\n*  added fade to login window complete [View](https://github.com/twocanoes/xcreds/commit/3fd2f6dd2f69f8ec41e7eda52937e98cf0a30738)\r\n*  restart and shutdown buttons [View](https://github.com/twocanoes/xcreds/commit/fde13dea140cf02043c8f9404c08917868bb5ecc)\r\n*  implemented swiching back to mac login window [View](https://github.com/twocanoes/xcreds/commit/85545c29a8ad7c2b28daef1f8e8024bf377761ba)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/e755e305eb936a965cb0ef133d9f7c1cfb7cc765)\r\n*  fixed xcreds breakage due to refactoring for xcreds login window [View](https://github.com/twocanoes/xcreds/commit/f41778819ed0d04325880e641799f723732ca6f3)\r\n*  added keychain updating with tokens [View](https://github.com/twocanoes/xcreds/commit/2e3114e4f657761addd714abe7de790350623c83)\r\n*  xcreds login window [View](https://github.com/twocanoes/xcreds/commit/03e929f9fa582b394686bb7669b28d0e906c4cd9)\r\n*  added return to cloud login and wait message [View](https://github.com/twocanoes/xcreds/commit/f29ea30d43e51b6ef44bfbdad7d0ccd1d650a6b3)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/7fb698159e5f0b6cd54057d0938ddd0a448bd321)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/ce8b9197c101d106605d5ea8e6bf87f5b52412ac)\r\n*  added username to manifest [View](https://github.com/twocanoes/xcreds/commit/aa7945756f9c0a0573cf79b48c677c35dfbe7469)\r\n*  fixed install scripts [View](https://github.com/twocanoes/xcreds/commit/ad2152c8e24b03dd685627d052b3116e5badfd62)\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/690e6966e81bcb27f8859c010c230d2d0af4ba0a)\r\n*  updaed sample profiles [View](https://github.com/twocanoes/xcreds/commit/5cd70f021fc8a4b7321dbfe7bd5cf1298a901609)\r\n*  added arbitrary check for password in form [View](https://github.com/twocanoes/xcreds/commit/9d1dadac7750544dffa4db82fc258f0b7ed9663e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/bb90624c3d9a45870956621f22b41da5434e2bce)\r\n*  fixed idtoken required values causing failure [View](https://github.com/twocanoes/xcreds/commit/de5dd6affee913fc6f2f65125188a8e894460b65)\r\n*  added build number when starting up [View](https://github.com/twocanoes/xcreds/commit/2d4b70a192e119352cccc2d7318b8997e3c7fe74)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/5f6bdd336f311caa991f10c380b15f9acc2f5bb2)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/26b995a2173376ea6275a037a7866ea154b9ef31)\r\n*  create user mech [View](https://github.com/twocanoes/xcreds/commit/2bd3cb885f9cfc2557cc709404a8c665e99236f1)\r\n*  tweaked create user [View](https://github.com/twocanoes/xcreds/commit/4bfdd1017266b30d25e9fb0162decbe54fe3b5a9)\r\n*  added FDE enable [View](https://github.com/twocanoes/xcreds/commit/2422e5588412d4cc721f93c0695405d939096c42)\r\n*  updated prefs [View](https://github.com/twocanoes/xcreds/commit/14d39e3fe023b6412a73b6cba2a214b283a1b7d7)\r\n*  added fde option [View](https://github.com/twocanoes/xcreds/commit/2b022b47d6c23e2bbf6fcd6f0b7bb249df689bc1)\r\n*  added network changing detection to reload page [View](https://github.com/twocanoes/xcreds/commit/de4acf06e2e7b18c232dd0dcd5ce55e8944d2e2a)\r\n*  fixed status icon issue; fixed lack of prompting on first launch [View](https://github.com/twocanoes/xcreds/commit/9aa2d77b366fe963aed1ec78c932c467d83f5b63)\r\n*  added default to create keychain [View](https://github.com/twocanoes/xcreds/commit/27be41527d7716df6fbcd9ed276f542b80e53682)\r\n*  added better loading at start [View](https://github.com/twocanoes/xcreds/commit/1223e399814d061d9962a75d6c037445cd9862f9)\r\n*  updated loading message [View](https://github.com/twocanoes/xcreds/commit/d8d1b96e3e2927eb110747155942c4f000c8872c)\r\n*  smother transitions and background image [View](https://github.com/twocanoes/xcreds/commit/6f6f2b9c7b24a3724440b77b52d86cfaeca3169d)\r\n*  fixed background image url [View](https://github.com/twocanoes/xcreds/commit/8164b122c71f76b0bea9a3237d386ffac9ec0d30)\r\n*  fixed overlay not showing [View](https://github.com/twocanoes/xcreds/commit/6cedc60bbaad9747209ae73521a0af480a8301a0)\r\n*  fixed regression with back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/ff3dee83940377a8544283d207e011f5854be8c3)\r\n*  add tweak to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/7aafd66a0d75a3ee09dc6a4cd1c7f211877fb15b)\r\n*  more tweaks to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/b2ef99f2db8056933eb2c047f28d6449059103dd)\r\n*  fixed minor issues with prefs [View](https://github.com/twocanoes/xcreds/commit/18bccee23ceb28e47bd25f7ed38433dea76e787b)\r\n*  reverted default [View](https://github.com/twocanoes/xcreds/commit/5fe505fa6c90b1ae198bc1d5aeac6068e0e9ecdc)\r\n*  project update [View](https://github.com/twocanoes/xcreds/commit/4ea4da0da0260d9d9379ea599689d1c5ed1515b5)\r\n\r\n\r\n## prebeta (2022-06-15)\r\n\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/7289a72ae79005797fa4651dc61328354aca7c2b)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/07947e9e66f68db049481b6e35373a8a5b5a4bf5)\r\n*  added support for Google IdP [View](https://github.com/twocanoes/xcreds/commit/4733a6cdeef503db2e08a21bb9443700bfb9526d)\r\n\r\n\r\n---\r\n\r\n## XCreds 4 Beta 4 (01/01/2024)\r\n# What's New\r\nBug fixes and and minor tweaks\r\n\r\n## 4.0.6203 (2024-01-01)\r\n\r\n*  added release notes and script to generate release notes [View](https://github.com/twocanoes/xcreds/commit/ff9dc64fea8e6f438755e1d72837fce4391d167c)\r\n*  Feature Request: Allow \"loadpage.html\" to be customized. #126. To test, add in new keys \"loadPageTitle\" and \"loadPageInfo\" or try the xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/37c7477f66362c1823c49138b49afcad388abbc5)\r\n*  Update description in manifest for loginWindowWidth and loginWindowHeight #138 [View](https://github.com/twocanoes/xcreds/commit/5951d753b391fda49534c5dda13d508479e66fd8)\r\n*  [feature request] LocalAD - make sync password with AD optional with preference key #130. To test, set the shouldPromptForADPasswordChange to false and set the user account to require password change on next login and verify the user is not prompted [View](https://github.com/twocanoes/xcreds/commit/0b85b4ffb8e95b8d79ffcf455ac034c05ce4d4f4)\r\n*  XCreds breaking Munki's logout/install @loginscreen logic #102. Test by defining hideIfPathExists to a path like /tmp/hide and then add/remove and UI should show /hide. Or use sample profile xcreds_example_azure_hide.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/770c179262658ccfd27f9de3808b931cc69a86e4)\r\n*  Option to enforce account to log in #21. To test, create allowedUsersArray with name of user allowed to log in and define allowUsersClaim with an OIDC claim that contains that value. Or use the xcreds_example_azure_allow_fred.mobileconfig to test [View](https://github.com/twocanoes/xcreds/commit/ee95927865f1e912898c4d030cb367fd589db114)\r\n*  Feature Request: Force Wi-Fi on option or Wi-Fi on/off switch in \"Configure Wi-Fi\" #58 [View](https://github.com/twocanoes/xcreds/commit/bfa28014c7d0c000369d49bf9a3896128616901a)\r\n*  added removeadmin function but not used since it can cause local admins to unadmin [View](https://github.com/twocanoes/xcreds/commit/cc322befaf88bf3440a9d086089468660a4354f3)\r\n*  loginWindowBackgroundImageURL image should be cached if not a file:// URL #72 [View](https://github.com/twocanoes/xcreds/commit/b2cfd643ac6419904cc30037eaceaf5bb939cc7b)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/500575b7dfa81c7a9a7231aeac88bd3cfe6a5497)\r\n\r\n\r\n## 4.0.6177 (2023-12-28)\r\n\r\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\r\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552)\r\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017)\r\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8)\r\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7)\r\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd)\r\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14)\r\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20)\r\n*  https://github.com/twocanoes/xcreds/issues/54 [View](https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\r\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f)\r\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3)\r\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee)\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f)\r\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)\r\n*  ropg at login window initial implementation [View](https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)\r\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)\r\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2)\r\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300)\r\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b)\r\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad)\r\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976)\r\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41)\r\n\r\n\r\n## 4.0.6023 (2023-12-12)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow [View](https://github.com/twocanoes/xcreds/commit/6f3737257205f4d2faa035b6f051bf6bfed2074b)\r\n*  refactored code to add admin to user account based on group membership each login (issue #109); added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) [View](https://github.com/twocanoes/xcreds/commit/8376942e6e23f8804bd5cec3cfff383792391031)\r\n*  updated license agreement (issue #90) [View](https://github.com/twocanoes/xcreds/commit/f41411c5a51706ba7b33776edc845a409400bf1e)\r\n*  Detect when no password was entered #17 [View](https://github.com/twocanoes/xcreds/commit/7cf2837f3d653a893f2f5c031c0a72298340aa70)\r\n*  updated animation when logging in [View](https://github.com/twocanoes/xcreds/commit/51387b15384032bc5f4e82a5d6fea8a49c6e2625)\r\n*  adding arbitrary claims to local DS user account [View](https://github.com/twocanoes/xcreds/commit/e47832e21a76d3ae86af3e7e5fee41f29772436f)\r\n*  fixed Active Directory issue after password change #112 [View](https://github.com/twocanoes/xcreds/commit/14e2a7c1e1d15e8655f44bef182a2e14bc0892ce)\r\n*  partial fix for #114 [View](https://github.com/twocanoes/xcreds/commit/856a3549bec86c6c52b4ed368b2e59d25c38c5a7)\r\n*  refactored windows to views [View](https://github.com/twocanoes/xcreds/commit/8a0994c7dfbe071ce5397d52070c2a4c9ab9a309)\r\n*  fixed centering and cloud login sizing [View](https://github.com/twocanoes/xcreds/commit/f83d523c57cf9f65f6f1b7931bdf34ad5a04c090)\r\n*  fixing timing for animation when logging in; tweaked UI [View](https://github.com/twocanoes/xcreds/commit/9c659dbb4a12c9ee4cbe396119a058d2594e6827)\r\n*  streamlined startup process [View](https://github.com/twocanoes/xcreds/commit/1895f0365a3aba91fc9c43961bca78ee6a9482e6)\r\n*  refactored dialogs for prompting for user info; fixed ad groups for making admin user [View](https://github.com/twocanoes/xcreds/commit/7c5af73cb91a83c8f323edc1d8bd9538b02fbd71)\r\n*  added missing template for package [View](https://github.com/twocanoes/xcreds/commit/281fe86d7bb33c7f278f05117794069c991efb47)\r\n*  fixed showing offline button [View](https://github.com/twocanoes/xcreds/commit/72ffc3fd5434eb742e1cffa3cb073228f4883292)\r\n*  implemented feature request: localad/kebereros support for saving groups to prefs #125 [View](https://github.com/twocanoes/xcreds/commit/1d3e2be0a87c3e5d2843767db28de90894bc12cc)\r\n*  fixed enabling views when logging in [View](https://github.com/twocanoes/xcreds/commit/3ac6e3739200a3ae6f708be731c4d7acdf279e7e)\r\n*  fixed javascript to key on input instead of keydown/keyup [View](https://github.com/twocanoes/xcreds/commit/3d41a199cfd92f233677cc6859f837ede388311c)\r\n*  implemented Prompt for Secure Token Admin Login When Required #123 [View](https://github.com/twocanoes/xcreds/commit/32b118fe0c96b6cee8bd8a37bcff22611f28e55b)\r\n*  fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 [View](https://github.com/twocanoes/xcreds/commit/21814425a055f0240fb4c11c37c0d01045620fd6)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/a5aca79363b6f3cc974442534bbc7818b0e4775b)\r\n*  fixed issue with updating password in userspace [View](https://github.com/twocanoes/xcreds/commit/9e483c451eccac80fc533f993fe21a526970fd9e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/867fc0f3337cde76a06cb821471de2bcd6fb9506)\r\n\r\n\r\n## v3.2.1.6002 (2023-12-11)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/e621f6a8da59c6923f0ba12b6a3abf5c9a916f34)\r\n*  bumped version and build [View](https://github.com/twocanoes/xcreds/commit/7140e72c2e619e26b2db99e21f917f6b3147570a)\r\n*  adde missing credits file [View](https://github.com/twocanoes/xcreds/commit/81f8e48a696c1eeab46bbcb4f36eea66fe6113f4)\r\n\r\n\r\n## v3.3.5269 (2023-11-27)\r\n\r\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\r\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\r\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\r\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\r\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\r\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\r\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\r\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\r\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\r\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\r\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\r\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\r\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\r\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\r\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\r\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\r\n\r\n\r\n## v3.2.5197 (2023-10-17)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated url in profile manifest [View](https://github.com/twocanoes/xcreds/commit/33ef0c9f2f30afc4260526b27ee4e6995e94fcfa)\r\n*  fixed issue 95: whitespace characters in password and username [View](https://github.com/twocanoes/xcreds/commit/63f4ca53c2c1ba31fd93fd4921042d21284570c6)\r\n*  shouldPreferLocalLoginInsteadOfCloudLogin [View](https://github.com/twocanoes/xcreds/commit/79e798afab9162255b7a019b74bbb3122330e83a)\r\n*  another attempt at fixing https://github.com/twocanoes/xcreds/issues/95 [View](https://github.com/twocanoes/xcreds/commit/819e9a047f8d1e9e6d5a4f26b32238cb7fc9da88)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/4ac36cbc2d085ee32bd8d82a66feeb925ff118fb)\r\n*  fixed keyboard nav for controls [View](https://github.com/twocanoes/xcreds/commit/c5c0cad10f5d5f22f8b6ce3d0993f5f1f72d8f3b)\r\n*  issue #100: Detect Offline [View](https://github.com/twocanoes/xcreds/commit/fe804f167446fc4b22e128cca576ddd7276fd96f)\r\n*  Add ability to check passwords via ROPG [View](https://github.com/twocanoes/xcreds/commit/f7c62c0466106cbc26f9f67be441dad847c32ecf)\r\n*  Rename prefkey to be more boolean [View](https://github.com/twocanoes/xcreds/commit/2909f625588fe25c2082fbf2ff88df468e19c79d)\r\n*  update to profile manifest [View](https://github.com/twocanoes/xcreds/commit/7fcb0a392b0e8d8c19e81f8e827d6de996da75c4)\r\n*  fixed typo in function name [View](https://github.com/twocanoes/xcreds/commit/8c12d454e393cc0c52a0feb314a67c357bbac1c9)\r\n*  added a smidge more logging [View](https://github.com/twocanoes/xcreds/commit/86256a2825eeeebf6eb63fe26451c372e149c2a2)\r\n*  added self healing for auth rights [View](https://github.com/twocanoes/xcreds/commit/9b43e1cb382cfea1b40a2f40b6cdf6189fed385b)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/7cdf884f2aed100080069e9b3a589af736062c99)\r\n\r\n\r\n## release_3_1 (2023-07-14)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  updated history.md [View](https://github.com/twocanoes/xcreds/commit/85b71172d3192616371ccc30ea16fb6dd092a54e)\r\n*  fixed check timer to still work if mac sleeps [View](https://github.com/twocanoes/xcreds/commit/af491f5febf433bfeb8478d71a2fa29309676765)\r\n*  fixed issue with token update time [View](https://github.com/twocanoes/xcreds/commit/0d14279e4003400a0fef812247f3c790fc802f5e)\r\n*  fixed fade; cleaned up user mappings for weird characters [View](https://github.com/twocanoes/xcreds/commit/c6304954d6b02109d4ff90ed2d3b94963f761461)\r\n*  final touches [View](https://github.com/twocanoes/xcreds/commit/df5f1110c5800ac8aa31293ac509817a62fedfbc)\r\n*  bumped to 3.2; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/5a544859855835a6c1d8bfb35a39aeb30cda5962)\r\n*  bumped build number to 5000 [View](https://github.com/twocanoes/xcreds/commit/6250fdf999d7e57bfd51fe55186fde6fce92a3c0)\r\n*  updated permission for override_script [View](https://github.com/twocanoes/xcreds/commit/fac2af918a65d5f92c211e4707e9e14d36e5bee1)\r\n*  changed version back to 3.1; added better about window with history; changed override script requirments to be owned by _securityagent and be 700 [View](https://github.com/twocanoes/xcreds/commit/2f8dd4e599a71d02a88fa4a66814e419c71c0e65)\r\n*  added command click login window for mac login window [View](https://github.com/twocanoes/xcreds/commit/f0a5b1fc76c133f199da75f31202401476da2af1)\r\n*  text fixes [View](https://github.com/twocanoes/xcreds/commit/97c383e24729982c364e456ba5c3d49aa983060a)\r\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/b4fd79d1d43d922fac3581282c7eb9126d33ed8c)\r\n*  added back sample profie [View](https://github.com/twocanoes/xcreds/commit/6aa3ec4a58842f9a4dd748cd129ed4c14226888a)\r\n*  fixed timer minutes [View](https://github.com/twocanoes/xcreds/commit/e78b306018cd996176b9530ba302689bd1d3e358)\r\n\r\n\r\n## v3.1.4144 (2023-06-08)\r\n\r\n*  updated AD support: kerb ticket now obtained at user space app launch from password in keychain. udpated profile manifest with better comments; delete cookes on webview each time it appears; added local login button; shows username password if discoveryURL is not defined [View](https://github.com/twocanoes/xcreds/commit/d17509bd2ce49313561632e15bc2698e38f09721)\r\n\r\n\r\n## v3.1.4143 (2023-06-07)\r\n\r\n*  updated fullname [View](https://github.com/twocanoes/xcreds/commit/627199474b42349bd42f6dc47c4cd442b9c3357a)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d2370669893dc37937617be59a5601109915e991)\r\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d0f4efdbf886cbe9a21e449fe8d47f1ed671bdcd)\r\n*  get kerb ticket on login [View](https://github.com/twocanoes/xcreds/commit/b7f7ad622ceaa57d27e419fa3fad10f0e040f8e3)\r\n\r\n\r\n## v3.1.4081 (2023-05-27)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added Package.resolved [View](https://github.com/twocanoes/xcreds/commit/91fb7f3da5e789dabb37a5a8585592c69c1a732c)\r\n*  added XCredsLoginPlugIn/errorpage.html [View](https://github.com/twocanoes/xcreds/commit/7bf66a34a1ef091f532959de62247ba1fbead13e)\r\n*  cleaned up build system a bit [View](https://github.com/twocanoes/xcreds/commit/f99ec4a8ae38ff00adabe9b43c1ff8577c803dd1)\r\n*  improved javascript parsing [View](https://github.com/twocanoes/xcreds/commit/ecf710eb181fd3f6dbdce7aedf511b8840e33ca6)\r\n*  fixed issue with initial javascript listener [View](https://github.com/twocanoes/xcreds/commit/574a51b5b8329be4cc2ec8c045f710548aecf7d6)\r\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/dfbf57f4a3d9649e2b35231bfedc6d591a7c3e41)\r\n*  removed reset option [View](https://github.com/twocanoes/xcreds/commit/3150fa654f3b8a55018f0a1e0390aa6ec541e125)\r\n*  removed KeychainReset and PasswordOverwriteSilent because it makes things worse [View](https://github.com/twocanoes/xcreds/commit/39362899ee0c0813f416057cad203061869daa84)\r\n*  added lock screen switch to login window [View](https://github.com/twocanoes/xcreds/commit/77c52ad11ab01b1afd5e011b38a06b3de9527196)\r\n*  fixed window levels, progress screen, background and boot runner issues [View](https://github.com/twocanoes/xcreds/commit/4c887fbdc82a0f63fcd8876aa662c6bc96ef7bbd)\r\n*  improved logging [View](https://github.com/twocanoes/xcreds/commit/e92ffe9e65f1a95b4b3e9f1c8ea1089ae7720863)\r\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/488b66494c65e8460eefdf5bbb8c0d271102f298)\r\n*  added override script and secure token admin reset [View](https://github.com/twocanoes/xcreds/commit/6717b3aa2cd0ef9d387484e7571183e6f8ffbb5d)\r\n*  removed shouldFindPasswordElement since that is defaulit fallback behavior [View](https://github.com/twocanoes/xcreds/commit/2825ee7b6db005f6aa8ca6d60c72210ae7343af4)\r\n*  cleaned up ui a bit [View](https://github.com/twocanoes/xcreds/commit/b64496bcb55573dff889a9ab92be2ed3f9cdd5e3)\r\n*  dont refresh prefs so much [View](https://github.com/twocanoes/xcreds/commit/91ee8dcd371fe9e2182fd421674f9fcd484e4d81)\r\n*  added check for group membership in oidc claim [View](https://github.com/twocanoes/xcreds/commit/2c03586a59821a04948692dcb9a41006ebf735f7)\r\n*  added history file [View](https://github.com/twocanoes/xcreds/commit/5fa6c0436a58535e03fd457de9dd720186274a38)\r\n\r\n\r\n## release-3.0 (2023-05-08)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n\r\n\r\n## release_3_0 (2023-04-18)\r\n\r\n*  added trial license beginnings [View](https://github.com/twocanoes/xcreds/commit/5a6cc5a91715e909dc8f9510f800dfffe485b7d6)\r\n*  fixed regression for password change not capturing new password on azure [View](https://github.com/twocanoes/xcreds/commit/8db379d829d925409abfea85da72a788ead43d22)\r\n*  bumped version to 3600 [View](https://github.com/twocanoes/xcreds/commit/f9601726f3d7255414d4ad44e20b9ac526af0f7c)\r\n*  fixed issue with crash if time is far off [View](https://github.com/twocanoes/xcreds/commit/9c1d0d81ed62f525614b79e3a3dbc4b4bed3964b)\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/f309f95218424ca8f67177b0daed79d98344e943)\r\n*  updated license [View](https://github.com/twocanoes/xcreds/commit/534be3e278d1daae48218952d20194e4e03b17b4)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/e3c87a548a9e682b75ec01b4216ddfdda8a2ced2)\r\n\r\n\r\n## release_v2_4 (2023-03-28)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added more logging for id token and bumped version to 2.3 [View](https://github.com/twocanoes/xcreds/commit/b8494ee343dab510fba1c1f304623efc985455a0)\r\n*  added remove keychain option [View](https://github.com/twocanoes/xcreds/commit/19032d8df58c0bdd6197fc47f9f3aa2d8d6694ea)\r\n*  updated language on keychain option and added pref in manifest [View](https://github.com/twocanoes/xcreds/commit/709a7f29e696c088cc8e13959dadba8f9c0f8c8e)\r\n*  added key for customizing return to xcreds; added preference and ability to automatically refresh login window [View](https://github.com/twocanoes/xcreds/commit/514a1ba5ddaec55bfb8e40ca3e6c98a43c50ec7b)\r\n*  added in login window height/width [View](https://github.com/twocanoes/xcreds/commit/18e974e67f2833862a1a6913a6c4563e339d4239)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/6090d5ec4895045448920e774e16dc0614223919)\r\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/0a7dad70364bd830b8028da2cadd62c98b79271d)\r\n*  fixed login window size and background image [View](https://github.com/twocanoes/xcreds/commit/339a66e7fdf6e8484da8f7c0a5c2ee6eed0aaef7)\r\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/992512bb1ac27f36c655d1e1a02eafdbd47a2b80)\r\n*  updated sample configu [View](https://github.com/twocanoes/xcreds/commit/cd482e69520c8a7994eb8233e26c8a008c5048e7)\r\n*  tweaked text for user space refresh token window and added pref to show or hide [View](https://github.com/twocanoes/xcreds/commit/9f29893203caef8799683cc2ded3345f306c4528)\r\n*  fixed names and links in manifest [View](https://github.com/twocanoes/xcreds/commit/e759138ca72f2a4153fbea02f7b0b5cfd031bd01)\r\n*  fixed crashing issue due to null refreshview outlet [View](https://github.com/twocanoes/xcreds/commit/d3931983b53633c91c33494fc1fcccd7614948ad)\r\n*  added frontmost when prompting for keychain password [View](https://github.com/twocanoes/xcreds/commit/92ee6ed5c41dfefc798f1c839193aaa4a4a09f67)\r\n*  fixed issue with autorefresh [View](https://github.com/twocanoes/xcreds/commit/d7126a026281afaac27c9381a9c4e42d472b4b31)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/7a3d45178e299b52014fb3dd0adf6c180667222f)\r\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/9ef84939d56cce29c9b8e3a84b0f070a30f7e30c)\r\n*  added 802.1x support; added support for pref key for finding password based on type=password [View](https://github.com/twocanoes/xcreds/commit/38ddeff5cd86d0cd43a97844c9d160da0ee446f3)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/72da3de9c054f4fb35fb19c9bb6ffd5c2ebbb47a)\r\n\r\n\r\n## release_v2_1 (2023-01-11)\r\n\r\n\r\n\r\n## realease_v2_2 (2023-01-11)\r\n\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\r\n*  support getting password with get and adfs [View](https://github.com/twocanoes/xcreds/commit/494fdf75c79d8aa3b2c3cc6dc947f4423b2b3674)\r\n*  Revert \"support getting password with get and adfs\" [View](https://github.com/twocanoes/xcreds/commit/425bda9a9323fd7eb9437f09f9da63747db9dc8d)\r\n*  changed pref names for custom IDP / ADFS [View](https://github.com/twocanoes/xcreds/commit/83947497ec00cdfd7ec3b9a3683fa3b8e007aadf)\r\n*  fixed package template issue and updated manifest [View](https://github.com/twocanoes/xcreds/commit/f2540a6c64b5bc9971833e8fa859821d4822af9c)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\r\n*  enabled rekeying FileVault implementation [View](https://github.com/twocanoes/xcreds/commit/2ba233e3695b8a7bda297b0908da933d24bec1c4)\r\n*  Support a Azure AD host [View](https://github.com/twocanoes/xcreds/commit/c0415863273f9797808d32633d3e800d630f9a0f)\r\n*  If fullname is empty, shorname is used. [View](https://github.com/twocanoes/xcreds/commit/7764740647f8e4450b411fa08849e5f4cceba078)\r\n*  added autologin when fv enabled [View](https://github.com/twocanoes/xcreds/commit/c8b394e055e2aa176af8a7f9e8cce53a3066f408)\r\n*  added okta compatibility [View](https://github.com/twocanoes/xcreds/commit/5f38e70e641bc2c8129e940ae7e9f710380fea5b)\r\n*  added a bit more logging [View](https://github.com/twocanoes/xcreds/commit/e2d2330a5050ab419290de466cef9f0b63407215)\r\n*  removed \"prompt\":\"consent\" [View](https://github.com/twocanoes/xcreds/commit/3e0a5e6de6342f36c9622aba3ad55d2db4488942)\r\n*  fixed notification prompt [View](https://github.com/twocanoes/xcreds/commit/40423c3b3ba271483826e49b6010f95e5b5683c7)\r\n*  added shouldShowCloudLoginByDefault user default [View](https://github.com/twocanoes/xcreds/commit/d8658f333726d8151c2486a7fe38f94cc29cacb2)\r\n*  added idhostnames array so you can specify multiple tenants [View](https://github.com/twocanoes/xcreds/commit/663dfa99b6bfb54487ca5cbc8d83618c8d180496)\r\n*  removed registration reminder [View](https://github.com/twocanoes/xcreds/commit/738dff1ab4396e14d701da2dcb79c5c657533433)\r\n*  removed spaces [View](https://github.com/twocanoes/xcreds/commit/180c2b9f4c267479723810a22a1dcc7715d992ce)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\r\n*  added mappings for user info [View](https://github.com/twocanoes/xcreds/commit/074ac99d5b3b72f3a8fb553670968f6e67da8f10)\r\n*  bumped version to 2.2 and build [View](https://github.com/twocanoes/xcreds/commit/23d902d5227eab2f3e61a6c931ccf63b94bc0ccb)\r\n*  added new key for OIDC mapping [View](https://github.com/twocanoes/xcreds/commit/485be954afebf7cbe808a8b23e0be6a7c5efa495)\r\n*  made keys lowercase for mappings [View](https://github.com/twocanoes/xcreds/commit/7432620d1a5c7e22e98975a5e806b73a9140d5ee)\r\n*  changed case of keys [View](https://github.com/twocanoes/xcreds/commit/ecac4002bd45677fa72386cc73a56bfe6d3f53ed)\r\n*  renamed mapped prefs with a prefix [View](https://github.com/twocanoes/xcreds/commit/aadd1445d92ac12e084946e1b40d97cf9f5aa6c7)\r\n*  username hint was not being set [View](https://github.com/twocanoes/xcreds/commit/aba884ce568c39653fec406f7c95b21b1c554642)\r\n*  added startup script [View](https://github.com/twocanoes/xcreds/commit/9c374670c37ba1b522e1247ec96a850a4e663b8e)\r\n*  added credit to script [View](https://github.com/twocanoes/xcreds/commit/e36e74db471c955bd356f150dbc9b19d240a50d4)\r\n*  implemented KeychainReset [View](https://github.com/twocanoes/xcreds/commit/0c34708fdeb9c9aa4303daa8382948d4e7d8143d)\r\n*  implemented PasswordOverwriteSilent [View](https://github.com/twocanoes/xcreds/commit/8fcee904d23440051516c74228213a64b4ead348)\r\n*  removed show prefs menu [View](https://github.com/twocanoes/xcreds/commit/d34328d71ec93b2663b75c080e41c8e0707b1f8e)\r\n*  fixed timer issue [View](https://github.com/twocanoes/xcreds/commit/1d37d90a8ce81a142b90874b5d35641db4a9c1a8)\r\n*  fixed shouldShowCloudLoginByDefault not working [View](https://github.com/twocanoes/xcreds/commit/570576b00c63db1f11ab5d7799301c9faed7f1e9)\r\n*  fixed edge case when not showing xcreds login when logging out [View](https://github.com/twocanoes/xcreds/commit/3447f7be9e35a5e894911c0fa7366be4fa0d3b05)\r\n*  removed test time [View](https://github.com/twocanoes/xcreds/commit/5bd5f84563b2a05fd4c2c169e1601cf5c270d8a9)\r\n*  added sub as local user account if other methods not available; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/fd4067d3a54850244f5f456825cbb531800dca85)\r\n*  remove progress screen overlay because it was hiding filevault [View](https://github.com/twocanoes/xcreds/commit/453a9b79a19bbd05c4d638c01337b4752943898d)\r\n\r\n\r\n## release_v2_0 (2022-08-30)\r\n\r\n*  bumped version to 1.1 [View](https://github.com/twocanoes/xcreds/commit/d6a4c915da4e771335915c6aa1dae53d94c8c039)\r\n*  added sample profile for google [View](https://github.com/twocanoes/xcreds/commit/342c8590fd5392822a9a57dd9a3293aa5f276eb6)\r\n*  Cloud password verification dialog not centered... #15 [View](https://github.com/twocanoes/xcreds/commit/b1d8ee6069a92e6b231b8bce944f684fa36ec68e)\r\n*  add \"have token\" indicator #10 [View](https://github.com/twocanoes/xcreds/commit/db746fd65ae1623e1d69f3c075391f474c9ccc3e)\r\n*  Hide \"About XCreds\" menu item #18; Ability to add a custom URL and menu item for \"Change Password #18 [View](https://github.com/twocanoes/xcreds/commit/f1c4593b4ad1b73899f9bc2cbfe61cd2d37eac11)\r\n*  start of login window [View](https://github.com/twocanoes/xcreds/commit/ce6cc87d6f5e0ee87ecea89514865fd7b92df476)\r\n*  pass username and password for login window [View](https://github.com/twocanoes/xcreds/commit/6addc7950cf499fb9bdeee098af1e0f9d35bfb63)\r\n*  added fade to login window complete [View](https://github.com/twocanoes/xcreds/commit/3fd2f6dd2f69f8ec41e7eda52937e98cf0a30738)\r\n*  restart and shutdown buttons [View](https://github.com/twocanoes/xcreds/commit/fde13dea140cf02043c8f9404c08917868bb5ecc)\r\n*  implemented swiching back to mac login window [View](https://github.com/twocanoes/xcreds/commit/85545c29a8ad7c2b28daef1f8e8024bf377761ba)\r\n*  wip [View](https://github.com/twocanoes/xcreds/commit/e755e305eb936a965cb0ef133d9f7c1cfb7cc765)\r\n*  fixed xcreds breakage due to refactoring for xcreds login window [View](https://github.com/twocanoes/xcreds/commit/f41778819ed0d04325880e641799f723732ca6f3)\r\n*  added keychain updating with tokens [View](https://github.com/twocanoes/xcreds/commit/2e3114e4f657761addd714abe7de790350623c83)\r\n*  xcreds login window [View](https://github.com/twocanoes/xcreds/commit/03e929f9fa582b394686bb7669b28d0e906c4cd9)\r\n*  added return to cloud login and wait message [View](https://github.com/twocanoes/xcreds/commit/f29ea30d43e51b6ef44bfbdad7d0ccd1d650a6b3)\r\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/7fb698159e5f0b6cd54057d0938ddd0a448bd321)\r\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/ce8b9197c101d106605d5ea8e6bf87f5b52412ac)\r\n*  added username to manifest [View](https://github.com/twocanoes/xcreds/commit/aa7945756f9c0a0573cf79b48c677c35dfbe7469)\r\n*  fixed install scripts [View](https://github.com/twocanoes/xcreds/commit/ad2152c8e24b03dd685627d052b3116e5badfd62)\r\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/690e6966e81bcb27f8859c010c230d2d0af4ba0a)\r\n*  updaed sample profiles [View](https://github.com/twocanoes/xcreds/commit/5cd70f021fc8a4b7321dbfe7bd5cf1298a901609)\r\n*  added arbitrary check for password in form [View](https://github.com/twocanoes/xcreds/commit/9d1dadac7750544dffa4db82fc258f0b7ed9663e)\r\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/bb90624c3d9a45870956621f22b41da5434e2bce)\r\n*  fixed idtoken required values causing failure [View](https://github.com/twocanoes/xcreds/commit/de5dd6affee913fc6f2f65125188a8e894460b65)\r\n*  added build number when starting up [View](https://github.com/twocanoes/xcreds/commit/2d4b70a192e119352cccc2d7318b8997e3c7fe74)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/5f6bdd336f311caa991f10c380b15f9acc2f5bb2)\r\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/26b995a2173376ea6275a037a7866ea154b9ef31)\r\n*  create user mech [View](https://github.com/twocanoes/xcreds/commit/2bd3cb885f9cfc2557cc709404a8c665e99236f1)\r\n*  tweaked create user [View](https://github.com/twocanoes/xcreds/commit/4bfdd1017266b30d25e9fb0162decbe54fe3b5a9)\r\n*  added FDE enable [View](https://github.com/twocanoes/xcreds/commit/2422e5588412d4cc721f93c0695405d939096c42)\r\n*  updated prefs [View](https://github.com/twocanoes/xcreds/commit/14d39e3fe023b6412a73b6cba2a214b283a1b7d7)\r\n*  added fde option [View](https://github.com/twocanoes/xcreds/commit/2b022b47d6c23e2bbf6fcd6f0b7bb249df689bc1)\r\n*  added network changing detection to reload page [View](https://github.com/twocanoes/xcreds/commit/de4acf06e2e7b18c232dd0dcd5ce55e8944d2e2a)\r\n*  fixed status icon issue; fixed lack of prompting on first launch [View](https://github.com/twocanoes/xcreds/commit/9aa2d77b366fe963aed1ec78c932c467d83f5b63)\r\n*  added default to create keychain [View](https://github.com/twocanoes/xcreds/commit/27be41527d7716df6fbcd9ed276f542b80e53682)\r\n*  added better loading at start [View](https://github.com/twocanoes/xcreds/commit/1223e399814d061d9962a75d6c037445cd9862f9)\r\n*  updated loading message [View](https://github.com/twocanoes/xcreds/commit/d8d1b96e3e2927eb110747155942c4f000c8872c)\r\n*  smother transitions and background image [View](https://github.com/twocanoes/xcreds/commit/6f6f2b9c7b24a3724440b77b52d86cfaeca3169d)\r\n*  fixed background image url [View](https://github.com/twocanoes/xcreds/commit/8164b122c71f76b0bea9a3237d386ffac9ec0d30)\r\n*  fixed overlay not showing [View](https://github.com/twocanoes/xcreds/commit/6cedc60bbaad9747209ae73521a0af480a8301a0)\r\n*  fixed regression with back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/ff3dee83940377a8544283d207e011f5854be8c3)\r\n*  add tweak to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/7aafd66a0d75a3ee09dc6a4cd1c7f211877fb15b)\r\n*  more tweaks to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/b2ef99f2db8056933eb2c047f28d6449059103dd)\r\n*  fixed minor issues with prefs [View](https://github.com/twocanoes/xcreds/commit/18bccee23ceb28e47bd25f7ed38433dea76e787b)\r\n*  reverted default [View](https://github.com/twocanoes/xcreds/commit/5fe505fa6c90b1ae198bc1d5aeac6068e0e9ecdc)\r\n*  project update [View](https://github.com/twocanoes/xcreds/commit/4ea4da0da0260d9d9379ea599689d1c5ed1515b5)\r\n\r\n\r\n## prebeta (2022-06-15)\r\n\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/7289a72ae79005797fa4651dc61328354aca7c2b)\r\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/07947e9e66f68db049481b6e35373a8a5b5a4bf5)\r\n*  added support for Google IdP [View](https://github.com/twocanoes/xcreds/commit/4733a6cdeef503db2e08a21bb9443700bfb9526d)\r\n\r\n\r\n\r\n---\r\n\r\n## 4.0.6177 (31/12/2023)\r\n# What's New in Beta 3\r\n\r\nFeature complete for release 4.0. \r\n## 4.0.6177 (2023-12-28)\r\n\r\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\r\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552). Test by resetting password on both AD and Cloud.\r\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017). Test with visual verfication.\r\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8). Test by expiring password in AD and verifying sane UI.\r\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7). Test: Log in with AD account and change local password. Log out. When prompted to reset password, click button to reset keychain and enter local admin and verify keychain is reset and local password is AD password.\r\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd). Test: In AD, force a password change on next login. Login and when prompted, click Cancel.\r\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14). Test: Create non admin local user then log in for first time with local AD user. Should prompt to enter login credentials for a local account. Enter credentials and verify that macOS logs in with that user account. Log out and verify that it does not prompt on subsequent logins.\r\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20). Test: Reboot and verify you can type without a first click on the textfield. Do this on a non-vm since vm requires window focus. \r\n*  https://github.com/twocanoes/xcreds/issues/54 [View] (https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\r\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f). Test: look at menu item and verify it shows when password expires in AD. verify in AD as well.\r\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3). To test: refresh and verify next password check time is updated.\r\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90). No test\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee) No test\r\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f) No test\r\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a). To test: Use the xcreds_example_okta_ropg.mobileconfig testfile that has the shouldUseROPGForOIDCLogin key set to true. Verify that you can log in with test Okta user account.\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf). No test\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)  No test\r\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)  No test\r\n*  ropg at login window initial implementation [View] (https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)  No test\r\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)  No test\r\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2) Test: verify refresh button only shows on web login screens\r\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300). Test: select Refresh in menu app and verify you can log in with both the AD, ROPG and OIDC.\r\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b) No Test.\r\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad). Change password in cloud and launch userspace app. verify it prompts and you can log in and the icon turns green.\r\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976) Test: click cancel when AD prompts to sync local password.\r\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb). Test: verify having a override script does not cause crash when specified in profile and refresh selected in menu item app.\r\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41) No Test.\r\n\r\n\r\n---\r\n\r\n## XCreds 4.0 Beta 2 (12/12/2023)\r\n# What's New #\r\n\r\nThe major version was bumped to v4. Prior beta (Beta 1) was labeled as 3.3 and should be consider v4 Beta 1. So much goodness could not be contained in a minor version bump and only a major version increase would suffice.\r\n\r\n## Beta 2 ##\r\n### fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 ###\r\nMinimum Height and Width is now 150. Anything less than that will change it to 150. \r\n\r\nWhat to test: Set to lower and higher values and verify it changes as expected.\r\n\t\r\n### implemented Prompt for Secure Token Admin Login When Required #123 ###\r\nWhen logging in at the cloud login window and the local password is not the same as the cloud password, the user is prompted to enter in the local password. If the user does not know the password and there is no adminUsername/admin password defined in an override script or in preferences, the user will be prompted for admin credentials. If admin credentials are given correctly, the user account will be change to the new password and a new keychain will be created (and the old one moved aside).\r\n\r\nWhat to test: Successfully log in as a cloud user and verify all is working. Log out and change cloud password on IdP. Log in again and verify that clicking reset results in correct behavior. Verify cancel buttons work as expected and that bad passwords and username give correct feedback.\r\n\t\r\n### implemented feature request: localad/kebereros support for saving groups to prefs #125 ###\r\nWhen set up to use active directory, logging in as a AD user that is a member of groups will populate the local account with a new attribute called _xcreds_groups and will have the name of the groups as a command separated list. \r\n\r\nwhat to test: In active directory, add user to a few groups. Not that the primary group is not a direct membership (\"Domain User\") and will not show up. Log in and verify new attribute is populated in user account by opening Directory Utility and viewing the account. Change group membership in AD, log out and log back in, and verify AD groups have been updated via Directory Utility.\r\n\t\r\n### fixed ad groups for making admin user ###\r\nIf the preference key \"CreateAdminIfGroupMember\" and value of an array of strings is defined, the groups the user is part of in AD will be checked against those values, and if one matches, the user will be an admin. This is updated on each login, so adding and removing should change admin membership/\r\n\r\nWhat to test: Log in as a AD user and verify that they are not an admin. Add the user to a group in AD and add that group name to the CreateAdminIfGroupMember preference. Log back in and verify the user is now admin. Repeat test with a new user and make sure the user is an admin at first login.\r\n\t\r\n\t\r\n### fixed Active Directory issue after password change #112 ###\r\nWhen signing in using XCreds as an Active Directory user, if the AD user password is changed and then the user tries to sign again, XCreds sign-in will fail if the new password is entered. XCreds sign-in will succeed if the old password is entered.\r\n\r\nWhat to test: change password and verify correct bahavior.\r\n\r\n### adding arbitrary claims to local DS user account ###\r\nA new preference key \"claimsToAddToLocalUserAccount\" with an array of strings as values was added. Adding in a claim will result in that claim be added to the user's local DS account on next login. By default, if this key is not defined, the groups claim will be added automatically. \r\n\r\nwhat to test: In preferences, add the claims \"ipaddr\" and \"upn\" to the claims and login as a user. Verify that the claims show up as _xcreds_<claimname> and the value in Directory Utility for the user.\r\n\t\r\n### updated animation when logging in ###\r\nWhen logging in both as AD and cloud, the button bar should animate by dropping down and the main window should gracefully fade away leaving no trace. A thing of beauty.\r\n\r\nwhat to test: Look at it. Love it.\r\n\t\r\n### Detect when no password was entered #17 ###\r\nWhen no password is detected from the cloud login, it used to fail by returning to the login window. Now there is an error message.\r\n\r\nwhat to test: set the passwordElementID to something that doesn't match the element (like xyzzy) and try and log in. XCreds should log in to the cloud login and not be able to capture the password. An error should then be shown.\r\n\r\n### updated license agreement (issue #90) ###\r\nThe software license agreement shown when running the installer for v3.1 build 5084 shows last updated date as April 18, 2023. This should be updated to match the SLA provided at https://twocanoes.com/software-license-agreements/\r\n\r\nwhat to test: verify correct date.\r\n\t\r\n### refactored code to add admin to user account based on group membership each login (issue #109) ###\r\nin prior version, admin membership was only checked at initial account login. admin membership is now check at each login and the admin group is updated based on preferences.\r\n\r\nwhat to test: set the CreateAdminIfGroupMember value to the name of an existing to a group they are a membrer of in the iDp and verify they become admin at next login. Remove and verify that they are removed as local admin.\r\n\t\r\n### added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) ###\r\nWhen set up to use OIDC, logging in as a cloud user that is a member of groups will populate the local account with a new attribute called _xcreds_groups and will have the name of the groups as a space separated list. \r\n\r\nwhat to test: In OIDC, add user to a few groups. . Log in and verify new attribute is populated in user account by opening Directory Utility and viewing the account. Change group membership in ODIC, log out and log back in, and verify groups have been updated via Directory Utility.\r\n\t\r\n### fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow ###\r\nThe manifest defines the default for shouldAllowKeyComboForMacLoginWindow as false but when it is not set in a profile the login window allows the key combo to work.\r\n\r\nwhat to test: don't define key and verify it doesn't work, then define and verify it does\r\n\r\n## Beta 1: ##\r\n\r\n[![IMAGE ALT TEXT](http://img.youtube.com/vi/HldRxRRNQEU/0.jpg)](http://www.youtube.com/watch?v=HldRxRRNQEU \"Video Title\")\r\n\r\n### Select Existing User Account During Account Creation ###\r\n\r\nUsing the new preference key “shouldPromptForMigration”, when a new login is detected and there are existing standard user accounts on the system, the user will be prompted for a username and password (#98).\r\n\r\nIf the username and password are successfully entered for an existing account, this local account will then be used when logging in with this cloud account. The local account has 2 new DS attributes added:\r\n\r\ndsAttrTypeNative:_xcreds_oidc_sub: Subscriber. Unique identifier for account within the current issuer. \r\n\r\ndsAttrTypeNative:_xcreds_oidc_iss: Issuer\r\nIn subsequent logins, the user account is selected by matching the sub and iss from the identity token to the values in the local account.\r\n\r\nNote that the user will only be prompted if there are existing standard accounts on the system and the login does not have a locally mapped account.\r\n\r\nThe dialog for migration has a “Create New Account” button that will allow them to skip migration and create a local account. If a local account using the prior logic exists, it will be mapped.\r\n\r\n### Key Combination for showing Standard and Mac login window ###\r\n\r\nSetting the new preference key “shouldAllowKeyComboForMacLoginWindow” allows switch login between cloud and standard/Mac login using a key combination regardless of the hidden state of the Switch Login Window button (#121). The keys are as follows:\r\n\r\nOption-Control-Return: Switch between cloud and standard login window.\r\nCommand-Option-Control-Return: Switch between cloud and Mac login window.\r\n\r\n### Account Alias ###\r\n\r\nWhen a new preference is set (“aliasName”) to a claim in the identity token, the value in that claim is used to set an alias to the user account, allowing them to login with it.\r\n\r\nAn example: Set the preferences to have aliasName = “upn”. Log in as barney@twocanoes.com. The identity token has a claim called “upn” whose value was “barney@twocanoes.com“. XCreds then adds barney@twocanoes.com that is an alias and the user can login with either barney or barney@twocanoes.com at the local and mac login window. This gives the user a consistent way to log in at the cloud login or the standard / Mac login window.\r\n\r\n### New Features ###\r\n* Removed logging messages that had a local path from the build system.\r\n* Updates postinstall to better handle the setup assistant and userland install scenarios. Thanks to Clkw0rk for the pull request.\r\n* Reload login window on network changes. Thanks to Clkw0rk for the pull request and credit to @hurricanehrndz and the CPE Team at Yelp\r\n* Reload login window after wifi connected. Thanks to Clkw0rk for the pull request.\r\n* add encoding for special characters to tokenmanager. Thanks to Clkw0rk for the pull request.\r\n* use default desktop from CoreServices. Thanks to Clkw0rk and the CPE Team at Yelp for the pull request.\r\n\r\n\r\n---\r\n\r\n## XCreds 3.2.1 (12/12/2023)\r\nXCreds 3.2 results an issue where the last character was not capture when typing the password very quickly and hitting return right away.\r\n---\r\n\r\n## XCreds 3.3 Beta 1 (27/11/2023)\r\n[![IMAGE ALT TEXT](http://img.youtube.com/vi/HldRxRRNQEU/0.jpg)](http://www.youtube.com/watch?v=HldRxRRNQEU \"Video Title\")\r\n\r\n\r\n\r\n### Select Existing User Account During Account Creation ###\r\n\r\nUsing the new preference key “shouldPromptForMigration”, when a new login is detected and there are existing standard user accounts on the system, the user will be prompted for a username and password (#98).\r\n\r\nIf the username and password are successfully entered for an existing account, this local account will then be used when logging in with this cloud account. The local account has 2 new DS attributes added:\r\n\r\ndsAttrTypeNative:_xcreds_oidc_sub: Subscriber. Unique identifier for account within the current issuer. \r\n\r\ndsAttrTypeNative:_xcreds_oidc_iss: Issuer\r\nIn subsequent logins, the user account is selected by matching the sub and iss from the identity token to the values in the local account.\r\n\r\nNote that the user will only be prompted if there are existing standard accounts on the system and the login does not have a locally mapped account.\r\n\r\nThe dialog for migration has a “Create New Account” button that will allow them to skip migration and create a local account. If a local account using the prior logic exists, it will be mapped.\r\n\r\n### Key Combination for showing Standard and Mac login window ###\r\n\r\nSetting the new preference key “shouldAllowKeyComboForMacLoginWindow” allows switch login between cloud and standard/Mac login using a key combination regardless of the hidden state of the Switch Login Window button (#121). The keys are as follows:\r\n\r\nOption-Control-Return: Switch between cloud and standard login window.\r\nCommand-Option-Control-Return: Switch between cloud and Mac login window.\r\n\r\n### Account Alias ###\r\n\r\nWhen a new preference is set (“aliasName”) to a claim in the identity token, the value in that claim is used to set an alias to the user account, allowing them to login with it.\r\n\r\nAn example: Set the preferences to have aliasName = “upn”. Log in as barney@twocanoes.com. The identity token has a claim called “upn” whose value was “barney@twocanoes.com“. XCreds then adds barney@twocanoes.com that is an alias and the user can login with either barney or barney@twocanoes.com at the local and mac login window. This gives the user a consistent way to log in at the cloud login or the standard / Mac login window.\r\n\r\n### New Features ###\r\n* Removed logging messages that had a local path from the build system.\r\n* Updates postinstall to better handle the setup assistant and userland install scenarios. Thanks to Clkw0rk for the pull request.\r\n* Reload login window on network changes. Thanks to Clkw0rk for the pull request and credit to @hurricanehrndz and the CPE Team at Yelp\r\n* Reload login window after wifi connected. Thanks to Clkw0rk for the pull request.\r\n* add encoding for special characters to tokenmanager. Thanks to Clkw0rk for the pull request.\r\n* use default desktop from CoreServices. Thanks to Clkw0rk and the CPE Team at Yelp for the pull request.\r\n\r\n\r\n---\r\n\r\n## XCreds 3.2 (17/10/2023)\r\nROPG\r\nXCreds now uses ROPG to verify password when logged in. Very useful with Okta and other IdP that do not support token refresh. Requires preferences ropgClientID, ropgClientSecret, and shouldVerifyPasswordWithRopg. Thanks to hurricanehrndz for this pull request.\r\n\r\nNew Features\r\nNew preference key to force local login: shouldPreferLocalLoginInsteadOfCloudLogin . Thanks to jamesez for the pull request.\r\nNew preference key show login window based on detecting network status: shouldDetectNetworkToDetermineLoginWindow.\r\nAdded self healing for auth rights\r\nAdded support for keyboard nav for controls\r\nDetect offline and automatically switch to local login.\r\n\r\nBug Fixes\r\nRemove trailing and leading spaces entered in username\r\n---\r\n\r\n## XCreds 3.1 (17/07/2023)\r\n## XCreds 3.1 ##\r\n\r\n### Active Directory Login ###\r\nNew username and password window allows logging in with local user or Active Directory (if ADDomain key is defined).\r\n\r\n### New Username and Password Window ###\r\nWe no longer use the macOS login window and use the new XCreds username/password window. This allows for faster switching and Active Directory login.\r\n\r\n### Switch to Login Window at Screen Saver ###\r\nWhen the \"shouldSwitchToLoginWindowWhenLocked\" key is set and XCreds is running in the user session and the screen is locked, the lock screen will fast user switch to the login window.\r\n\r\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will log in with the XCreds Login Window to resume the session.\r\n\r\n### Admin Group ###\r\n\r\nIf group membership is returned in the \"groups\" claim and matches the group defined in the \"CreateAdminIfGroupMember\" preference, the user will be created as admin.\r\n\r\n### kerberos ticket ###\r\nWhen app is first launched and there is a keychain item with an AD account and local password, a kerberos ticket will be attempted.\r\n\r\n### Override Preference Script ###\r\n\r\nMost preferences can now be overwritten by specifying a script at the path defined by \"settingsOverrideScriptPath\". This script, if it exists, owned by \\_securityagent, and has permissions 700 (accessible only by \\_securityagent) must return a valid plist that defines the key/value pairs to override in preferences. This allows for basing preferences based on the local state of the machine. It is important for the \"localAdminUserName\" and \"localAdminPassword\" keys.  See Reset Keychain for more information on this. The override script can also be used for querying the local state and setting preferences. For example, to randomly set the background image, a sample script \"settingsOverrideScriptPath\" defines a script:\r\n\r\n\r\n    #!/bin/sh\r\n    dir=\"/System/Library/Desktop Pictures\"\r\n    desktoppicture=`/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n        \r\n    cat /usr/local/xcreds/override.plist|sed \"s|DESKTOPPICTUREPATH|${desktoppicture}|g\" \r\n    \r\nThe plist would be defined as:\r\n\r\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\r\n    <plist version=\"1.0\">\r\n    <dict>\r\n        <key>loginWindowBackgroundImageURL</key>\r\n        <string>file://DESKTOPPICTUREPATH</string>\r\n    </dict>\r\n    </plist>\r\n\r\n\r\n### Reset Keychain ##\r\nIn prior versions of XCreds, the ability to reset the keychain if the user forgets their local password would fail due to the lack of an admin user with a secure token. This would cause the \"PasswordOverwriteSilent\" to fail. \r\n\r\nThe \"settingsOverrideScriptPath\" (see above) can return the admin username and password of an admin account that has a secure token. This admin user is then used to reset the user's keychain if they forgot their local password. This can either be done with user prompting or silently.\r\n\r\nThe script can find those keys via curl, in system keychain, or in a LAPS file and return the values inside the plist that is returned. This gives flexibility in determining the security required for the local admin username and password.\r\n\r\nNote that XCreds assumes an admin user with a secure token already exists on the machine and XCreds does not create or manage this user. If you manage local admin via a LAPS system, you can return the password from the local password file.\r\n\r\nAn example of an override script to return username and password are as follows:\r\n\r\nOverride Script:\r\n\r\n   ` #!/bin/sh`\r\n`    dir=\"/System/Library/Desktop Pictures\"`\r\n`    desktoppicture=/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n`    `\r\n`    #this is provided as an example. DO NOT KEEP ADMIN CREDENTIALS ON DISK! Use curl or other method for getting them temporarily.`\r\n`    admin_username=\"tcadmin\"`\r\n`    admin_password=\"twocanoes\"`\r\n`    `\r\n`    cat /usr/local/xcreds/override.plist | sed \"s|LOCALADMINUSERNAME|${admin_username}|g\" | sed \"s|LOCALADMINPASSWORD|${admin_password}|g\" `\r\n\r\nplist:\r\n\r\n    `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`\r\n`    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">`\r\n`    <plist version=\"1.0\">`\r\n`    <dict>`\r\n`        <key>localAdminUserName</key>`\r\n`        <string>LOCALADMINUSERNAME</string>`\r\n`        <key>localAdminPassword</key>`\r\n`        <string>LOCALADMINPASSWORD</string>`\r\n`    </dict>`\r\n`    </plist>`\r\n\r\n\r\n### Others\r\n* added shake to password field\r\n* added dialog over login window when in an error state\r\n* improved code when local password policy does not allow setting password from cloud.\r\n* Added about menu with history\r\n\r\n## New Keys\r\n\r\n**ADDomain**\r\n\r\nThe desired AD domain\r\n\r\n**usernamePlaceholder**\r\n\r\nPlaceholder text in local / AD login window for username\r\n\r\n**passwordPlaceholder**\r\n\r\nPlaceholder text in local / AD login window for password\r\n\r\n**shouldShowLocalOnlyCheckbox**\r\n\r\nShow the local only checkbox on the local login page\r\n\r\n**CreateAdminIfGroupMember**\r\n\r\nList of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.\r\n\r\n**shouldSwitchToLoginWindowWhenLocked**\r\n\r\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\r\n\r\n**settingsOverrideScriptPath**\r\n\r\nScript to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by root and only writable by root.\r\n\r\n**localAdminUserName**\r\n\r\nUsername of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to set up a secure token for newly created users.\r\n\r\n**localAdminPassword**\r\n\r\nPassword of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to set up a secure token for newly created users.\r\n\r\n**shouldShowCloudLoginByDefault**\r\n\r\nDetermine if the Mac login window or the cloud login window is shown by default\r\n\r\n**shouldShowMacLoginButton**\r\n\r\nShow the Mac Login Window button in XCreds Login\r\n\r\n**shouldShowTokenUpdateStatus**\r\nShow the time when the password will be checked. True by default.\r\n\r\n---\r\n\r\n## Prerelease 3.1.4144 (08/06/2023)\r\n# What's New In XCreds #\r\n\r\n## XCreds 3.1 ##\r\n\r\n### Active Directory Login ###\r\nNew username and password window allows logging in with local user or Active Directory (if ADDomain key is defined).\r\n\r\n### New Username and Password Window ###\r\nWe no longer use the macOS login window and use the new XCreds username/password window. This allows for faster switching and Active Directory login.\r\n\r\n### Switch to Login Window at Screen Saver ###\r\nWhen the \"shouldSwitchToLoginWindowWhenLocked\" key is set and XCreds is running in the user session and the screen is locked, the lock screen will fast user switch to the log \r\n\r\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\r\n\r\n### Admin Group ###\r\n\r\nIf group membership is returned in the \"groups\" claim and matches the group defined in the \"CreateAdminIfGroupMember\" preference, the user will be created as admin.\r\n\r\n### kerberos ticket ###\r\nWhen app is first launched and their is a keychain item with a AD account and local password, a kerberos ticket will be attempted.\r\n\r\n### Override Preference Script ###\r\n\r\nMost preferences can now be overwritten by specifying a script at the path defined by \"settingsOverrideScriptPath\". This script, if it exists, owned by root, and has permissions 755 (writable only by root, readable and executable by all) must return a valid plist that defines the key/value pairs to override in preferences. This allows for basing preferences based on the local state of the machine. It is important for the \"localAdminUserName\" and \"localAdminPassword\" keys.  See Reset Keychain for more information on this. The overide script can also be used for querying the local state and setting preferences. For example, to randomly set the background image, a sample script \"settingsOverrideScriptPath\" defines a script:\r\n\r\n\r\n    !/bin/sh\r\n    dir=\"/System/Library/Desktop Pictures\"\r\n    desktoppicture=`/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n        \r\n    cat /usr/local/xcreds/override.plist|sed \"s|DESKTOPPICTUREPATH|${desktoppicture}|g\" \r\n    \r\nThe plist would defined as:\r\n\r\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\r\n    <plist version=\"1.0\">\r\n    <dict>\r\n        <key>loginWindowBackgroundImageURL</key>\r\n        <string>file://DESKTOPPICTUREPATH</string>\r\n    </dict>\r\n    </plist>\r\n\r\n\r\n### Reset Keychain ##\r\nIn prior versions of XCreds, the ability to reset the keychain if the user forgets their local password would fail due to the lack of a admin user with a secure token. This would cause the \"PasswordOverwriteSilent\" to fail. \r\n\r\nThe \"settingsOverrideScriptPath\" (see above) can return the admin username and password of an admin account that has a secure token. This admin user is then used to reset the user's keychain if they forgot their local password. This can either be done with user prompting or silently.\r\n\r\nThe script can find those keys via curl, in system keychain, or in a LAPS file and return the values inside the plist that is returned. This gives flexablity in determining the security required for the local admin username and password.\r\n\r\nNote that XCreds assumes an admin user with a secure token already exists on the machine and XCreds does not create or manage this user. If you manage local admin via a LAPS system, you can return the password from the local password file.\r\n\r\nAn example of an override script to return username and password are as follows:\r\n\r\nOverride Script:\r\n\r\n   ` !/bin/sh`\r\n`    dir=\"/System/Library/Desktop Pictures\"`\r\n`    desktoppicture=/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n`    `\r\n`    #this is provided as an example. DO NOT KEEP ADMIN CREDENTIALS ON DISK! Use curl or other method for getting them temporarily.`\r\n`    admin_username=\"tcadmin\"`\r\n`    admin_password=\"twocanoes\"`\r\n`    `\r\n`    cat /usr/local/xcreds/override.plist | sed \"s|LOCALADMINUSERNAME|${admin_username}|g\" | sed \"s|LOCALADMINPASSWORD|${admin_password}|g\" `\r\n\r\nplist:\r\n\r\n    `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`\r\n`    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">`\r\n`    <plist version=\"1.0\">`\r\n`    <dict>`\r\n`        <key>localAdminUserName</key>`\r\n`        <string>LOCALADMINUSERNAME</string>`\r\n`        <key>localAdminPassword</key>`\r\n`        <string>LOCALADMINPASSWORD</string>`\r\n`    </dict>`\r\n`    </plist>`\r\n\r\n\r\n### Others\r\n* added shake to password field\r\n\r\n## New Keys\r\n\r\n**ADDomain**\r\n\r\nThe desired AD domain\r\n\r\n**CreateAdminIfGroupMember**\r\n\r\nList of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.\r\n\r\n**shouldSwitchToLoginWindowWhenLocked**\r\n\r\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\r\n\r\n**settingsOverrideScriptPath**\r\n\r\nScript to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by root and only writable by root.\r\n\r\n**localAdminUserName**\r\n\r\nUsername of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\r\n\r\n**localAdminPassword**\r\n\r\nPassword of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\r\n\r\n**shouldFindPasswordElement**\r\n\r\nSelects the password element field in the web page by finding a form element that has bullets (input is password)\r\n\r\n**shouldShowCloudLoginByDefault**\r\n\r\nDetermine if the mac login window or the cloud login window is shown by default\r\n\r\n**shouldShowMacLoginButton**\r\n\r\nShow the Mac Login Window button in XCreds Login\r\n\r\n\r\n## Version 3.0 Build 3607 ##\r\n\r\nReleased 2023-04-19\r\n\r\n- Updated license\r\n- Fixed typo\r\n- Fixed issue with crash if time is too far off\r\n- Fixed regression for password change not capturing new password on Azure\r\n- Added trial license\r\n- Version 2.4\r\n- Added 802.1x support; added support for pref key for finding password based on type=password\r\n- Fixed changing wifi not dismissing dialog\r\n- Fixed issue with autorefresh\r\n- Added frontmost when prompting for keychain password\r\n- Fixed crashing issue due to null refreshview outlet\r\n- Fixed names and links in manifest\r\n- Tweaked text for user space refresh token window and added pref to show or hide\r\n- Updated sample config\r\n- Fixed focus issue\r\n- Fixed login window size and background image\r\n- Added in login window height/width min value of 100\r\n- Added key for customizing return to XCreds; added preference and ability to automatically refresh login window\r\n- Updated language on keychain option and added pref in manifest\r\n- Added remove keychain option\r\n\r\n## Version 2.3\r\n- Added more logging for id token\r\n- Removed progress screen overlay because it was hiding filevault\r\n- Added sub as local user account if other methods not available; added some additional logging\r\n- Removed test time\r\n- Fixed edge case when not showing xcreds login when logging out\r\n- Fixed shouldShowCloudLoginByDefault not working\r\n- Fixed timer issue\r\n- Removed show prefs menu\r\n- Implemented PasswordOverwriteSilent\r\n- Implemented KeychainReset\r\n- Added credit to script\r\n- Added startup script\r\n- Username hint was not being set\r\n- Renamed mapped prefs with a prefix\r\n- Changed case of keys\r\n- Made keys lowercase for mappings\r\n- Added new key for OIDC mapping\r\n\r\n## Version 2.2\r\n- Added mappings for user info\r\n\r\n## Version 2.1\r\n- Initial release\r\n\r\n---\r\n\r\n## Prerelease 3.1.4081 (27/05/2023)\r\n## XCreds 3.1 ##\r\n\r\n### Active Directory Login ###\r\nNew username and password window allows logging in with local user or Active Directory (if ADDomain key is defined).\r\n\r\n### New Username and Password Window ###\r\nWe no longer use the macOS login window and use the new XCreds username/password window. This allows for faster switching and Active Directory login.\r\n\r\n### Admin Group ###\r\n\r\nIf group membership is returned in the \"groups\" claim and matches the group defined in the \"CreateAdminIfGroupMember\" preference, the user will be created as admin.\r\n\r\n### Override Preference Script ###\r\n\r\nMost preferences can now be overwritten by specifying a script at the path defined by \"settingsOverrideScriptPath\". This script, if it exists, owned by root, and has permissions 755 (writable only by root, readable and executable by all) must return a valid plist that defines the key/value pairs to override in preferences. This allows for basing preferences based on the local state of the machine. It is important for the \"localAdminUserName\" and \"localAdminPassword\" keys.  See Reset Keychain for more information on this. The overide script can also be used for querying the local state and setting preferences. For example, to randomly set the background image, a sample script \"settingsOverrideScriptPath\" defines a script:\r\n\r\n\r\n    !/bin/sh\r\n    dir=\"/System/Library/Desktop Pictures\"\r\n    desktoppicture=`/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n        \r\n    cat /usr/local/xcreds/override.plist|sed \"s|DESKTOPPICTUREPATH|${desktoppicture}|g\" \r\n    \r\nThe plist would defined as:\r\n\r\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\r\n    <plist version=\"1.0\">\r\n    <dict>\r\n        <key>loginWindowBackgroundImageURL</key>\r\n        <string>file://DESKTOPPICTUREPATH</string>\r\n    </dict>\r\n    </plist>\r\n\r\n\r\n### Reset Keychain ##\r\nIn prior versions of XCreds, the ability to reset the keychain if the user forgets their local password would fail due to the lack of a admin user with a secure token. This would cause the \"PasswordOverwriteSilent\" to fail. \r\n\r\nThe \"settingsOverrideScriptPath\" (see above) can return the admin username and password of an admin account that has a secure token. This admin user is then used to reset the user's keychain if they forgot their local password. This can either be done with user prompting or silently.\r\n\r\nThe script can find those keys via curl, in system keychain, or in a LAPS file and return the values inside the plist that is returned. This gives flexablity in determining the security required for the local admin username and password.\r\n\r\nNote that XCreds assumes an admin user with a secure token already exists on the machine and XCreds does not create or manage this user. If you manage local admin via a LAPS system, you can return the password from the local password file.\r\n\r\nAn example of an override script to return username and password are as follows:\r\n\r\nOverride Script:\r\n\r\n   ` !/bin/sh`\r\n`    dir=\"/System/Library/Desktop Pictures\"`\r\n`    desktoppicture=/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\r\n`    `\r\n`    #this is provided as an example. DO NOT KEEP ADMIN CREDENTIALS ON DISK! Use curl or other method for getting them temporarily.`\r\n`    admin_username=\"tcadmin\"`\r\n`    admin_password=\"twocanoes\"`\r\n`    `\r\n`    cat /usr/local/xcreds/override.plist | sed \"s|LOCALADMINUSERNAME|${admin_username}|g\" | sed \"s|LOCALADMINPASSWORD|${admin_password}|g\" `\r\n\r\nplist:\r\n\r\n    `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`\r\n`    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">`\r\n`    <plist version=\"1.0\">`\r\n`    <dict>`\r\n`        <key>localAdminUserName</key>`\r\n`        <string>LOCALADMINUSERNAME</string>`\r\n`        <key>localAdminPassword</key>`\r\n`        <string>LOCALADMINPASSWORD</string>`\r\n`    </dict>`\r\n`    </plist>`\r\n\r\n\r\n## New Keys\r\n\r\n**ADDomain**\r\n\r\nThe desired AD domain\r\n\r\n**CreateAdminIfGroupMember**\r\n\r\nList of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.\r\n\r\n**shouldSwitchToLoginWindowWhenLocked**\r\n\r\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\r\n\r\n**settingsOverrideScriptPath**\r\n\r\nScript to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by root and only writable by root.\r\n\r\n**localAdminUserName**\r\n\r\nUsername of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\r\n\r\n**localAdminPassword**\r\n\r\nPassword of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\r\n\r\n**shouldFindPasswordElement**\r\n\r\nSelects the password element field in the web page by finding a form element that has bullets (input is password)\r\n\r\n**shouldShowCloudLoginByDefault**\r\n\r\nDetermine if the mac login window or the cloud login window is shown by default\r\n\r\n**shouldShowMacLoginButton**\r\n\r\nShow the Mac Login Window button in XCreds Login\r\n\r\n<table class=\"xcreds-docs\">\r\n  <tr>\r\n    <th>Name</th>\r\n    <th>Type</th>\r\n    <th>Required</th>\r\n    <th>Description</th>\r\n  </tr>\r\n  <tr id=\"ADDomain\">\r\n    <td>ADDomain</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>The desired AD domain</td>\r\n  </tr><tr id=\"clientID\">\r\n    <td>clientID</td>\r\n    <td>string</td>\r\n    <td>always</td>\r\n    <td>The OIDC client id public identifier for the app.</td>\r\n  </tr><tr id=\"clientSecret\">\r\n    <td>clientSecret</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Client Secret sometimes required by identity provider.</td>\r\n  </tr><tr id=\"CreateAdminUser\">\r\n    <td>CreateAdminUser</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>When set to true and the user account is created, the user will be a local admin.</td>\r\n  </tr><tr id=\"CreateAdminIfGroupMember\">\r\n    <td>CreateAdminIfGroupMember</td>\r\n    <td>array</td>\r\n    <td></td>\r\n    <td>List of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.</td>\r\n  </tr><tr id=\"shouldSwitchToLoginWindowWhenLocked\">\r\n    <td>shouldSwitchToLoginWindowWhenLocked</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>When set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.</td>\r\n  </tr><tr id=\"discoveryURL\">\r\n    <td>discoveryURL</td>\r\n    <td>string</td>\r\n    <td>always</td>\r\n    <td>The discovery URL provided by your OIDC / Cloud provider.</td>\r\n  </tr><tr id=\"EnableFDE\">\r\n    <td>EnableFDE</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Enabled FDE enabled at first login on APFS disks.</td>\r\n  </tr><tr id=\"EnableFDERecoveryKey\">\r\n    <td>EnableFDERecoveryKey</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Save the Personal Recovery Key (PRK) to disk for the MDM Escrow Service to collect.</td>\r\n  </tr><tr id=\"EnableFDERecoveryKeyPath\">\r\n    <td>EnableFDERecoveryKeyPath</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Specify a custom path for the recovery key.</td>\r\n  </tr><tr id=\"EnableFDERekey\">\r\n    <td>EnableFDERekey</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Rotate the Personal Recovery Key (PRK).</td>\r\n  </tr><tr id=\"loginWindowWidth\">\r\n    <td>loginWindowWidth</td>\r\n    <td>integer</td>\r\n    <td></td>\r\n    <td>Login Window webview width (Integer). If this is not defined, it will be full width. Minimum value of 100.</td>\r\n  </tr><tr id=\"loginWindowHeight\">\r\n    <td>loginWindowHeight</td>\r\n    <td>integer</td>\r\n    <td></td>\r\n    <td>Login Window webview height (Integer). If this is not defined, it will be full height. Minimum value of 100.</td>\r\n  </tr><tr id=\"loginWindowBackgroundImageURL\">\r\n    <td>loginWindowBackgroundImageURL</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>URL to an image to show in the background while logging in.</td>\r\n  </tr><tr id=\"passwordChangeURL\">\r\n    <td>passwordChangeURL</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Add a menu item for changing the password that will open this URL when the menu item is selected.</td>\r\n  </tr><tr id=\"redirectURI\">\r\n    <td>redirectURI</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>URI to redirect to when authentication is complete.</td>\r\n  </tr><tr id=\"refreshRateHours\">\r\n    <td>refreshRateHours</td>\r\n    <td>integer</td>\r\n    <td></td>\r\n    <td>Number of hours for checking for password changes. Default is 3 hours. Minimum is 1 hour.</td>\r\n  </tr><tr id=\"scopes\">\r\n    <td>scopes</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>OIDC Scopes</td>\r\n  </tr><tr id=\"shouldSetGoogleAccessTypeToOffline\">\r\n    <td>shouldSetGoogleAccessTypeToOffline</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>When using Google IdP, a refresh token may need be requested in a non-standard way.</td>\r\n  </tr><tr id=\"shouldShowCloudLoginByDefault\">\r\n    <td>shouldShowCloudLoginByDefault</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Determine if the mac login window or the cloud login window is shown by default</td>\r\n  </tr><tr id=\"autoRefreshLoginTimer\">\r\n    <td>autoRefreshLoginTimer</td>\r\n    <td>integer</td>\r\n    <td></td>\r\n    <td>Timer for automatically refreshing login screen in seconds. If set to 0, does not automatically refresh.</td>\r\n  </tr><tr id=\"cloudLoginText\">\r\n    <td>cloudLoginText</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Text for return to cloud login on Mac login screen</td>\r\n  </tr><tr id=\"shouldShowAboutMenu\">\r\n    <td>shouldShowAboutMenu</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show the About Menu</td>\r\n  </tr><tr id=\"shouldShowRefreshBanner\">\r\n    <td>shouldShowRefreshBanner</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show text at the top of the prompt window when tokens expire.</td>\r\n  </tr><tr id=\"shouldShowConfigureWifiButton\">\r\n    <td>shouldShowConfigureWifiButton</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show Configure WiFi button in XCreds Login.</td>\r\n  </tr><tr id=\"shouldShowPreferencesOnStart\">\r\n    <td>shouldShowPreferencesOnStart</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>If no settings are specified, preferences will not be shown on startup.</td>\r\n  </tr><tr id=\"shouldShowMacLoginButton\">\r\n    <td>shouldShowMacLoginButton</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show the Mac Login Window button in XCreds Login.</td>\r\n  </tr><tr id=\"shouldShowSupportStatus\">\r\n    <td>shouldShowSupportStatus</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show message in XCreds Login reminding people to buy support.</td>\r\n  </tr><tr id=\"shouldShowQuitMenu\">\r\n    <td>shouldShowQuitMenu</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show Quit Menu Item in the menu.</td>\r\n  </tr><tr id=\"shouldShowVersionInfo\">\r\n    <td>shouldShowVersionInfo</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show the version number and build number in the lower left corner of XCreds Login.</td>\r\n  </tr><tr id=\"showDebug\">\r\n    <td>showDebug</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show debug local notifications.</td>\r\n  </tr><tr id=\"username\">\r\n    <td>username</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>When a user uses cloud login, XCreds will try and figure out the local username based on the email or other data returned for the IdP. Use this value to force the local username for any cloud login. Provide only the shortname.</td>\r\n  </tr><tr id=\"KeychainReset\">\r\n    <td>KeychainReset</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Reset the keychain without prompting if the login password doesn't match the local password.</td>\r\n  </tr><tr id=\"PasswordOverwriteSilent\">\r\n    <td>PasswordOverwriteSilent</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Update the password silently to the new one. Used with the KeychainReset if the user has a secure token.</td>\r\n  </tr><tr id=\"localAdminUserName\">\r\n    <td>localAdminUserName</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Username of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.</td>\r\n  </tr><tr id=\"localAdminPassword\">\r\n    <td>localAdminPassword</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Password of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.</td>\r\n  </tr><tr id=\"verifyPassword\">\r\n    <td>verifyPassword</td>\r\n    <td>boolean</td>\r\n    <td></td>\r\n    <td>Show prompt to verify cloud password before setting keychain and login.</td>\r\n  </tr><tr id=\"idpHostName\">\r\n    <td>idpHostName</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>hostname of the page that has the password field.</td>\r\n  </tr><tr id=\"idpHostNames\">\r\n    <td>idpHostNames</td>\r\n    <td>array</td>\r\n    <td></td>\r\n    <td>array of hostnames of the page that has the password field.</td>\r\n  </tr><tr id=\"passwordElementID\">\r\n    <td>passwordElementID</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>password element id of the html element that has the password.</td>\r\n  </tr><tr id=\"map_firstname\">\r\n    <td>map_firstname</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Local DS to OIDC Mapping for First Name</td>\r\n  </tr><tr id=\"map_lastname\">\r\n    <td>map_lastname</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Local DS to OIDC Mapping for Last Name</td>\r\n  </tr><tr id=\"map_fullname\">\r\n    <td>map_fullname</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Local DS to OIDC Mapping for Name</td>\r\n  </tr><tr id=\"map_username\">\r\n    <td>map_username</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Local DS to OIDC Mapping for Name</td>\r\n  </tr><tr id=\"settingsOverrideScriptPath\">\r\n    <td>settingsOverrideScriptPath</td>\r\n    <td>string</td>\r\n    <td></td>\r\n    <td>Script to override defaults. Must return valid property list with specified defaults. Script must exist at path ,be owned by root and only writable by root.</td>\r\n  </tr>\r\n</table>\r\n\r\n\r\n---\r\n\r\n## XCreds 3.0 (08/05/2023)\r\nVersion 3.0 Build 3607\r\nReleased 2023-04-19\r\n\r\nUpdated license\r\nFixed typo\r\nFixed issue with crash if time is too far off\r\nFixed regression for password change not capturing new password on Azure\r\nAdded trial license\r\n\r\n---\r\n\r\n## XCreds 2.4 (13/04/2023)\r\n- fixed changing wifi not dismissing dialog\r\n- fixed issue with autorefresh\r\n- added frontmost when prompting for keychain password\r\n- fixed crashing issue due to null refreshview outlet\r\n- fixed names and links in manifest\r\n- tweaked text for user space refresh token window and added pref to show or hide\r\n- updated sample configu\r\n- fixed focus issue\r\n- fixed login window size and background image\r\n- added in login window height/width min value of 100\r\n- added key for customizing return to xcreds; added preference and ability to automatically refresh login window\r\n- updated language on keychain option and added pref in manifest\r\n- added remove keychain option\r\n- added more logging for id token and bumped version to 2.3\r\n- remove progress screen overlay because it was hiding filevault\r\n- added sub as local user account if other methods not available; added some additional logging\r\n- removed test time\r\n- fixed edge case when not showing xcreds login when logging out\r\n- fixed shouldShowCloudLoginByDefault not working\r\n- fixed timer issue\r\n- removed show prefs menu\r\n- implemented PasswordOverwriteSilent\r\n- implemented KeychainReset\r\n- added credit to script\r\n- added startup script\r\n- username hint was not being set\r\n- renamed mapped prefs with a prefix\r\n- changed case of keys\r\n- made keys lowercase for mappings\r\n- added new key for OIDC mapping\r\n\r\n\r\n---\r\n\r\n## XCreds 2.2 (11/01/2023)\r\n- (origin/develop, develop) remove progress screen overlay because it was hiding filevault\r\n- added sub as local user account if other methods not available; added some additional logging\r\n- removed test time\r\n- fixed edge case when not showing xcreds login when logging out\r\n- fixed shouldShowCloudLoginByDefault not working\r\n- fixed timer issue\r\n- removed show prefs menu\r\n- implemented PasswordOverwriteSilent\r\n- implemented KeychainReset\r\n- added credit to script\r\n- added startup script\r\n- username hint was not being set\r\n- renamed mapped prefs with a prefix\r\n- changed case of keys\r\n- made keys lowercase for mappings\r\n- added new key for OIDC mapping\r\n- (origin/feature-mappings, feature-mappings) added mappings for user info\r\n- Update README.md\r\n- (origin/release-2.1) removed spaces\r\n- removed registration reminder\r\n- added idhostnames array so you can specify multiple tenants\r\n- added shouldShowCloudLoginByDefault user default\r\n- fixed notification prompt\r\n- removed \"prompt\":\"consent\"\r\n- added a bit more logging\r\n- added okta compatibility\r\n- added autologin when fv enabled\r\n- Merge pull request #37 from kenchan0130/fix-issue-36\r\n- Merge pull request #38 from kenchan0130/patch-azure-1\r\n- Merge pull request #39 from kenchan0130/patch-2\r\n- If fullname is empty, shortname is used.\r\n- Support a Azure AD host\r\n- enabled rekeying FileVault implementation\r\n- Update README.md\r\n- fixed package template issue and updated manifest\r\n- changed pref names for custom IDP / ADFS\r\n- \r\n---\r\n\r\n## XCreds 2.0 (31/08/2022)\r\nLogin Window log in to OIDC provider\r\nSupport for Azure, Google Cloud, Okta and any OIDC provider\r\nInitial account provisioning\r\nWiFi Login Window configuration\r\nRestart and shutdown from Login Window\r\nProfile manifest available for easy configuration\r\nLocal password update with IdP password\r\nPrompt for IdP password when changed\r\nLogin Keychain password updating\r\nCustomizable preferences\r\nEasy deployment\r\nUses OpenID Connect\r\nAttractive and pleasing menu icon\r\nEasy configuration with profile / MDM\r\n[Profile Manifest](https://github.com/ProfileCreator/ProfileManifests) for [Profile Creator](https://github.com/ProfileCreator/ProfileCreator) Support\r\nTwo-Factor and Multi-Factor support\r\n---\r\n\r\n## prebeta (15/06/2022)\r\nprebeta\r\n---\r\n\r\n## Initial Release v1.0.0 (13/06/2022)\r\nInitial Release\r\n"
  },
  {
    "path": "Cartfile",
    "content": "#binary \"https://bitbucket.org/twocanoes/productlicense-public/downloads/productlicense.json\"\n#github \"PaddleHQ/Mac-Framework-V4\"\ngit \"git@bitbucket.org:twocanoes/productlicense.git\" \"nopaddle\"\n"
  },
  {
    "path": "Cartfile.resolved",
    "content": "git \"git@bitbucket.org:twocanoes/productlicense.git\" \"3c172c1211d98ff39aab8cf73fe2c2e94ae8a8bc\"\n"
  },
  {
    "path": "DNSResolver.m",
    "content": "//\n//  DNSResolver.m\n//  NoMAD\n//\n//  Created by Boushy, Phillip on 9/28/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n#import \"DNSResolver.h\"\n\n#include <dns_util.h>\n#include <net/if.h>\n\n@interface DNSResolver ()\n\n@property (nonatomic, assign, readwrite) BOOL\t\t\t\tfinished;\n@property (nonatomic, copy,   readwrite) NSError\t\t\t*error;\n\n// Private Properties\n@property (nonatomic, strong, readonly) NSMutableArray\t\t*mutableQueryResponse;\n\n@end\n\n@implementation DNSResolver {\n    DNSServiceRef _dnsService;\n    CFSocketRef _dnsSocket;\n}\n\n@synthesize queryType = _queryType;\n@synthesize queryValue = _queryValue;\n\n@synthesize delegate = _delegate;\n\n\n- init {\n    self = [super init];\n    if (self != nil) {\n        self->_mutableQueryResponse = [[NSMutableArray alloc] init];\n    }\n    return self;\n}\n\n- initWithQueryType:(NSString*)queryType andValue:(NSString*)queryValue {\n    assert(queryType != nil);\n    assert(queryValue != nil);\n    self = [super init];\n    if (self != nil) {\n        self->_queryType = [queryType copy];\n        self->_queryValue = [queryValue copy];\n        self->_mutableQueryResponse = [[NSMutableArray alloc] init];\n        assert(self->_mutableQueryResponse != nil);\n    }\n    return self;\n}\n/*\n -(void)dealloc {\n\t[self stop];\n }\n */\n\n-(void)startQuery {\n    if (self->_dnsService == NULL) {\n        self.error = nil;\n        self.finished = NO;\n        [_mutableQueryResponse removeAllObjects];\n        [self startInternal];\n    }\n}\n\n-(uint16_t)getTypeAsInt {\n    uint16_t recordType;\n    if ([self.queryType isEqualToString:@\"SRV\"]) {\n        recordType = kDNSServiceType_SRV;\n    } else if ([self.queryType isEqualToString:@\"PTR\"]) {\n        recordType = kDNSServiceType_PTR;\n    } else {\n        recordType = kDNSServiceType_ANY;\n    }\n    return recordType;\n}\n\n-(void)startInternal {\n    DNSServiceErrorType\terr;\n    const char *\t\tdnsNameCStr;\n    int\t\t\t\t\tsocketProtocol;\n    int                 flags;\n\n    // version (always 0), info (self because it's easy to reference?), retain, release, copyDescription\n    CFSocketContext\t\tcontext = { 0, (__bridge void *) self, NULL, NULL, NULL };\n    CFRunLoopSourceRef\trunLoopSource;\n\n    // Start off with no errors.\n    err = kDNSServiceErr_NoError;\n\n    //Create a C string of the queryValue and verifies it is not empty.\n    dnsNameCStr = [self.queryValue UTF8String];\n    if (dnsNameCStr == nil) {\n        err = kDNSServiceErr_BadParam;\n    }\n    // Create a query for the type and value\n    if (err == kDNSServiceErr_NoError) {\n        // perform different types of query based on queryType...\n        uint16_t recordType = [self getTypeAsInt];\n\n        //uint32_t interfaceIndex = if_nametoindex(\"utun1\");\n\n        // check for .local\n\n        if ( [self.queryValue hasSuffix:@\".local\"]) {\n            flags = (kDNSServiceFlagsReturnIntermediates + kDNSServiceFlagsTimeout);\n        } else {\n            flags = kDNSServiceFlagsReturnIntermediates;\n        }\n\n        // Create the DNS Query and reference it in self->_dnsService\n        err = DNSServiceQueryRecord(\n                                    &self->_dnsService,\n                                    flags,\n                                    0, // query on all interfaces.\n                                    dnsNameCStr,\n                                    recordType,\n                                    kDNSServiceClass_IN,\n                                    DNSServiceRecordCallback,\n                                    (__bridge void*) self\n                                    );\n    }\n    // Create a socket that listens for incoming messages related to the DNS Query.\n    if (err == kDNSServiceErr_NoError) {\n        socketProtocol = DNSServiceRefSockFD(self->_dnsService);\n        self->_dnsSocket = CFSocketCreateWithNative(\n                                                    NULL,\n                                                    socketProtocol,\n                                                    kCFSocketReadCallBack,\n                                                    DNSSocketCallback,\n                                                    &context\n                                                    );\n        // Tell the socket to close on invalidation on top of any other flags it already has set.\n        // This is good and the default.\n        CFSocketSetSocketFlags(\n                               self->_dnsSocket,\n                               CFSocketGetSocketFlags(self->_dnsSocket) & ~ (CFOptionFlags) kCFSocketCloseOnInvalidate\n                               );\n\n        runLoopSource = CFSocketCreateRunLoopSource(NULL, self->_dnsSocket, 0);\n        assert(runLoopSource != NULL);\n\n        CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopDefaultMode);\n\n        CFRelease(runLoopSource);\n\n    }\n    if (err != kDNSServiceErr_NoError) {\n        [self stopQueryWithDNSServiceError:err];\n    }\n\n}\n\nstatic void DNSServiceRecordCallback(\n                                     DNSServiceRef       dnsService,\n                                     DNSServiceFlags     flags,\n                                     uint32_t            interfaceIndex,\n                                     DNSServiceErrorType errorCode,\n                                     const char *        fullname,\n                                     uint16_t            recordType,\n                                     uint16_t            recordClass,\n                                     uint16_t            recordLength,\n                                     const void *        recordData,\n                                     uint32_t            ttl,\n                                     void *              context\n                                     ) {\n\n    DNSResolver *\t\tobj;\n    obj = (__bridge DNSResolver *)context;\n\n    if (errorCode == kDNSServiceErr_NoError) {\n        // Get Interface Name\n        //char *interfaceNamePtr = alloca(IF_NAMESIZE);\n        //char *interfaceName = if_indextoname(interfaceIndex, interfaceNamePtr);\n        //NSLog(@\"Interface Index is: %u. Interface Name is: %s\", interfaceIndex, interfaceName);\n\n        //Process Record\n        [obj processRecord:recordData length:recordLength];\n\n\n        if ( ! (flags & kDNSServiceFlagsMoreComing) ) {\n            [obj stopQueryWithError:nil];\n        }\n    } else {\n        [obj stopQueryWithDNSServiceError:errorCode];\n    }\n}\n\nstatic void DNSSocketCallback(\n                              CFSocketRef             dnsSocket,\n                              CFSocketCallBackType    type,\n                              CFDataRef               address,\n                              const void *            data,\n                              void *                  info\n                              ) {\n\n    DNSServiceErrorType\terr;\n    DNSResolver *\t\t\tobj;\n    obj = (__bridge DNSResolver *)info;\n\n    err = DNSServiceProcessResult(obj->_dnsService);\n    if ( err != kDNSServiceErr_NoError) {\n        [obj stopQueryWithDNSServiceError:err];\n    }\n}\n\n-(void)processRecord:(const void *)recordData length:(NSUInteger)recordLength {\n    NSMutableData *         resourceRecordData;\n    dns_resource_record_t *\tresourceRecord;\n    uint8_t\t\t\t\t\tu8;\n    uint16_t                u16;\n    uint32_t                u32;\n\n    //Creating the data to send to dns_parse_resource_record.\n    resourceRecordData = [NSMutableData data];\n\n    u8 = 0;\n    [resourceRecordData appendBytes:&u8 length:sizeof(u8)];\n    // DNS Type\n    uint16_t recordType = [self getTypeAsInt];\n    u16 = htons(recordType);\n    [resourceRecordData appendBytes:&u16 length:sizeof(u16)];\n    // DNS Class\n    u16 = htons(kDNSServiceClass_IN);\n    [resourceRecordData appendBytes:&u16 length:sizeof(u16)];\n    // TTL\n    u32 = htonl(666);\n    [resourceRecordData appendBytes:&u32 length:sizeof(u32)];\n    // Record Length\n    u16 = htons(recordLength);\n    [resourceRecordData appendBytes:&u16 length:sizeof(u16)];\n    [resourceRecordData appendBytes:recordData length:recordLength];\n\n    //Parse the record\n    resourceRecord = dns_parse_resource_record([resourceRecordData bytes], (uint32_t) [resourceRecordData length]);\n\n    if (resourceRecord != NULL) {\n\n        if ([self.queryType isEqualToString:@\"SRV\"]) {\n            NSString *\ttarget = [NSString stringWithCString:resourceRecord->data.SRV->target encoding:NSASCIIStringEncoding];\n            if (target != nil) {\n                NSDictionary *  result;\n                NSIndexSet *    resultIndexSet;\n\n                result = [NSDictionary dictionaryWithObjectsAndKeys:\n                          [NSNumber numberWithUnsignedInt:resourceRecord->data.SRV->priority], kSRVResolverPriority,\n                          [NSNumber numberWithUnsignedInt:resourceRecord->data.SRV->weight],   kSRVResolverWeight,\n                          [NSNumber numberWithUnsignedInt:resourceRecord->data.SRV->port],     kSRVResolverPort,\n                          target,                                                  kSRVResolverTarget,\n                          nil\n                          ];\n                assert(result != nil);\n                \n                resultIndexSet = [NSIndexSet indexSetWithIndex:self.queryResults.count];\n                assert(resultIndexSet != nil);\n                \n                [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:resultIndexSet forKey:@\"results\"];\n                [self.mutableQueryResponse addObject:result];\n                [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:resultIndexSet forKey:@\"results\"];\n                \n                if ( (self.delegate != nil) && [self.delegate respondsToSelector:@selector(dnsResolver:didReceiveQueryResult:)] ) {\n                    [self.delegate dnsResolver:self didReceiveQueryResult:result];\n                }\n            }\n            \n        }\n        \n        dns_free_resource_record(resourceRecord);\n    }\n    \n}\n\n\n# pragma mark - Stop Query Methods\n-(void)stopQuery {\n    if (self->_dnsSocket != NULL) {\n        CFSocketInvalidate(self->_dnsSocket);\n        CFRelease(self->_dnsSocket);\n        self->_dnsSocket = NULL;\n    }\n    if (self->_dnsService != NULL) {\n        DNSServiceRefDeallocate(self->_dnsService);\n        self->_dnsService = NULL;\n    }\n    self.finished = YES;\n}\n\n-(void)stopQueryWithError:(NSError *)error {\n    self.error = error;\n    [self stopQuery];\n    if ( (self.delegate != nil) && [self.delegate respondsToSelector:@selector(dnsResolver:didStopQueryWithError:)] ) {\n        [self.delegate dnsResolver:self didStopQueryWithError:error];\n    }\n}\n\n- (void)stopQueryWithDNSServiceError:(DNSServiceErrorType)errorCode\n{\n    NSError *   error;\n    \n    error = nil;\n    if (errorCode != kDNSServiceErr_NoError) {\n        error = [NSError errorWithDomain:kDNSResolverErrorDomain code:errorCode userInfo:nil];\n    }\n    [self stopQueryWithError:error];\n}\n\n# pragma mark - Results\n- (NSArray *)queryResults {\n    return [self.mutableQueryResponse copy];\n}\n\n@end\n\nNSString * kSRVResolverPriority = @\"priority\";\nNSString * kSRVResolverWeight   = @\"weight\";\nNSString * kSRVResolverPort     = @\"port\";\nNSString * kSRVResolverTarget   = @\"target\";\n\nNSString * kDNSResolverErrorDomain = @\"kDNSResolverErrorDomain\";\n"
  },
  {
    "path": "DefaultsOverride.swift",
    "content": "//\n//  DefaultsOverride.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 5/21/23.\n//\n\nimport Cocoa\n\npublic class DefaultsOverride: UserDefaults {\n\n    static let standardOverride = DefaultsOverride()\n\n    private override init?(suiteName suitename: String?) {\n        TCSLogWithMark()\n        super.init(suiteName: suitename)\n        self.refreshCachedPrefs()\n    }\n    private convenience init() {\n        TCSLogWithMark()\n        self.init(suiteName: nil)!\n    }\n    var cachedPrefs=Dictionary<String, Any>()\n    @objc func refreshCachedPrefs()  {\n        TCSLogWithMark()\n        cachedPrefs=Dictionary()\n        let prefScriptPath = UserDefaults.standard.string(forKey: PrefKeys.settingsOverrideScriptPath.rawValue)\n        guard let prefScriptPath = prefScriptPath else {\n            TCSLogWithMark(\"no override defined\")\n            return\n        }\n        TCSLogErrorWithMark(\"Pref script defined at \\(prefScriptPath)\")\n        if FileManager.default.fileExists(atPath:prefScriptPath)==false{\n            TCSLogErrorWithMark(\"Pref script defined but does not exist\")\n            return\n        }\n        do {\n            let attributes = try FileManager.default.attributesOfItem(atPath: prefScriptPath)\n\n            if FileManager.default.isExecutableFile(atPath: prefScriptPath) == false {\n                TCSLogErrorWithMark(\"override script is not executable\")\n\n                return\n            }\n            guard let ownerID=attributes[.ownerAccountID] as? NSNumber else {\n                TCSLogErrorWithMark(\"Could not get owner id\")\n                return\n            }\n            guard let permission = attributes[.posixPermissions] as? NSNumber else\n\n            {\n                TCSLogErrorWithMark(\"Could not get permission\")\n                return\n\n            }\n            if ownerID.uintValue != 92 {\n                TCSLogErrorWithMark(\"override script is not owned by _securityagent. not running: \\(ownerID.debugDescription)\")\n                return\n            }\n\n            let unixPermissions = permission.int16Value\n\n            if unixPermissions & 0x3f != 0 {\n                TCSLogErrorWithMark(\"override script cannot be accessible by anyone besides _securityagent. not running: \\(unixPermissions)\")\n                return\n\n            }\n            \n            let scriptRes=cliTask(prefScriptPath)\n\n                if scriptRes.count==0{\n                    TCSLogErrorWithMark(\"script did not return anything\")\n                    return\n                }\n            TCSLogWithMark()\n            guard let rawData = scriptRes.data(using: .utf8) else {\n                TCSLogErrorWithMark(\"could not convert raw data\");\n                return\n            }\n            var format: PropertyListSerialization.PropertyListFormat = .xml\n\n            TCSLogWithMark()\n\n            do {\n                TCSLogWithMark()\n\n                /*\n                 guard  let propertyListObject = try PropertyListSerialization.propertyList(from: rawData, options: [], format: &format)  else {\n                     TCSLogErrorWithMark(\"could not turn to plist\")\n                     return\n                 }\n\n\n                 */\n                let propertyListObject = try PropertyListSerialization.propertyList(from: rawData, options: [], format: &format)\n\n                if let propertyListObject = propertyListObject as? [String: Any] {\n                    cachedPrefs=propertyListObject\n\n                }\n                else {\n                    TCSLogWithMark(\"Could not convert to plist\")\n                }\n            } catch {\n                TCSLogErrorWithMark(\"Error converting script to property list: \\(scriptRes)\")\n                return\n            }\n            TCSLogWithMark()\n\n        }\n        \n        catch {\n            \n            TCSLogErrorWithMark(error.localizedDescription)\n        }\n    }\n    override public func string(forKey defaultName: String) -> String? {\n\n        if let defaultName = cachedPrefs[defaultName] as? String{\n            return defaultName\n        }\n        return UserDefaults.standard.string(forKey: defaultName)\n    }\n    override public func object(forKey defaultName: String) -> Any? {\n\n        if let defaultName = cachedPrefs[defaultName]{\n            return defaultName\n        }\n\n        return UserDefaults.standard.object(forKey: defaultName)\n    }\n\n    override public func array(forKey defaultName: String) -> [Any]? {\n        TCSLogWithMark()\n\n        if let defaultName = cachedPrefs[defaultName] as? [Any]{\n            return defaultName\n        }\n\n        return UserDefaults.standard.array(forKey: defaultName)\n    }\n    override public func data(forKey defaultName: String) -> Data? {\n        TCSLogWithMark()\n\n        if let defaultName = cachedPrefs[defaultName] as? Data {\n            return defaultName\n        }\n\n        return UserDefaults.standard.data(forKey: defaultName)\n    }\n    override public func integer(forKey defaultName: String) -> Int {\n        if let defaultName = cachedPrefs[defaultName] as? Int {\n            return defaultName\n        }\n\n        return UserDefaults.standard.integer(forKey: defaultName)\n    }\n    override public func float(forKey defaultName: String) -> Float {\n        TCSLogWithMark()\n\n        if let defaultName = cachedPrefs[defaultName] as? Float {\n            return defaultName\n        }\n\n        return UserDefaults.standard.float(forKey: defaultName)\n    }\n    override public func double(forKey defaultName: String) -> Double {\n\n        if let defaultName = cachedPrefs[defaultName] as? Double {\n            return defaultName\n        }\n\n        return UserDefaults.standard.double(forKey: defaultName)\n    }\n    override public func bool(forKey defaultName: String) -> Bool {\n\n        if let defaultName = cachedPrefs[defaultName] as? Bool {\n            TCSLogWithMark(\"override value \\(defaultName)\")\n\n            return defaultName\n        }\n\n        return UserDefaults.standard.bool(forKey: defaultName)\n    }\n    override public func url(forKey defaultName: String) -> URL? {\n        TCSLogWithMark()\n\n        if let defaultName = cachedPrefs[defaultName] as? URL {\n            return defaultName\n        }\n\n        return UserDefaults.standard.url(forKey: defaultName)\n    }\n\n\n\n}\n"
  },
  {
    "path": "Extensions.swift",
    "content": "//\n//  Extensions.swift\n//  NoMAD\n//\n//  Created by Boushy, Phillip on 10/4/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n\n// bitwise convenience\nprefix operator ~~\n\nprefix func ~~(value: Int) -> Bool {\n    return (value > 0) ? true : false\n}\n\nextension UserDefaults {\n    func sint(forKey defaultName: String) -> Int? {\n        \n        let defaults = UserDefaults.standard\n        let item = defaults.object(forKey: defaultName)\n        \n        if item == nil {\n            return nil\n        }\n        \n        // test to see if it's an Int\n        \n        if let result = item as? Int {\n            return result\n        } else {\n            // it's a String!\n            \n            return Int(item as! String)\n        }\n    }\n}\n\nextension String {\n    func safeURLPath() -> String? {\n        let allowedCharacters = CharacterSet(bitmapRepresentation: CharacterSet.urlPathAllowed.bitmapRepresentation)\n        return addingPercentEncoding(withAllowedCharacters: allowedCharacters)\n    }\n\n    func trim() -> String {\n        return self.trimmingCharacters(in: CharacterSet.whitespaces)\n    }\n    \n    func containsIgnoringCase(_ find: String) -> Bool {\n        return self.range(of: find, options: NSString.CompareOptions.caseInsensitive) != nil\n    }\n    \n    /*\n     \n     // TODO: move this to UserInfo\n    \n    func variableSwap() -> String {\n        \n        var cleanString = self\n        \n        let domain = defaults.string(forKey: Preferences.aDDomain) ?? \"\"\n        let fullName = defaults.string(forKey: Preferences.displayName)?.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? \"\"\n        let serial = getSerial().addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? \"\"\n        let shortName = defaults.string(forKey: Preferences.userShortName) ?? \"\"\n        let upn = defaults.string(forKey: Preferences.userUPN) ?? \"\"\n        let email = defaults.string(forKey: Preferences.userEmail) ?? \"\"\n        \n        cleanString = cleanString.replacingOccurrences(of: \"<<domain>>\", with: domain)\n        cleanString = cleanString.replacingOccurrences(of: \"<<fullname>>\", with: fullName)\n        cleanString = cleanString.replacingOccurrences(of: \"<<serial>>\", with: serial)\n        cleanString = cleanString.replacingOccurrences(of: \"<<shortname>>\", with: shortName)\n        cleanString = cleanString.replacingOccurrences(of: \"<<upn>>\", with: upn)\n        cleanString = cleanString.replacingOccurrences(of: \"<<email>>\", with: email)\n        \n        return cleanString //.addingPercentEncoding(withAllowedCharacters: .alphanumerics)\n        \n    }\n */\n    \n}\n"
  },
  {
    "path": "FileVaultLogin/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  FileVaultLogin\n//\n//  Created by Timothy Perfitt on 10/8/25.\n//\n\nimport Cocoa\nimport os.log\nimport ServiceManagement\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    @IBOutlet var window: NSWindow!\n    let helperToolManager = HelperToolManager()\n\n\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        UserDefaults.standard.addSuite(named: \"com.twocanoes.xcreds\")\n\n        TCSLogWithMark()\n        switch  helperToolManager.manageHelperTool(action: .install) {\n            \n        case .notRegistered:\n            TCSLogWithMark()\n\n            NSAlert.showAlert(title: \"Error\", message:\"Service is not registered\")\n            return\n        case .enabled:\n            TCSLogWithMark()\n\n            break\n        case .requiresApproval:\n            TCSLogWithMark(\"Service requires approval. Please select Allow in the notification or open System Preferences->Login Items and allow the service\")\n\n            SMAppService.openSystemSettingsLoginItems()\n            return\n        case .notFound:\n            NSAlert.showAlert(title: \"Error\",message:\"Service Not Found\")\n            return\n        @unknown default:\n            NSAlert.showAlert(title: \"Error\",message:\"Unknown Error\")\n            return\n        }\n       \n        TCSLogWithMark()\n\n        let username = getConsoleUser()\n        let cred = KeychainUtil().findPassword(serviceName: \"xcreds local password\", accountName: \"xcreds local password\")\n        TCSLogWithMark()\n\n        guard let cred = cred else {\n            \n            TCSLogWithMark(\"no valid password found\")\n//            NSAlert.showAlert(title:\"Error\",message:\"No valid password found in keychain. If you have not logged out and logged in, please do so now.\")\n            NSApplication.shared.terminate(self)\n\n            return\n            \n        }\n        helperToolManager.runCommand(username:username, password:cred.password) { success in\n            if success==true{\n                TCSLogWithMark(\"runCommand success\")\n                NSApplication.shared.terminate(self)\n            }\n            else {\n                TCSLogWithMark()\n                NSAlert.showAlert(title:\"Error\",message:\"Cannot set filevault login\")\n                NSApplication.shared.terminate(self)\n            }\n        }\n        TCSLogWithMark()\n\n    }\n\n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n    }\n\n    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n        return true\n    }\n\n\n}\n\n"
  },
  {
    "path": "FileVaultLogin/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "FileVaultLogin/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "FileVaultLogin/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "FileVaultLogin/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"FileVaultLogin\" customModuleProvider=\"target\"/>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"FileVaultLogin\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"FileVaultLogin\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About FileVaultLogin\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide FileVaultLogin\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit FileVaultLogin\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                        <items>\n                            <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                <connections>\n                                    <action selector=\"newDocument:\" target=\"-1\" id=\"4Si-XN-c54\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                <connections>\n                                    <action selector=\"openDocument:\" target=\"-1\" id=\"bVn-NM-KNZ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                    <items>\n                                        <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"clearRecentDocuments:\" target=\"-1\" id=\"Daa-9d-B3U\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                            <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                <connections>\n                                    <action selector=\"performClose:\" target=\"-1\" id=\"HmO-Ls-i7Q\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                <connections>\n                                    <action selector=\"saveDocument:\" target=\"-1\" id=\"teZ-XB-qJY\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                <connections>\n                                    <action selector=\"saveDocumentAs:\" target=\"-1\" id=\"mDf-zr-I0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                <connections>\n                                    <action selector=\"revertDocumentToSaved:\" target=\"-1\" id=\"iJ3-Pv-kwq\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                            <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"runPageLayout:\" target=\"-1\" id=\"Din-rz-gC5\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                <connections>\n                                    <action selector=\"print:\" target=\"-1\" id=\"qaZ-4w-aoO\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                        <items>\n                            <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                    <items>\n                                        <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                            <connections>\n                                                <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                            <connections>\n                                                <action selector=\"underline:\" target=\"-1\" id=\"FYS-2b-JAY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                        <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                        <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardKerning:\" target=\"-1\" id=\"6dk-9l-Ckg\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffKerning:\" target=\"-1\" id=\"U8a-gz-Maa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"tightenKerning:\" target=\"-1\" id=\"hr7-Nz-8ro\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"loosenKerning:\" target=\"-1\" id=\"8i4-f9-FKE\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardLigatures:\" target=\"-1\" id=\"7uR-wd-Dx6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffLigatures:\" target=\"-1\" id=\"iX2-gA-Ilz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useAllLigatures:\" target=\"-1\" id=\"KcB-kA-TuK\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"unscript:\" target=\"-1\" id=\"0vZ-95-Ywn\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"superscript:\" target=\"-1\" id=\"3qV-fo-wpU\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"subscript:\" target=\"-1\" id=\"Q6W-4W-IGz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"raiseBaseline:\" target=\"-1\" id=\"4sk-31-7Q9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowerBaseline:\" target=\"-1\" id=\"OF1-bc-KW4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                        <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                            <connections>\n                                                <action selector=\"orderFrontColorPanel:\" target=\"-1\" id=\"mSX-Xz-DV3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                        <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyFont:\" target=\"-1\" id=\"GJO-xA-L4q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteFont:\" target=\"-1\" id=\"JfD-CL-leO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                    <items>\n                                        <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                            <connections>\n                                                <action selector=\"alignLeft:\" target=\"-1\" id=\"zUv-R1-uAa\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                            <connections>\n                                                <action selector=\"alignCenter:\" target=\"-1\" id=\"spX-mk-kcS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"alignJustified:\" target=\"-1\" id=\"ljL-7U-jND\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                            <connections>\n                                                <action selector=\"alignRight:\" target=\"-1\" id=\"r48-bG-YeY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                        <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                <items>\n                                                    <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"YGs-j5-SAR\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionNatural:\" target=\"-1\" id=\"qtV-5e-UBP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"Lbh-J2-qVU\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"-1\" id=\"S0X-9S-QSf\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"jFq-tB-4Kx\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"-1\" id=\"5fk-qB-AqJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                    <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"Nop-cj-93Q\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionNatural:\" target=\"-1\" id=\"lPI-Se-ZHp\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"BgM-ve-c93\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"-1\" id=\"caW-Bv-w94\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"RB4-Sm-HuC\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"-1\" id=\"EXD-6r-ZUu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                        <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleRuler:\" target=\"-1\" id=\"FOx-HJ-KwY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyRuler:\" target=\"-1\" id=\"71i-fW-3W2\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteRuler:\" target=\"-1\" id=\"cSh-wd-qM2\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleToolbarShown:\" target=\"-1\" id=\"BXY-wc-z0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"runToolbarCustomizationPalette:\" target=\"-1\" id=\"pQI-g3-MTW\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                            <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleSidebar:\" target=\"-1\" id=\"iwa-gc-5KM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                        <items>\n                            <menuItem title=\"FileVaultLogin Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                <connections>\n                                    <action selector=\"showHelp:\" target=\"-1\" id=\"y7X-2Q-9no\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"200\" y=\"121\"/>\n        </menu>\n    </objects>\n</document>\n"
  },
  {
    "path": "FileVaultLogin/FileVaultLogin.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "FilevaultLoginHelper/CodesignCheck.swift",
    "content": "//\n//  CodesignCheck.swift\n//\n//  Created by Erik Berglund on 2018-10-01.\n//  Copyright © 2018 Erik Berglund. All rights reserved.\n//\n\nimport Foundation\nimport Security\n\nlet kSecCSDefaultFlags = 0\n\nenum CodesignCheckError: Error {\n    case message(String)\n}\n\nstruct CodesignCheck {\n\n    // MARK: - Compare Functions\n\n    public static func codeSigningMatches(pid: pid_t) throws -> Bool {\n        return try self.codeSigningCertificatesForSelf() == self.codeSigningCertificates(forPID: pid)\n    }\n\n    // MARK: - Public Functions\n\n    public static func codeSigningCertificatesForSelf() throws -> [SecCertificate] {\n        guard let secStaticCode = try secStaticCodeSelf() else { return [] }\n        return try codeSigningCertificates(forStaticCode: secStaticCode)\n    }\n\n    public static func codeSigningCertificates(forPID pid: pid_t) throws -> [SecCertificate] {\n        guard let secStaticCode = try secStaticCode(forPID: pid) else { return [] }\n        return try codeSigningCertificates(forStaticCode: secStaticCode)\n    }\n\n    public static func codeSigningCertificates(forURL url: URL) throws -> [SecCertificate] {\n        guard let secStaticCode = try secStaticCode(forURL: url) else { return [] }\n        return try codeSigningCertificates(forStaticCode: secStaticCode)\n    }\n\n    // MARK: - Private Functions\n\n    private static func executeSecFunction(_ secFunction: () -> (OSStatus) ) throws {\n        let osStatus = secFunction()\n        guard osStatus == errSecSuccess else {\n            throw CodesignCheckError.message(String(describing: SecCopyErrorMessageString(osStatus, nil)))\n        }\n    }\n\n    private static func secStaticCodeSelf() throws -> SecStaticCode? {\n        var secCodeSelf: SecCode?\n        try executeSecFunction { SecCodeCopySelf(SecCSFlags(rawValue: 0), &secCodeSelf) }\n        guard let secCode = secCodeSelf else {\n            throw CodesignCheckError.message(\"SecCode returned empty from SecCodeCopySelf\")\n        }\n        return try secStaticCode(forSecCode: secCode)\n    }\n\n    private static func secStaticCode(forPID pid: pid_t) throws -> SecStaticCode? {\n        var secCodePID: SecCode?\n        try executeSecFunction { SecCodeCopyGuestWithAttributes(nil, [kSecGuestAttributePid: pid] as CFDictionary, [], &secCodePID) }\n        guard let secCode = secCodePID else {\n            throw CodesignCheckError.message(\"SecCode returned empty from SecCodeCopyGuestWithAttributes\")\n        }\n        return try secStaticCode(forSecCode: secCode)\n    }\n\n    private static func secStaticCode(forURL url: URL) throws -> SecStaticCode? {\n        var secStaticCodePath: SecStaticCode?\n        try executeSecFunction { SecStaticCodeCreateWithPath(url as CFURL, [], &secStaticCodePath) }\n        guard let secStaticCode = secStaticCodePath else {\n            throw CodesignCheckError.message(\"SecStaticCode returned empty from SecStaticCodeCreateWithPath\")\n        }\n        return secStaticCode\n    }\n\n    private static func secStaticCode(forSecCode secCode: SecCode) throws -> SecStaticCode? {\n        var secStaticCodeCopy: SecStaticCode?\n        try executeSecFunction { SecCodeCopyStaticCode(secCode, [], &secStaticCodeCopy) }\n        guard let secStaticCode = secStaticCodeCopy else {\n            throw CodesignCheckError.message(\"SecStaticCode returned empty from SecCodeCopyStaticCode\")\n        }\n        return secStaticCode\n    }\n\n    private static func isValid(secStaticCode: SecStaticCode) throws {\n        try executeSecFunction { SecStaticCodeCheckValidity(secStaticCode, SecCSFlags(rawValue: kSecCSDoNotValidateResources | kSecCSCheckNestedCode), nil) }\n    }\n\n    private static func secCodeInfo(forStaticCode secStaticCode: SecStaticCode) throws -> [String: Any]? {\n        try isValid(secStaticCode: secStaticCode)\n        var secCodeInfoCFDict:  CFDictionary?\n        try executeSecFunction { SecCodeCopySigningInformation(secStaticCode, SecCSFlags(rawValue: kSecCSSigningInformation), &secCodeInfoCFDict) }\n        guard let secCodeInfo = secCodeInfoCFDict as? [String: Any] else {\n            throw CodesignCheckError.message(\"CFDictionary returned empty from SecCodeCopySigningInformation\")\n        }\n        return secCodeInfo\n    }\n\n    private static func codeSigningCertificates(forStaticCode secStaticCode: SecStaticCode) throws -> [SecCertificate] {\n        guard\n            let secCodeInfo = try secCodeInfo(forStaticCode: secStaticCode),\n            let secCertificates = secCodeInfo[kSecCodeInfoCertificates as String] as? [SecCertificate] else { return [] }\n        return secCertificates\n    }\n}\n\n"
  },
  {
    "path": "FilevaultLoginHelper/main.swift",
    "content": "//\n//  main.swift\n//  FilevaultLoginHelper\n//\n//  Created by Timothy Perfitt on 10/3/25.\n//\n\nimport Foundation\nimport os.log\n \nlet log = Logger(subsystem: \"com.twocanoes.xcreds\", category: \"daemon\")\n@objc(HelperToolProtocol)\npublic protocol HelperToolProtocol {\n    func authFV(username:String, password:String, withReply reply: @escaping (Bool) -> Void)\n    func authFVAsAdmin(withReply reply: @escaping (Bool) -> Void)\n\n}\n\n\n// XPC Communication setup\nclass HelperToolDelegate: NSObject, NSXPCListenerDelegate, HelperToolProtocol {\n    \n    func GetSecureTokenUserList() -> [String] {\n        let launchPath = \"/usr/bin/fdesetup\"\n        let args = [\n            \"list\"\n        ]\n        let secureTokenListRaw = cliTask(launchPath, arguments: args, waitForTermination: true)\n        let partialList = secureTokenListRaw.components(separatedBy: \"\\n\")\n        var secureTokenUsers = [String]()\n        for entry in partialList {\n            let username = entry.components(separatedBy: \",\")[0].trimmingCharacters(in: .whitespacesAndNewlines)\n            if username != \"\"{\n                secureTokenUsers.append(entry.components(separatedBy: \",\")[0])\n            }\n        }\n\n        return secureTokenUsers\n    }\n\n    \n    // Accept new XPC connections by setting up the exported interface and object.\n    func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {\n        // Validate that the main app and helper app have the same code signing identity, otherwise return\n        guard isValidClient(connection: newConnection) else {\n            print(\"Rejected connection from unauthorized client\")\n            return false\n        }\n\n        newConnection.exportedInterface = NSXPCInterface(with: HelperToolProtocol.self)\n        newConnection.exportedObject = self\n        newConnection.resume()\n        return true\n    }\n\n\n    // Execute the shell command and reply with output.\n    func authFV(username:String, password:String, withReply reply: @escaping (Bool) -> Void) {\n        \n        let stUsers = GetSecureTokenUserList()\n        \n        guard stUsers.contains(username) else {\n            TCSLogWithMark(\"user \\(username) is not a secure token user. Not enabling authenticated reboot.\")\n            reply(false)\n            return\n\n        }\n        if filevaultAuth(username: username, password: password) == true {\n            TCSLogWithMark(\"Successfully authenticated with FileVault using local admin.\")\n            reply(true)     \n        }\n        else {\n            TCSLogWithMark(\"Error running fdesetup.\")\n            reply(false)\n            \n        }\n    }\n\n    func authFVAsAdmin(withReply reply: @escaping (Bool) -> Void) {\n        do {\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            \n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n            \n            if let adminUser = try userManager.adminCredentials(), !adminUser.username.isEmpty, !adminUser.password.isEmpty {\n                authFV(username: adminUser.username, password: adminUser.password, withReply: reply)\n            }\n            else {\n                TCSLogWithMark(\"no valid admin credentials found to unlock FV\")\n                reply(false)\n            }\n        }\n        catch {\n            TCSLogWithMark(\"Error with secret keeper:\\(error)\")\n            reply(false)\n            \n        }\n        \n\n    }\n    // Check that the codesigning matches between the main app and the helper app\n    private func isValidClient(connection: NSXPCConnection) -> Bool {\n        do {\n            return try CodesignCheck.codeSigningMatches(pid: connection.processIdentifier)\n        } catch {\n            print(\"Helper code signing check failed with error: \\(error)\")\n            return false\n        }\n    }\n}\n\n// Set up and start the XPC listener.\nUserDefaults.standard.addSuite(named: \"com.twocanoes.xcreds\")\n\nlet delegate = HelperToolDelegate()\nlet listener = NSXPCListener(machServiceName: \"com.twocanoes.FileVaultLoginHelper\")\nlistener.delegate = delegate\nlistener.resume()\nRunLoop.main.run()\n\n\n"
  },
  {
    "path": "GoogleLDAP.swift",
    "content": "//\n//  GoogleLDAP.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 11/24/25.\n//\n\nimport Foundation\npublic class GoogleLDAP:NSObject {\n    \n    enum PasswordCheckResult {\n        case PasswordValid\n        case PasswordInvalid\n        case OtherError\n        \n    }\n    func verifyPasswordGoogleLDAP(username:String, password:String) -> PasswordCheckResult{\n   \n        var arguments: [String] = [String]()\n        arguments.append(\"-LLL\")\n        arguments.append(\"-H\"); arguments.append(\"ldaps://ldap.google.com\")\n        arguments.append(\"-y\"); arguments.append(\"/dev/stdin\")\n\n        arguments.append(\"-b\"); arguments.append(\"dc=\\(username)\")\n        arguments.append(\"-D\"); arguments.append(username)\n        arguments.append(username)\n        \n        let process = Process()\n        process.executableURL = URL(fileURLWithPath: \"/usr/bin/ldapsearch\")\n        process.arguments = arguments\n        let pipe = Pipe()\n        process.standardOutput = pipe\n        process.standardError = pipe\n        let stdInPipe = Pipe()\n        \n        process.standardInput=stdInPipe\n        do {\n            process.environment=[\"LDAPTLS_IDENTITY\":\"LDAP Client\"]\n            try process.run()\n            stdInPipe.fileHandleForWriting.write(Data(password.utf8))\n            try? stdInPipe.fileHandleForWriting.close()\n            process.waitUntilExit()\n        } catch {\n            TCSLogWithMark(\"Failed to run command: \\(error.localizedDescription)\")\n            return PasswordCheckResult.OtherError\n\n        }\n        let data = pipe.fileHandleForReading.readDataToEndOfFile()\n        let output = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? \"\"\n        TCSLogWithMark(output.isEmpty ? \"No output\" : output)\n        \n        switch process.terminationStatus {\n        case 0:\n            return PasswordCheckResult.PasswordValid\n        case 49:\n            return PasswordCheckResult.PasswordInvalid\n\n        default:\n            return PasswordCheckResult.OtherError\n\n        }\n        \n    }\n}\n\n"
  },
  {
    "path": "History.md",
    "content": "# What's New In XCreds #\n\n## XCreds 5.0 ##\n\n\nfixed HideExpiration in manifest\nallowLoginIfMemberOfGroup causes screen rendering issue after blocking sign in #233\nadded build file instructions\nupdated package ref\nadd missing files to repo\nallowLoginIfMemberOfGroup causes screen rendering issue after blocking sign in #233\nFail on map_username for AD #244\nIssue with HomeMountEnabled #236\nClarify manifest descriptions for AD property names #245\nXCreds Login Window Overlay Wallpaper not caching? #247\nUpdate manifest description for CreateAdminIfGroupMember #251\nUpdate login window when resolution changes #187\nadded missing files\nEnhancement request: Group Membership Zendesk Ticket 69193 #209\nmore\nLocal login window dims and gets stuck after failed login attempt #242\nupdated history\nExpected AD field values not shown in XCreds log #237\nupdated history\nkeyCodeForLoginWindowChange not working as expected #231\n\"Change Password\" menuitem is now greyed out #239\nAllow user to use full name to sign in at XCreds username/password screen #178\nFeature Request: HideExpiration key #198\nXCreds 5: Unexpected behavior of IP & MAC info via XCReds login window #232\nMenubar sign in does not follow shouldUseROPGForMenuLogin #184\nimproved login animation\nCustomize menu bar app icon #189\nUpdate description for allowLoginIfMemberOfGroup #228\nAdd LocalFallback to manifest #229\n\n---------\nEnhancement Request \"Mechanism to force xCreds to reevaluate Login Window Background Image\" #227 View\nAdd LocalFallback to manifest #229 View\nUpdate description for allowLoginIfMemberOfGroup #228 View\nCustomize menu bar app icon #189 View\nimproved login animation View\nMenubar sign in does not follow shouldUseROPGForMenuLogin #184 View\nXCreds 5: Unexpected behavior of IP & MAC info via XCReds login window #232 View\nFeature Request: HideExpiration key #198 View\nAllow user to use full name to sign in at XCreds username/password screen #178 View\n\"Change Password\" menuitem is now greyed out #239 View\nkeyCodeForLoginWindowChange not working as expected #231 View\nupdated history View\nExpected AD field values not shown in XCreds log #237\n-------\nkeyCodeForLoginWindowChange not working as expected #231\n\"Change Password\" menuitem is now greyed out #239\nAllow user to use full name to sign in at XCreds username/password screen #178\nFeature Request: HideExpiration key #198\nXCreds 5: Unexpected behavior of IP & MAC info via XCReds login window #232\nMenubar sign in does not follow shouldUseROPGForMenuLogin #184\nimproved login animation\nCustomize menu bar app icon #189\nUpdate description for allowLoginIfMemberOfGroup #228\nAdd LocalFallback to manifest #229\nEnhancement Request \"Mechanism to force xCreds to reevaluate Login Window Background Image\" #227\n-----\n[Feature Request] Add a Password Expire date or Days for OIDC users and more #165. To test, set map_password_expiry to a claim in Azure (like street address) with a value in seconds from token issue (like 300 seconds) and verify that menu shows the correct date\nCustom Mac login window key combo #206\nEnhancement request: Group Membership Zendesk Ticket 69193 #209\nSetting HomeMountEnabled to false removes the home folder from the XCreds menuitems #213\n\n----------\nMap UID #186\nMenubar refresh is delayed when setting shouldPromptForADPasswordChange #195\nFix formatting for systemInfoButtonTitle #221\nCorrections for manifest #224\nHang at login after password reset #223\n----------\nCustomize the XCReds app's native login dialog box #179\n[Feature Request] AD User Account Creation Name Mapping #172\n[Feature Request] AD - User friendly fail prompts #193\nAD attributes #166\nsystemInfoButtonTitle does not respond to plain text values #220\nClarify key name an description for shouldShowIfLocalOnlyUser #219\nchanged manifest version back one; added copying DS user attibutes to prefs. Enhancement Request: XCreds app cant update ds #212\n----------\n[Feature Request] Add option to customize the Refresh Banner text #176\nFeature Request: EnforceSignIn #199\nadded new preference to manage more buttons on login screen: shouldShowShutdownButton, shouldShowRestartButton, shouldShowSystemInfoButton. Feature Request - Add key to disable showing shutdown and/or restart on login overlay #203\nAllow override of killall loginwindow in xcreds postinstall script #181\nbumped version of manifest Update manifest pfm_last_modified and pfm_version #164\nfixed Fix manifest title for ROPG pref #183\nadded option for system info button title #154\nSystem Info on XCreds Login Window #154\nimplemented Feature Request - Change the wording of the password change pop-up #202\n\n## XCreds 4.1 ##\n\nCustomization of Menu\n\nAdding Menu Items\n\nCloud + Active Directory\n\nSMB Share Mounting\n\nAdmin Removal\n\n\n## XCreds 4.0 ##\n\nSelect Existing User Account During Account Creation\n\nAllow Admin to Reset User Password at Login\n\nKey Combination for Showing Standard and Mac Login Window\n\nAccount Alias\n\nSaving Groups to Account Attributes\n\nCreateAdminIfGroupMember Checked At Each Login\n\nAdd Arbitrary Claims to Local DS User Account\n\nRefactored Preferences for ROPG\n\nAllowed Users\n\nOther New Features and Fixes\n\n\n\n## XCreds 3.3 ##\n\n### Select Existing User Account During Account Creation ###\nUsing the new preference key “shouldPromptForMigration”, when a new login is detected and there are existing standard user accounts on the system, the user will be prompted for a username and password (#98).\n\nIf the username and password are successfully entered for an existing account, this local account will then be used when logging in with this cloud account. The local account has 2 new DS attributes added:\n\ndsAttrTypeNative:_xcreds_oidc_sub: Subscriber. Unique identifier for account within the current issuer. \n\ndsAttrTypeNative:_xcreds_oidc_iss: Issuer\nIn subsequent logins, the user account is selected by matching the sub and iss from the identity token to the values in the local account.\n\nNote that the user will only be prompted if there are existing standard accounts on the system and the login does not have a locally mapped account.\n\nThe dialog for migration has a “Create New Account” button that will allow them to skip migration and create a local account. If a local account using the prior logic exists, it will be mapped.\n\n### Key Combination for showing Standard and Mac login window ###\nSetting the new preference key “shouldAllowKeyComboForMacLoginWindow” allows switch login between cloud and standard/Mac login using a key combination regardless of the hidden state of the Switch Login Window button (#121). The keys are as follows:\n\nOption-Control-Return: Switch between cloud and standard login window.\nCommand-Option-Control-Return: Switch between cloud and Mac login window.\n\n### Account Alias ###\nWhen a new preference is set (“aliasName”) to a claim in the identity token, the value in that claim is used to set an alias to the user account, allowing them to login with it.\n\nAn example: Set the preferences to have aliasName = “upn”. Log in as barney@twocanoes.com. The identity token has a claim called “upn” whose value was “barney@twocanoes.com“. XCreds then adds barney@twocanoes.com that is an alias and the user can login with either barney or barney@twocanoes.com at the local and mac login window. This gives the user a consistent way to log in at the cloud login or the standard / Mac login window.\n\n### New Features ###\n* Removed logging messages that had a local path from the build system.\n* Updates postinstall to better handle the setup assistant and userland install scenarios. Thanks to Clkw0rk for the pull request.\n* Reload login window on network changes. Thanks to Clkw0rk for the pull request and credit to @hurricanehrndz and the CPE Team at Yelp\n* Reload login window after wifi connected. Thanks to Clkw0rk for the pull request.\n* add encoding for special characters to tokenmanager. Thanks to Clkw0rk for the pull request.\n* use default desktop from CoreServices. Thanks to Clkw0rk and the CPE Team at Yelp for the pull request.\n\n\n## XCreds 3.2 ##\n\n* Support for Okta ROPG\n* New preference key to force local login: shouldPreferLocalLoginInsteadOfCloudLogin\n* New preference key show login window based on detecting network status: shouldDetectNetworkToDetermineLoginWindow\n* Added self healing for auth rights\n* Added support for keyboard nav for controls\n* Detect offline and automatically switch to local login\n* Remove trailing and leading spaces entered in username\n\n\n## XCreds 3.1 ##\n\n### Active Directory Login ###\nNew username and password window allows logging in with local user or Active Directory (if ADDomain key is defined).\n\n### New Username and Password Window ###\nWe no longer use the macOS login window and use the new XCreds username/password window. This allows for faster switching and Active Directory login.\n\n### Switch to Login Window at Screen Saver ###\nWhen the \"shouldSwitchToLoginWindowWhenLocked\" key is set and XCreds is running in the user session and the screen is locked, the lock screen will fast user switch to the login window.\n\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will log in with the XCreds Login Window to resume the session.\n\n### Admin Group ###\n\nIf group membership is returned in the \"groups\" claim and matches the group defined in the \"CreateAdminIfGroupMember\" preference, the user will be created as admin.\n\n### kerberos ticket ###\nWhen app is first launched and there is a keychain item with an AD account and local password, a kerberos ticket will be attempted.\n\n### Override Preference Script ###\n\nMost preferences can now be overwritten by specifying a script at the path defined by \"settingsOverrideScriptPath\". This script, if it exists, owned by \\_securityagent, and has permissions 700 (accessible only by \\_securityagent) must return a valid plist that defines the key/value pairs to override in preferences. This allows for basing preferences based on the local state of the machine. It is important for the \"localAdminUserName\" and \"localAdminPassword\" keys.  See Reset Keychain for more information on this. The override script can also be used for querying the local state and setting preferences. For example, to randomly set the background image, a sample script \"settingsOverrideScriptPath\" defines a script:\n\n\n    #!/bin/sh\n    dir=\"/System/Library/Desktop Pictures\"\n    desktoppicture=`/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\n        \n    cat /usr/local/xcreds/override.plist|sed \"s|DESKTOPPICTUREPATH|${desktoppicture}|g\" \n    \nThe plist would be defined as:\n\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n    <plist version=\"1.0\">\n    <dict>\n        <key>loginWindowBackgroundImageURL</key>\n        <string>file://DESKTOPPICTUREPATH</string>\n    </dict>\n    </plist>\n\n\n### Reset Keychain ##\nIn prior versions of XCreds, the ability to reset the keychain if the user forgets their local password would fail due to the lack of an admin user with a secure token. This would cause the \"PasswordOverwriteSilent\" to fail. \n\nThe \"settingsOverrideScriptPath\" (see above) can return the admin username and password of an admin account that has a secure token. This admin user is then used to reset the user's keychain if they forgot their local password. This can either be done with user prompting or silently.\n\nThe script can find those keys via curl, in system keychain, or in a LAPS file and return the values inside the plist that is returned. This gives flexibility in determining the security required for the local admin username and password.\n\nNote that XCreds assumes an admin user with a secure token already exists on the machine and XCreds does not create or manage this user. If you manage local admin via a LAPS system, you can return the password from the local password file.\n\nAn example of an override script to return username and password are as follows:\n\nOverride Script:\n\n   ` #!/bin/sh`\n`    dir=\"/System/Library/Desktop Pictures\"`\n`    desktoppicture=/bin/ls -1 \"$dir\"/*.heic | sort --random-sort | head -1`\n`    `\n`    #this is provided as an example. DO NOT KEEP ADMIN CREDENTIALS ON DISK! Use curl or other method for getting them temporarily.`\n`    admin_username=\"tcadmin\"`\n`    admin_password=\"twocanoes\"`\n`    `\n`    cat /usr/local/xcreds/override.plist | sed \"s|LOCALADMINUSERNAME|${admin_username}|g\" | sed \"s|LOCALADMINPASSWORD|${admin_password}|g\" `\n\nplist:\n\n    `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`\n`    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">`\n`    <plist version=\"1.0\">`\n`    <dict>`\n`        <key>localAdminUserName</key>`\n`        <string>LOCALADMINUSERNAME</string>`\n`        <key>localAdminPassword</key>`\n`        <string>LOCALADMINPASSWORD</string>`\n`    </dict>`\n`    </plist>`\n\n\n### Others\n* added shake to password field\n* added dialog over login window when in an error state\n* improved code when local password policy does not allow setting password from cloud.\n* Added about menu with history\n\n## New Keys\n\n**ADDomain**\n\nThe desired AD domain\n\n**usernamePlaceholder**\n\nPlaceholder text in local / AD login window for username\n\n**passwordPlaceholder**\n\nPlaceholder text in local / AD login window for password\n\n**shouldShowLocalOnlyCheckbox**\n\nShow the local only checkbox on the local login page\n\n**CreateAdminIfGroupMember**\n\nList of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.\n\n**shouldSwitchToLoginWindowWhenLocked**\n\nWhen set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\n\n**settingsOverrideScriptPath**\n\nScript to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by root and only writable by root.\n\n**localAdminUserName**\n\nUsername of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to set up a secure token for newly created users.\n\n**localAdminPassword**\n\nPassword of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to set up a secure token for newly created users.\n\n**shouldShowCloudLoginByDefault**\n\nDetermine if the Mac login window or the cloud login window is shown by default\n\n**shouldShowMacLoginButton**\n\nShow the Mac Login Window button in XCreds Login\n\n**shouldShowTokenUpdateStatus**\nShow the time when the password will be checked. True by default.\n\n## Version 3.0 Build 3607 ##\n\nReleased 2023-04-19\n\n- Updated license\n- Fixed typo\n- Fixed issue with crash if time is too far off\n- Fixed regression for password change not capturing new password on Azure\n- Added trial license\n- Version 2.4\n- Added 802.1x support; added support for pref key for finding password based on type=password\n- Fixed changing wifi not dismissing dialog\n- Fixed issue with autorefresh\n- Added frontmost when prompting for keychain password\n- Fixed crashing issue due to null refreshview outlet\n- Fixed names and links in manifest\n- Tweaked text for user space refresh token window and added pref to show or hide\n- Updated sample config\n- Fixed focus issue\n- Fixed login window size and background image\n- Added in login window height/width min value of 100\n- Added key for customizing return to XCreds; added preference and ability to automatically refresh login window\n- Updated language on keychain option and added pref in manifest\n- Added remove keychain option\n\n## Version 2.3\n- Added more logging for id token\n- Removed progress screen overlay because it was hiding filevault\n- Added sub as local user account if other methods not available; added some additional logging\n- Removed test time\n- Fixed edge case when not showing xcreds login when logging out\n- Fixed shouldShowCloudLoginByDefault not working\n- Fixed timer issue\n- Removed show prefs menu\n- Implemented PasswordOverwriteSilent\n- Implemented KeychainReset\n- Added credit to script\n- Added startup script\n- Username hint was not being set\n- Renamed mapped prefs with a prefix\n- Changed case of keys\n- Made keys lowercase for mappings\n- Added new key for OIDC mapping\n\n## Version 2.2\n- Added mappings for user info\n\n## Version 2.1\n- Initial release\n"
  },
  {
    "path": "Javascript/get_pw/get_pw.html",
    "content": "<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Document</title>\n  <script src=\"get_pw.js\"></script>\n  <style>\n    body, input, button {\n      font-size: 1.25em;\n    }\n    [type=\"password\"] {\n      width: 100%;\n    }\n  </style>\n</head>\n<body>\n  <div>\n    <button id=\"toggle\">Show next example</button>\n  </div>\n  <div id=\"content\"></div>\n\n  <p>Click the button to have JavaScript change page content password fields.</p>\n\n  <p>The variable \"result\" will be logged on each keypress.  This variable will contain a JSON object.</p>\n\n  <p>The key value for \"passwords\" will always contain an array with the values of all password fields present.</p>\n\n  <p>The key value for \"ids\" will always return an array with the values of all password field \"id\" attributes present.  If any password elements do not have an \"id\" attribute set, the array will represent their position with an empty string.</p>\n</body>\n  <script>\n    var examples = [\n      `\n      <input type=\"password\" placeholder=\"enter password\">\n      <br><br>\n      <input id=\"pw333\" type=\"password\" placeholder=\"enter password.  this is the field with a target ID\">   \n      `, \n      `\n      <input type=\"password\" id=\"old-pw\" placeholder=\"old password\">\n      <input type=\"password\" id=\"new-pw\" placeholder=\"new password\">\n      <input type=\"password\" id=\"confirm-pw\" placeholder=\"confirm new password\">\n      `, \n      `\n      <input type=\"password\" placeholder=\"enter password\">\n      `\n    ];\n\n    var exampleIndex = 0;\n\n    document.querySelector('#toggle').addEventListener('click', function(){\n      if (exampleIndex >= examples.length) exampleIndex = 0;\n      document.querySelector('#content').innerHTML = examples[exampleIndex];\n      exampleIndex++;\n    });\n\n    window.addEventListener('keyup', function(){\n        console.log(result);\n    });\n  </script>\n</html>\n"
  },
  {
    "path": "Javascript/get_pw/get_pw.js",
    "content": "var elements = new Set();\nvar result = {\n  \"passwords\": [],\n  \"ids\": [],\n};\n\nfunction watchWindow(){\n  var passwordElements = document.querySelectorAll('[type=\"password\"]');\n  passwordElements.forEach(i=>elements.add(i));\n  var elementsArray = Array.from(elements);\n\n  if (elementsArray.length == 0) {\n    console.log(\"No password fields found\");\n  }\n\n  result.passwords = elementsArray.map(i=>i.value)\n    .filter(i=>i !== \"\");\n  result.ids = elementsArray.map(i=>i.id);\n  result.ids = [...new Set(result.ids)];\n  console.log(result);\n}\n\nwatchWindow();\nwindow.addEventListener('click', watchWindow);\nwindow.addEventListener('input', watchWindow);\n"
  },
  {
    "path": "KerbUtil.h",
    "content": "//\n//  Header.h\n//  NoMAD\n//\n//  Created by Joel Rennich on 4/26/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <GSS/GSS.h>\n#import <Cocoa/Cocoa.h>\n#import <Security/Security.h>\n#import <DirectoryService/DirectoryService.h>\n#import <OpenDirectory/OpenDirectory.h>\n\nextern OSStatus SecKeychainItemSetAccessWithPassword(SecKeychainItemRef item, SecAccessRef access, UInt32 passLength, const void* password);\n\n@interface KerbUtil : NSObject\n@property (nonatomic, assign, readonly) BOOL\t\t\t\t\t\tfinished;   // observable\n\n- (NSDictionary *)getKerbCredentialWithPassword:password userPrincipal:(NSString *)userPrincipal;\n- (void)getKerberosCredentials:(NSString *)password :(NSString *)userPrincipal completion:(void(^)(NSDictionary *))callback;\n- (NSString *)getKerbCredentials:(NSString *)password :(NSString *)userPrincipal;\n//- (void)changeKerberosPassword:(NSString *)oldPassword :(NSString *)newPassword :(NSString *)userPrincipal completion:(void(^)(NSString *))callback;\n- (BOOL)changeKerberosPassword:(NSString *)oldPassword :(NSString *)newPassword :(NSString *)userPrincipal error:(NSError **)error;\n- (int)checkPassword:(NSString *)myPassword;\n- (int)changeKeychainPassword:(NSString *)oldPassword :(NSString *)newPassword;\n- (OSStatus)resetKeychain:(NSString *)password;\n\n@end\n\n"
  },
  {
    "path": "KerbUtil.m",
    "content": "//\n//  KerbUtil.m\n//  NoMAD\n//\n//  Created by Joel Rennich on 4/26/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n#import \"KerbUtil.h\"\n#import <GSS/GSS.h>\n#import <krb5/krb5.h>\n#import <Cocoa/Cocoa.h>\n#import <Security/Security.h>\n#import <DirectoryService/DirectoryService.h>\n#import <OpenDirectory/OpenDirectory.h>\n#import \"TCTaskHelper.h\"\n#import \"NSError+EasyError.h\"\n@interface KerbUtil ()\n\n//@property (nonatomic, assign, readwrite) BOOL\t\t\t\tfinished;\n\n@end\n\n@implementation KerbUtil\n\n\n//we declare the private function SecKeychainChangePassword\n//this is private... so keep that in mind\n\nextern OSStatus SecKeychainChangePassword(SecKeychainRef keychainRef, UInt32 oldPasswordLength, const void* oldPassword, UInt32 newPasswordLength, const void* newPassword);\n\nextern OSStatus SecKeychainResetLogin(UInt32 passwordLength, const void* password, Boolean resetSearchList);\n\n- (void)getKerberosCredentials:(NSString *)password :(NSString *)userPrincipal completion:(void(^)(NSDictionary *))callback {\n\n    NSDictionary *dict = [self getKerbCredentialWithPassword:password userPrincipal:userPrincipal];\n\n    if (!dict) {\n        callback(nil);\n        return;\n    }\n    callback(dict);\n}\n\n- (NSDictionary *)getKerbCredentialWithPassword:password userPrincipal:(NSString *)userPrincipal {\n\n    OM_uint32 maj_stat;\n    gss_name_t gname = GSS_C_NO_NAME;\n    gss_cred_id_t cred = NULL;\n    CFErrorRef error = NULL;\n\n    // preflight for spaces in the userPrincipal\n\n    gname = GSSCreateName((__bridge CFTypeRef _Nonnull)(userPrincipal), GSS_C_NT_USER_NAME, NULL);\n    if (gname == NULL)\n    {\n        return nil;\n    }\n\n    NSDictionary *attrs = @{\n                            (id)kGSSICPassword : password\n                            };\n\n\n    maj_stat = gss_aapl_initial_cred(gname, GSS_KRB5_MECHANISM, (__bridge CFDictionaryRef)attrs, &cred, &error);\n\n    CFRelease(gname);\n    if (maj_stat) {\n        NSLog(@\"error: %d %@\", (int)maj_stat, error);\n        NSDictionary *errorDict = CFBridgingRelease(CFErrorCopyUserInfo(error)) ;\n        return errorDict;\n    }\n\n    CFRelease(cred);\n\n    return nil ;\n}\n\n- (NSString *)getKerbCredentials:(NSString *)password :(NSString *)userPrincipal {\n\n    NSDictionary *errorDict = [self getKerbCredentialWithPassword:password userPrincipal:userPrincipal];\n    if (!errorDict) {return nil;}\n\n    return  [ errorDict valueForKey:@\"NSDescription\"];\n\n}\n\n- (BOOL)changeKerberosPassword:(NSString *)oldPassword :(NSString *)newPassword :(NSString *)userPrincipal error:(NSError **)error{\n    OM_uint32 maj_stat;\n    gss_name_t gname = GSS_C_NO_NAME;\n    CFErrorRef cferror = NULL;\n\n    \n    gname = GSSCreateName((__bridge CFTypeRef _Nonnull)(userPrincipal), GSS_C_NT_USER_NAME, NULL);\n    if (gname == NULL) {\n        *error=[NSError easyErrorWithTitle:@\"GSSCreateName Error\" body:@\"error: failed to create GSS name\" line:__LINE__ file:@__FILE__];\n        return NO;\n    }\n    NSDictionary *attrs = @{ (id)kGSSChangePasswordOldPassword: oldPassword,\n                             (id)kGSSChangePasswordNewPassword: newPassword };\n\n    maj_stat = gss_aapl_change_password(gname, GSS_KRB5_MECHANISM, (__bridge CFDictionaryRef)attrs, &cferror);\n\n    CFRelease(gname);\n    if (maj_stat) {\n        NSLog(@\"error: %d %@\", (int)maj_stat, cferror);\n        NSDictionary *errorDict = CFBridgingRelease(CFErrorCopyUserInfo(cferror));\n        NSString *errorMessage = [errorDict valueForKey:(@\"NSDescription\")];\n        *error=[NSError easyErrorWithTitle:@\"Change Kerberos Password Error\" body:errorMessage line:__LINE__ file:@__FILE__];\n        return NO;\n    }\n    return YES;\n\n}\n\n- (NSString *)changeKerbPassword:(NSString *)oldPassword :(NSString *)newPassword :(NSString *)userPrincipal {\n\n    OM_uint32 maj_stat ;\n    gss_name_t gname = GSS_C_NO_NAME;\n    CFErrorRef error = NULL;\n\n    gname = GSSCreateName((__bridge CFTypeRef _Nonnull)(userPrincipal), GSS_C_NT_USER_NAME, NULL);\n    if (gname == NULL)\n        return @\"Error creating the GSS name.\";\n\n    // now change the password\n\n    NSDictionary *attrs2 = @{\n                             (id)kGSSChangePasswordOldPassword : oldPassword,\n                             (id)kGSSChangePasswordNewPassword : newPassword,\n                             };\n\n\n    maj_stat = gss_aapl_change_password(gname, GSS_KRB5_MECHANISM, (__bridge CFDictionaryRef)attrs2, &error);\n    CFRelease(gname);\n    if (maj_stat) {\n        NSLog(@\"error: %d %@\", (int)maj_stat, error);\n        NSDictionary *errorDict = CFBridgingRelease(CFErrorCopyUserInfo(error)) ;\n\n        return [ errorDict valueForKey:(@\"NSDescription\")];\n    }\n    //   CFRelease(error);\n\n    return nil;\n}\n\n- (int) checkPassword:(NSString *)myPassword {\n\n    //there's a lot of setup here to check a password\n    //we create an Authorization Right and then test it\n\n    AuthorizationItem myAuthRight;\n    myAuthRight.name = \"system.login.tty\";\n    myAuthRight.value = NULL;\n    myAuthRight.valueLength = 0;\n    myAuthRight.flags = 0;\n    AuthorizationRights authRights;\n    authRights.count = 1;\n    authRights.items = &myAuthRight;\n\n    //now to setup the authorization environment\n\n    AuthorizationItem authEnvironmentItems[2];\n    authEnvironmentItems[0].name = kAuthorizationEnvironmentUsername;\n    authEnvironmentItems[0].valueLength = NSUserName().length;\n    authEnvironmentItems[0].value = (void *)[NSUserName() UTF8String];\n    authEnvironmentItems[0].flags = 0;\n    authEnvironmentItems[1].name = kAuthorizationEnvironmentPassword;\n    authEnvironmentItems[1].valueLength = myPassword.length;\n    authEnvironmentItems[1].value = (void *)[myPassword UTF8String];\n    authEnvironmentItems[1].flags = 0;\n    AuthorizationEnvironment authEnvironment;\n    authEnvironment.count = 2;\n    authEnvironment.items = authEnvironmentItems;\n\n\n    //and now to actually do the auth\n\n    OSStatus authStatus = AuthorizationCreate(&authRights, &authEnvironment, kAuthorizationFlagExtendRights, NULL);\n    return (authStatus == errAuthorizationSuccess);\n\n}\n\n- (int) changeKeychainPassword:(NSString *)oldPassword :(NSString *)newPassword {\n\n    // Set up some variables\n    SecKeychainRef myDefaultKeychain;\n    OSErr err;\n\n    // Get the default keychain path, then attempt to change the password on it\n    SecKeychainCopyDefault(&myDefaultKeychain);\n\n    // Cast to proper types before function call\n    UInt32 oldLength = (UInt32)oldPassword.length;\n    UInt32 newLength = (UInt32)newPassword.length;\n    const char *cStyleOldPassword = [oldPassword UTF8String];\n    const char *cStyleNewPassword = [newPassword UTF8String];\n\n    NSLog(@\"Changing keychain password\");\n    err = SecKeychainChangePassword(myDefaultKeychain,\n                                    oldLength,\n                                    cStyleOldPassword,\n                                    newLength,\n                                    cStyleNewPassword);\n\n    if (err == noErr) {\n        NSLog(@\"Password changed successfully\");\n        return 1;\n    }\n    else if (err == -25293) {\n        // Let's try again because sometimes it returns -25293 error, but password is changed.\n        // No public function that does the same, we need to stick with it.\n        err = SecKeychainChangePassword(myDefaultKeychain,\n                                        oldLength,\n                                        cStyleOldPassword,\n                                        newLength,\n                                        cStyleNewPassword);\n        if (err == noErr) {\n            NSLog(@\"Password changed successfully\");\n            return 1;\n        } else {\n            NSLog(@\"Bad password. Keychain change was not successful.\");\n            return 0;\n        }\n    }\n    else {\n        NSLog(@\"Keychain change error.\");\n        return 0;\n    }\n}\n\n- (OSStatus)resetKeychain:(NSString *)password {\n    return SecKeychainResetLogin((UInt32)password.length, [password UTF8String], YES);\n}\n\n@end\n"
  },
  {
    "path": "KlistUtil.swift",
    "content": "//\n//  KlistUtil.swift\n//  NoMAD\n//\n//  Created by Joel Rennich on 7/18/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\nimport GSS\n\n// Class to parse klist -v --json and return all tickets and times\n\n// TODO: Handle multiple caches at the same time\n// TODO: pack everything into one structure\n\npublic struct Ticket {\n    var expired: Bool\n    var expires: Date\n    var defaultCache: Bool\n    var principal: String\n    var krb5Cache: krb5_ccache?\n    var GSSItem: GSSItemRef?\n}\n\n// singleton for the class\n@available(macOS, deprecated: 11)\npublic let klistUtil = KlistUtil()\n@available(macOS, deprecated: 11)\npublic class KlistUtil {\n\n    var dateFormatter = DateFormatter()\n    public var tickets = [String:Ticket]()\n    // var tempDict = [String:Ticket]()\n\n\n    public var defaultPrincipal: String?\n    public var defaultExpires: Date?\n\n    public init() {\n\n        if let adDomainFromPrefs = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue){\n\n            createBasicKerbPrefs(realm: adDomainFromPrefs.uppercased())\n        }\n        dateFormatter.dateFormat = \"yyyyMMddHHmmss\"\n    }\n    // Create a minimal com.apple.Kerberos file so we don't barf on password change\n\n    fileprivate func createBasicKerbPrefs(realm: String?) {\n\n\n\n        // get the defaults for com.apple.Kerberos\n\n        let kerbPrefs = UserDefaults.init(suiteName: \"com.apple.Kerberos\")\n\n        // get the list defaults, or create an empty dictionary if there are none\n\n        let kerbDefaults = kerbPrefs?.dictionary(forKey: \"libdefaults\") ?? [String:AnyObject]()\n\n        // test to see if the domain_defaults key already exists, if not build it\n\n        if kerbDefaults[\"default_realm\"] != nil {\n            TCSLogWithMark(\"Existing default realm. Skipping adding default realm to Kerberos prefs.\")\n        } else {\n            // build a dictionary and add the KDC into it then write it back to defaults\n            let libDefaults = NSMutableDictionary()\n            libDefaults.setValue(realm, forKey: \"default_realm\")\n            kerbPrefs?.set(libDefaults, forKey: \"libdefaults\")\n        }\n    }\n    @available(macOS, deprecated: 11)\n    public func returnTickets() -> [Ticket] {\n\n        // update the tickets\n\n        klist()\n\n        var results = [Ticket]()\n        for ticket in tickets {\n            results.append(ticket.value)\n        }\n\n        return results\n\n    }\n\n    // convenience function to return all principals\n\n    public func returnPrincipals() -> [String] {\n        klist()\n        return tickets.keys.sorted()\n    }\n\n    // convenience function to return default principal\n\n    public func returnDefaultPrincipal() -> String {\n        return defaultPrincipal ?? \"No Ticket\"\n    }\n\n    public func returnDefaultExpiration() -> Date? {\n        return defaultExpires\n    }\n    @available(macOS, deprecated: 11)\n\n    public func klist() {\n\n        let sema = DispatchSemaphore(value: 0)\n\n        // clear the current cached tickets\n\n        tickets.removeAll()\n        defaultPrincipal = nil\n        defaultExpires = nil\n\n        // use krb5 API to get default tickets and all tickets, including expired ones\n\n        var context: krb5_context? = nil\n        \n        krb5_init_secure_context(&context)\n\n        var oCache : krb5_ccache? = nil\n        _ = UnsafeMutablePointer<Any>.init(oCache)\n\n        let cname = krb5_cc_default_name(context)\n        let defaultName = String(cString: cname!).replacingOccurrences(of: \"API:\", with: \"\")\n\n        var cursor: krb5_cccol_cursor? = nil\n//        var ret: krb5_error_code? = nil\n        var min_stat = OM_uint32()\n\n        let _ = krb5_cccol_cursor_new(context, &cursor)\n\n        while ((krb5_cccol_cursor_next(context, cursor, &oCache) == 0 ) && oCache != nil)  {\n            let name = (String(cString: (krb5_cc_get_name(context, oCache))))\n            var krb5Principal : krb5_principal? = nil\n            _ = krb5_cc_get_principal(context, oCache, &krb5Principal)\n            var krb5PrincName : UnsafeMutablePointer<Int8>? = nil\n            guard let principal = krb5Principal else {\n                print(\"Principal is nil, unable to get principal name\")\n                continue\n            }\n            krb5_unparse_name(context, principal, &krb5PrincName)\n            guard let princName = krb5PrincName else {\n                print(\"Principal Name is nil, unable to get tickets\")\n                continue\n            }\n            let princNameString = String(cString: princName)\n            tickets[princNameString] = Ticket(expired: true, expires: Date.distantPast, defaultCache: false, principal: princNameString, krb5Cache: oCache, GSSItem: nil)\n            if name == defaultName {\n                //print(\"Default principal: \" + princNameString )\n                defaultPrincipal = princNameString\n                defaultExpires = Date.distantPast\n                tickets[princNameString]?.defaultCache = true\n            }\n        }\n\n        // now move to GSS APIs to get expiration times\n        // TODO: move this all to GSS APIs when the GSS API functionality is there\n\n        gss_iter_creds(&min_stat, 0, nil, { a, cred in\n\n            _ = OM_uint32()\n            _ = gss_buffer_desc()\n\n            if cred != nil {\n                let name = GSSCredentialCopyName(cred!)\n                if name != nil {\n                    let displayName = GSSNameCreateDisplayString(name!)!\n                    let displayNameString = String(describing: displayName.takeRetainedValue())\n                    //print(displayNameString)\n                    let lifetime = GSSCredentialGetLifetime(cred!)\n                    let expiretime = Date().addingTimeInterval(TimeInterval(lifetime))\n                    //print(self.tickets[displayNameString])\n                    self.tickets[displayNameString]?.expired = false\n                    self.tickets[displayNameString]?.expires = expiretime\n                    self.tickets[displayNameString]?.GSSItem = cred\n                    if self.defaultPrincipal == displayNameString {\n                        self.defaultExpires = expiretime\n                    }\n                } else {\n                    print(\"Expired credential - ignoring.\")\n                }\n            }\n            sema.signal()\n            TCSLogWithMark(\"Tickets: \" + self.tickets.keys.joined(separator: \", \"))\n        })\n        sema.wait()\n        //return tickets\n\n        // clean up any expired tickets\n\n        let ticks = tickets\n\n        tickets.removeAll()\n\n        for tick in ticks {\n            if !tick.value.expired {\n                // ticket is not expired add it back\n                tickets[tick.value.principal] = tick.value\n            }\n        }\n        //print(tickets)\n    }\n    @available(macOS, deprecated: 11)\n    public func hasTickets(principal: String) -> Bool {\n        klist()\n        return tickets.keys\n            .map { $0.lowercased() }\n            .contains(principal.lowercased())\n    }\n\n    // function to delete a kerb ticket\n    @available(macOS, deprecated: 11)\n    public func kdestroy(princ: String = \"\" ) {\n\n        var name = \"\"\n\n        if princ == \"\" {\n            name = defaultPrincipal!\n        } else {\n            name = princ\n        }\n\n        TCSLogWithMark(\"Destroying ticket for: \" + princ)\n        // update this for GSSAPI when the functionality is there\n\n        var context: krb5_context? = nil\n        krb5_init_secure_context(&context)\n\n        krb5_cc_destroy(context, tickets[name]?.krb5Cache)\n    }\n\n    // function to switch the default cache\n    @available(macOS, deprecated: 11)\n    public func kswitch(princ: String = \"\" ) {\n\n        var name = \"\"\n        var p : krb5_principal? = nil\n        var cache: krb5_ccache? = nil\n\n        if princ == \"\" {\n            name = defaultPrincipal!\n        } else {\n            name = princ\n        }\n\n        var nameInt = Int8(name)\n\n        TCSLogWithMark(\"Switching ticket for: \" + princ)\n        // update this for GSSAPI when the functionality is there\n\n        var context: krb5_context? = nil\n        krb5_init_secure_context(&context)\n\n        krb5_parse_name(context!, &nameInt!, &p)\n        krb5_cc_cache_match(context, p, &cache)\n        // krb5_cc_set_default_name\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2022 Twocanoes Software, Inc\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Logger.swift",
    "content": "//\n//  Logger.swift\n//  NoMAD\n//\n//  Created by Joel Rennich on 9/6/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n/// A singleton `Logger` instance for the app to use.\n\nlet myLogger = Logger()\n\nimport Foundation\nimport os.log\n\n/// The individual logging levels to use when logging in NoMAD\n///\n/// - base: General errors\n/// - info: Positive info\n/// - notice: Nice to know issues that may, or may not, cause issues\n/// - debug: Lots of verbose logging\nenum LogLevel: Int {\n    \n    /// General errors\n    case base = 0\n    \n    /// Positive info\n    case info = 1\n    \n    /// Nice to know issues that may, or may not, cause issues\n    case notice = 2\n    \n    /// Lots of verbose logging\n    case debug = 3\n}\n\nvar log: OSLog? {\n    if #available(OSX 10.12, *) {\n        return OSLog(subsystem: \"menu.nomad.login.ad\", category: \"framework\")\n    } else {\n        return nil\n    }\n}\n\n\n\n/// Simple class to handle logging levels. Use the `LogLevel` enum to specify the logging details.\nclass Logger {\n    \n    /// Set to a level from `LogLevel` enum to control what gets logged.\n    var loglevel: LogLevel\n    \n    /// Init method simply check to see if Verbose logging is enabled or not for the Logger object.\n    init() {\n        \n        let defaults = UserDefaults.init(suiteName: \"menu.nomad.login.ad\")\n        \n        if defaults?.bool(forKey: \"Verbose\") ?? false {\n            NSLog(\"Enaging verbose logging\")\n            loglevel = .debug\n        } else {\n            loglevel = .base\n        }\n    }\n    \n    /// Simple wrapper around NSLog to provide control of logging.\n    ///\n    /// - Parameters:\n    ///   - level: A value from `LogLevel` enum\n    ///   - message: A `String` that describes the information to be logged\n    func logit(_ level: LogLevel, message: String) {\n        if (level.rawValue <= loglevel.rawValue) {\n            if #available(OSX 10.12, *) {\n                os_log(\"%{public}@\", log: log!, type: .debug, message)\n            } else {\n                NSLog(\"level: \\(level) - \" + message)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "NoMADSession.swift",
    "content": "//\n//  ADUser.swift\n//  nomad-ad\n//\n//  Created by Joel Rennich on 9/9/17.\n//  Copyright © 2018 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n//import NoMADPRIVATE\n\npublic protocol NoMADUserSession {\n    func getKerberosTicket(principal: String?, completion: @escaping (KerberosTicketResult) -> Void)\n    func authenticate(authTestOnly: Bool)\n//    func changePassword(oldPassword: String, newPassword: String, completion: @escaping (String?) -> Void)\n    func changeKerberosPassword() throws\n    func userInfo()\n    var delegate: NoMADUserSessionDelegate? { get set }\n    var state: NoMADSessionState { get }\n}\n\npublic typealias KerberosTicketResult = Result<ADUserRecord, NoMADSessionError>\n\npublic protocol NoMADUserSessionDelegate: AnyObject {\n    func NoMADAuthenticationSucceeded()\n    func NoMADAuthenticationFailed(error: NoMADSessionError, description: String)\n    func NoMADUserInformation(user: ADUserRecord)\n}\n\npublic enum NoMADSessionState {\n    case success\n    case offDomain\n    case siteFailure\n    case networkLookup\n    case passwordChangeRequired\n    case unset\n    case lookupError\n    case kerbError\n}\n\npublic enum NoMADSessionError: String, Error {\n    case OffDomain\n    case UnAuthenticated\n    case SiteError\n    case StateError\n    case AuthenticationFailure\n    case KerbError\n    case PasswordExpired = \"Password has expired\"\n    case UnknownPrincipal\n    case wrongRealm = \"Wrong realm\"\n}\n\npublic enum LDAPType {\n    case AD\n    case OD\n}\n\npublic enum GSSErrorKey : String {\n\n    case mechanismKey = \"kGSSMechanism\"\n    case mechanismOIDKey = \"kGSSMechanismOID\"\n    case majorErrorCodeKey = \"kGSSMajorErrorCode\"\n    case minorErrorCodeKey = \"kGSSMinorErrorCode\"\n    case descriptionKey = \"NSDescription\"\n\n}\npublic struct GSSError {\n    var mechanism:String\n    var mechanismOID:String\n    var majorErrorCode:Int\n    var minorErrorCode:UInt\n    var description:String\n\n}\npublic struct NoMADLDAPServer {\n    var host: String\n    var status: String\n    var priority: Int\n    var weight: Int\n    var timeStamp: Date\n}\n\n// MARK: Start of public class\n\n/// A general purpose class that is the main entrypoint for interactions with Active Directory.\n@available(macOS, deprecated: 11)\npublic class NoMADSession: NSObject {\n\n    public var state: NoMADSessionState = .offDomain          // current state of affairs\n    weak public var delegate: NoMADUserSessionDelegate?       // delegate\n    public var site: String = \"\"                              // current AD site\n    public var defaultNamingContext: String = \"\"              // current default naming context\n    private var hosts = [NoMADLDAPServer]()                   // list of LDAP servers\n    private var resolver = DNSResolver()                      // DNS resolver object\n    private var maxSSF = \"\"                                   // current security level in place for LDAP lookups\n    private var URIPrefix = \"ldap://\"                         // LDAP or LDAPS\n    private var current = 0                                   // current LDAP server from hosts\n    public var home = \"\"                                      // current active user home\n    public var ldapServers: [String]?                         // static DCs to use instead of looking up via DNS records\n\n    // Base configuration prefs\n    // change these on the object as needed\n    \n    public var domain: String = \"\"                  // current LDAP Domain - can be set with init\n    public var kerberosRealm: String = \"\"           // Kerberos realm\n    public var createKerbPrefs: Bool = true         // Determines if skeleton Kerb prefs should be set\n    \n    public var siteIgnore: Bool = false             // ignore site lookup?\n    public var siteForce: Bool = false              // force a site?\n    public var siteForceSite: String = \"\"           // what site to force\n    \n    public var ldaptype: LDAPType = .AD             // Type of LDAP server\n    public var port: Int = 389                      // LDAP port typically either 389 or 636\n    public var anonymous: Bool = false              // Anonymous LDAP lookup\n    public var useSSL: Bool = false                 // Toggle SSL\n    \n    public var recursiveGroupLookup : Bool = false  // Toggle recursive group lookup\n    \n    // User\n\n    public var userPrincipal: String = \"\"           // Full user principal\n    public var userPrincipalShort: String = \"\"      // user shortname - necessary for any lookups to happen\n    public var userRecord: ADUserRecord? = nil      // ADUserRecordObject containing all user information\n    public var userPass: String = \"\"                // for auth\n    public var oldPass: String = \"\"                 // for password changes\n    public var newPass: String = \"\"                 // for password changes\n    public var customAttributes : [String]?\n\n    // conv. init with domain and user\n    \n    /// Convience initializer to create a `NoMADSession` with the given domain, username, and `LDAPType`\n    ///\n    /// - Parameters:\n    ///   - domain: The AD domain for the user.\n    ///   - user: The user's name. Either the User Principal Short, or the Users Principal name including the @domain syntax are accepted.\n    ///   - type: The type of LDAP connection. Defaults to AD.\n    public init(domain: String, user: String, type: LDAPType = .AD) {\n\n        // configuration parts\n        self.domain = domain\n        self.ldaptype = type\n\n        // check for the REALM\n        if user.contains(\"@\") {\n            self.userPrincipalShort = user.components(separatedBy: \"@\").first!\n            self.kerberosRealm = user.components(separatedBy: \"@\").last!.uppercased()\n            self.userPrincipal = user\n        } else {\n            self.userPrincipalShort = user\n            self.kerberosRealm = domain.uppercased()\n            self.userPrincipal = user + \"@\\(self.kerberosRealm)\"\n        }\n\n    }\n\n    // MARK: conv functions\n    \n    // Return the current server\n    \n    var currentServer: String {\n        TCSLogWithMark(\"Computed currentServer accessed in state: \\(String(describing: state))\")\n\n        if state != .offDomain {\n\n            if hosts.isEmpty {\n                TCSLogWithMark(\"Make sure we have LDAP servers\")\n                getHosts(domain)\n            }\n            TCSLogWithMark(\"Lookup the current LDAP host in: \\(String(describing: hosts))\")\n\n            return hosts[current].host\n        } else {\n            return \"\"\n        }\n    }\n    \n    // MARK: DNS Main\n    \n    fileprivate func parseSRVReply(_ results: inout [String]) {\n        if (self.resolver.error == nil) {\n            TCSLogWithMark(\"Did Receive Query Result: \" + self.resolver.queryResults.description)\n            TCSLogWithMark(\"Copy \\(resolver.queryResults.count) result to records\")\n            let records = self.resolver.queryResults as! [[String:AnyObject]]\n            TCSLogWithMark(\"records dict ready: \" + records.debugDescription)\n            for record: Dictionary in records {\n                TCSLogWithMark(\"Adding: \\(String(describing: record[\"target\"]))\")\n                let host = record[\"target\"] as! String\n                TCSLogWithMark(\"Created host: \" + host)\n                results.append(host)\n                TCSLogWithMark(\"Added host to results: \\(String(describing: results))\")\n            }\n        } else {\n            TCSLogWithMark(\"Query Error: \" + self.resolver.error.localizedDescription)\n        }\n    }\n\n    func getSRVRecords(_ domain: String, srv_type: String=\"_ldap._tcp.\") -> [String] {\n        self.resolver.queryType = \"SRV\"\n        \n        self.resolver.queryValue = srv_type + domain\n        \n        // TODO: Do we need to exclude _kpasswd?\n        \n        if (site != \"\" && !srv_type.contains(\"_kpasswd\")) {\n            self.resolver.queryValue = srv_type + site + \"._sites.\" + domain\n        }\n        var results = [String]()\n        \n        TCSLogWithMark(\"Starting DNS query for SRV records.\")\n        \n        self.resolver.startQuery()\n        \n        while ( !self.resolver.finished ) {\n            RunLoop.current.run(mode: RunLoop.Mode.default, before: Date.distantFuture)\n        }\n\n        parseSRVReply(&results)\n        TCSLogWithMark(\"Returning results: \\(String(describing: results))\")\n        return results\n    }\n    \n    fileprivate func parseHostsReply() {\n        if (self.resolver.error == nil) {\n            TCSLogWithMark(\"Did Receive Query Result: \" + self.resolver.queryResults.description)\n\n            var newHosts = [NoMADLDAPServer]()\n            let records = self.resolver.queryResults as! [[String:AnyObject]]\n            for record: Dictionary in records {\n                let host = record[\"target\"] as! String\n                let priority = record[\"priority\"] as! Int\n                let weight = record[\"weight\"] as! Int\n                // let port = record[\"port\"] as! Int\n                let currentServer = NoMADLDAPServer(host: host, status: \"found\", priority: priority, weight: weight, timeStamp: Date())\n                newHosts.append(currentServer)\n            }\n\n            // now to sort them\n\n            let fallbackHosts = self.hosts\n            \n            self.hosts = newHosts.sorted { (x, y) -> Bool in\n                return ( x.priority <= y.priority )\n            }\n            \n            // add back in the globally avilable DCs in case the site has gone bust\n            // credit to @mosen for this brilliant idea\n            \n            self.hosts.append(contentsOf: fallbackHosts)\n            state = .success\n\n        } else {\n            TCSLogWithMark(\"Query Error: \" + self.resolver.error.localizedDescription)\n            state = .siteFailure\n            self.hosts.removeAll()\n        }\n    }\n\n    fileprivate func getHosts(_ domain: String ) {\n        \n        // check to see if we have static hosts\n        \n        if let servers = ldapServers {\n            \n            TCSLogWithMark(\"Using static DC list.\")\n            var newHosts = [NoMADLDAPServer]()\n            for server in servers {\n                \n                let host = server\n                let priority = 100\n                let weight = 100\n                // let port = record[\"port\"] as! Int\n                let currentServer = NoMADLDAPServer(host: host, status: \"found\", priority: priority, weight: weight, timeStamp: Date())\n                newHosts.append(currentServer)\n                \n                self.hosts = newHosts.sorted { (x, y) -> Bool in\n                    return ( x.priority <= y.priority )\n                }\n                state = .success\n                \n                // fake a site to put something in\n                \n                site = \"STATIC\"\n                \n                return\n            }\n            \n        }\n        \n        self.resolver.queryType = \"SRV\"\n        \n        self.resolver.queryValue = \"_ldap._tcp.\" + domain\n        if (self.site != \"\") {\n            self.resolver.queryValue = \"_ldap._tcp.\" + self.site + \"._sites.\" + domain\n        }\n        \n        // check for a query already running\n        \n        TCSLogWithMark(\"Starting DNS query for SRV records.\")\n        \n        self.resolver.startQuery()\n        \n        while ( !self.resolver.finished ) {\n            RunLoop.current.run(mode: RunLoop.Mode.default, before: Date.distantFuture)\n            TCSLogWithMark(\"Waiting for DNS query to return.\")\n        }\n        \n        parseHostsReply()\n    }\n    \n    fileprivate func testHosts() {\n        if state == .success {\n            for i in 0...( hosts.count - 1) {\n                if hosts[i].status != \"dead\" {\n                    myLogger.logit(.info, message:\"Trying host: \" + hosts[i].host)\n                    \n                    // socket test first - this could be falsely negative\n                    // also note that this needs to return stderr\n                    \n                    let mySocketResult = cliTask(\"/usr/bin/nc -G 5 -z \" + hosts[i].host + \" \" + String(port))\n                    \n                    if mySocketResult.contains(\"succeeded!\") {\n                        \n                        var attribute = \"defaultNamingContext\"\n                        \n                        // if socket test works, then attempt ldapsearch to get default naming context\n                        \n                        if ldaptype == .OD {\n                            attribute = \"namingContexts\"\n                        }\n                        \n                        // TODO: THINK ABOUT THIS\n                        //swapPrincipals(false)\n                        \n                        var myLDAPResult = \"\"\n                        \n                        if anonymous {\n                            myLDAPResult = cliTask(\"/usr/bin/ldapsearch -N -LLL -x \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + hosts[i].host + \" \" + String(port) + \" \" + attribute)\n                        } else {\n                            myLDAPResult = cliTask(\"/usr/bin/ldapsearch -N -LLL -Q \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + hosts[i].host + \" \" + String(port) + \" \" + attribute)\n                        }\n                        \n                        // TODO: THINK ABOUT THIS\n                        //swapPrincipals(false)\n                        \n                        if myLDAPResult != \"\" && !myLDAPResult.contains(\"GSSAPI Error\") && !myLDAPResult.contains(\"Can't contact\") {\n                            let ldifResult = cleanLDIF(myLDAPResult)\n                            if ( ldifResult.count > 0 ) {\n                                defaultNamingContext = getAttributeForSingleRecordFromCleanedLDIF(attribute, ldif: ldifResult)\n                                hosts[i].status = \"live\"\n                                hosts[i].timeStamp = Date()\n                                myLogger.logit(.base, message:\"Current LDAP Server is: \" + hosts[i].host )\n                                myLogger.logit(.base, message:\"Current default naming context: \" + defaultNamingContext )\n                                current = i\n                                break\n                            }\n                        }\n                        // We didn't get an actual LDIF Result... so LDAP isn't working.\n                        myLogger.logit(.info, message:\"Server is dead by way of ldap test: \" + hosts[i].host)\n                        hosts[i].status = \"dead\"\n                        hosts[i].timeStamp = Date()\n                        break\n                        \n                    } else {\n                        myLogger.logit(.info, message:\"Server is dead by way of socket test: \" + hosts[i].host)\n                        hosts[i].status = \"dead\"\n                        hosts[i].timeStamp = Date()\n                    }\n                }\n            }\n        }\n        \n        guard ( hosts.count > 0 ) else {\n            return\n        }\n        \n        if hosts.last!.status == \"dead\" {\n            myLogger.logit(.base, message: \"All DCs in are dead! You should really fix this.\")\n            state = .offDomain\n        } else {\n            state = .success\n        }\n    }\n    \n    // MARK: Sites\n    \n    // private function to get the AD site\n    \n    fileprivate func findSite() {\n        // backup the defaultNamingContext so we can restore it at the end.\n        let tempDefaultNamingContext = defaultNamingContext\n        \n        // Setting defaultNamingContext to \"\" because we're doing a search against the RootDSE\n        defaultNamingContext = \"\"\n        \n        \n        // For info on LDAP Ping: https://msdn.microsoft.com/en-us/library/cc223811.aspx\n        // For information on the values: https://msdn.microsoft.com/en-us/library/cc223122.aspx\n        let attribute = \"netlogon\"\n        // not sure if we need: (AAC=\\00\\00\\00\\00)\n        let searchTerm = \"(&(DnsDomain=\\(domain))(NtVer=\\\\06\\\\00\\\\00\\\\00))\" //NETLOGON_NT_VERSION_WITH_CLOSEST_SITE\n        \n        guard let ldifResult = try? getLDAPInformation([attribute], baseSearch: true, searchTerm: searchTerm, test: false, overrideDefaultNamingContext: true) else {\n            myLogger.logit(LogLevel.base, message: \"LDAP Query failed.\")\n            myLogger.logit(.debug, message:\"Resetting default naming context to: \" + tempDefaultNamingContext)\n            defaultNamingContext = tempDefaultNamingContext\n            return\n        }\n        \n        let ldapPingBase64 = getAttributeForSingleRecordFromCleanedLDIF(attribute, ldif: ldifResult)\n        \n        if ldapPingBase64 == \"\" {\n            myLogger.logit(LogLevel.base, message: \"ldapPingBase64 is empty.\")\n            myLogger.logit(.debug, message:\"Resetting default naming context to: \" + tempDefaultNamingContext)\n            defaultNamingContext = tempDefaultNamingContext\n            return\n        }\n        \n        guard let ldapPing: ADLDAPPing = ADLDAPPing(ldapPingBase64String: ldapPingBase64) else {\n            myLogger.logit(.debug, message:\"Resetting default naming context to: \" + tempDefaultNamingContext)\n            defaultNamingContext = tempDefaultNamingContext\n            return\n        }\n        \n        // calculate the site\n        \n        if siteIgnore {\n            site = \"\"\n            myLogger.logit(.debug, message:\"Sites being ignored due to preferences.\")\n        } else if siteForce {\n            site = siteForceSite\n            myLogger.logit(.debug, message:\"Site being forced to site set in preferences.\")\n        } else {\n            site = ldapPing.clientSite\n        }\n        \n        \n        if (ldapPing.flags.contains(.DS_CLOSEST_FLAG)) {\n            myLogger.logit(LogLevel.info, message:\"The current server is the closest server.\")\n        } else {\n            if ( site != \"\") {\n                myLogger.logit(LogLevel.info, message:\"Site \\\"\\(site)\\\" found.\")\n                myLogger.logit(LogLevel.notice, message: \"Looking up DCs for site.\")\n                //let domain = currentDomain\n                let currentHosts = hosts\n                getHosts(domain)\n                if (hosts[0].host == \"\") {\n                    myLogger.logit(LogLevel.base, message: \"Site \\\"\\(site)\\\" has no DCs configured. Ignoring site. You should fix this.\")\n                    hosts = currentHosts\n                }\n                testHosts()\n            } else {\n                myLogger.logit(LogLevel.base, message: \"Unable to find site\")\n            }\n        }\n        myLogger.logit(.debug, message:\"Resetting default naming context to: \" + tempDefaultNamingContext)\n        defaultNamingContext = tempDefaultNamingContext\n    }\n    \n    // MARK: LDAP Retrieval\n    \n    func getLDAPInformation( _ attributes: [String], baseSearch: Bool=false, searchTerm: String=\"\", test: Bool=true, overrideDefaultNamingContext: Bool=false) throws -> [[String:String]] {\n        \n        if test {\n            guard testSocket(self.currentServer) else {\n                throw NoMADSessionError.StateError\n            }\n        }\n        \n        // TODO: We need to un-comment this and figure out another way to pass a valid empty defaultNamingContext\n        if (overrideDefaultNamingContext == false) {\n            if (defaultNamingContext == \"\") || (defaultNamingContext.contains(\"GSSAPI Error\")) {\n                testHosts()\n            }\n        }\n        \n        // TODO\n        // ensure we're using the right kerberos credential cache\n        //swapPrincipals(false)\n        \n        let command = \"/usr/bin/ldapsearch\"\n        var arguments: [String] = [String]()\n        arguments.append(\"-N\")\n        if anonymous {\n            arguments.append(\"-x\")\n        } else {\n            arguments.append(\"-Q\")\n        }\n        arguments.append(\"-LLL\")\n        arguments.append(\"-o\")\n        arguments.append(\"nettimeout=1\")\n        arguments.append(\"-o\")\n        arguments.append(\"ldif-wrap=no\")\n        if baseSearch {\n            arguments.append(\"-s\")\n            arguments.append(\"base\")\n        }\n        if maxSSF != \"\" {\n            arguments.append(\"-O\")\n            arguments.append(\"maxssf=0\")\n        }\n        arguments.append(\"-H\")\n        arguments.append(URIPrefix + self.currentServer)\n        arguments.append(\"-b\")\n        arguments.append(self.defaultNamingContext)\n        if ( searchTerm != \"\") {\n            arguments.append(searchTerm)\n        }\n        arguments.append(contentsOf: attributes)\n        let ldapResult = cliTask(command, arguments: arguments)\n        TCSLogWithMark(\"command: \\(command) args: \\(arguments)\")\n        if (ldapResult.contains(\"GSSAPI Error\") || ldapResult.contains(\"Can't contact\")) {\n            throw NoMADSessionError.StateError\n        }\n        \n        let myResult = cleanLDIF(ldapResult)\n        \n        // TODO\n        //swapPrincipals(true)\n        \n        return myResult\n    }\n    \n    fileprivate func cleanGroups(_ groupsTemp: String?, _ groups: inout [String]) {\n        // clean up groups\n\n        if groupsTemp != nil {\n            let groupsArray = groupsTemp!.components(separatedBy: \";\")\n            for group in groupsArray {\n                let a = group.components(separatedBy: \",\")\n                var b = a[0].replacingOccurrences(of: \"CN=\", with: \"\") as String\n                b = b.replacingOccurrences(of: \"cn=\", with: \"\") as String\n\n                if b != \"\" {\n                    groups.append(b)\n                }\n            }\n            myLogger.logit(.info, message: \"You are a member of: \" + groups.joined(separator: \", \") )\n        }\n    }\n\n    fileprivate func lookupRecursiveGroups(_ dn: String, _ groupsTemp: inout String?) {\n        // now to get recursive groups if asked\n\n        if recursiveGroupLookup {\n            let attributes = [\"name\"]\n            let searchTerm = \"(member:1.2.840.113556.1.4.1941:=\" + dn.replacingOccurrences(of: \"\\\\\", with: \"\\\\\\\\5c\") + \")\"\n            if let ldifResult = try? getLDAPInformation(attributes, searchTerm: searchTerm) {\n                groupsTemp = \"\"\n                for item in ldifResult {\n                    for components in item {\n                        if components.key == \"dn\" {\n                            groupsTemp?.append(components.value + \";\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    fileprivate func parseExpirationDate(_ computedExpireDateRaw: String?, _ passwordAging: inout Bool, _ userPasswordExpireDate: inout Date, _ userPasswordUACFlag: String, _ serverPasswordExpirationDefault: inout Double, _ tempPasswordSetDate: Date) {\n        if computedExpireDateRaw != nil {\n            // Windows Server 2008 and Newer\n            if Int(computedExpireDateRaw!) ==  Int.max {\n\n                // Password doesn't expire\n                passwordAging = false\n\n                // Set expiration to far away from now\n                userPasswordExpireDate = Date.distantFuture\n\n            } else if (Int(computedExpireDateRaw!) == 0) {\n\n                // password needs to be reset\n                passwordAging = true\n\n                // set expirate to long ago\n                userPasswordExpireDate = Date.distantPast\n\n            } else {\n                // Password expires\n                passwordAging = true\n                userPasswordExpireDate = NSDate(timeIntervalSince1970: (Double(computedExpireDateRaw!)!)/10000000-11644473600) as Date\n            }\n        } else {\n            // Older then Windows Server 2008\n            // need to go old skool\n            var passwordExpirationLength: String\n            let attribute = \"maxPwdAge\"\n\n            if let ldifResult = try? getLDAPInformation([attribute], baseSearch: true) {\n                passwordExpirationLength = getAttributeForSingleRecordFromCleanedLDIF(attribute, ldif: ldifResult)\n            } else {\n                passwordExpirationLength = \"\"\n            }\n\n            if ( passwordExpirationLength.count > 15 ) {\n                passwordAging = false\n            } else if ( passwordExpirationLength != \"\" ) && userPasswordUACFlag != \"\" {\n                if ~~( Int(userPasswordUACFlag)! & 0x10000 ) {\n                    passwordAging = false\n                } else {\n                    serverPasswordExpirationDefault = Double(abs(Int(passwordExpirationLength)!)/10000000)\n                    passwordAging = true\n                }\n            } else {\n                serverPasswordExpirationDefault = Double(0)\n                passwordAging = false\n            }\n            userPasswordExpireDate = tempPasswordSetDate.addingTimeInterval(serverPasswordExpirationDefault)\n        }\n    }\n\n    fileprivate func extractedFunc(_ attributes: [String], _ searchTerm: String) {\n        if let ldifResult = try? getLDAPInformation(attributes, searchTerm: searchTerm) {\n            let ldapResult = getAttributesForSingleRecordFromCleanedLDIF(attributes, ldif: ldifResult)\n            _ = ldapResult[\"homeDirectory\"] ?? \"\"\n            _ = ldapResult[\"displayName\"] ?? \"\"\n            _ = ldapResult[\"memberOf\"]\n            _ = ldapResult[\"mail\"] ?? \"\"\n            _ = ldapResult[\"uid\"] ?? \"\"\n        } else {\n            myLogger.logit(.base, message: \"Unable to find user.\")\n        }\n    }\n    \n    func getUserInformation() -> Bool {\n\n        // some setup\n        \n        var passwordAging = true\n        var tempPasswordSetDate = Date()\n        var serverPasswordExpirationDefault = 0.0\n        var userPasswordExpireDate = Date()\n        var groups = [String]()\n        var userHome = \"\"\n        \n        if ldaptype == .AD {\n            var attributes = [\"pwdLastSet\", \"msDS-UserPasswordExpiryTimeComputed\", \"userAccountControl\", \"homeDirectory\", \"displayName\", \"memberOf\", \"mail\", \"userPrincipalName\", \"dn\", \"givenName\", \"sn\", \"cn\", \"msDS-ResultantPSO\", \"msDS-PrincipalName\"] // passwordSetDate, computedExpireDateRaw, userPasswordUACFlag, userHomeTemp, userDisplayName, groupTemp\n            \n            if customAttributes?.count ?? 0 > 0 {\n                attributes.append(contentsOf: customAttributes!)\n            }\n            \n             let searchTerm = \"(|(sAMAccountName=\"+userPrincipalShort+\")(userPrincipalName=\"+userPrincipalShort+\"@\"+domain+\"))\"\n\n            if let ldifResult = try? getLDAPInformation(attributes, searchTerm: searchTerm) {\n                if ldifResult.count>1 {\n\n                    TCSLogWithMark(\"Multiple records found. exiting\")\n                    return false\n                }\n                else if ldifResult.count==0 {\n\n                    TCSLogWithMark(\"no user records found. exiting\")\n                    return false\n                }\n                let ldapResult = getAttributesForSingleRecordFromCleanedLDIF(attributes, ldif: ldifResult)\n                TCSLogWithMark(ldapResult.description)\n                let passwordSetDate = ldapResult[\"pwdLastSet\"]\n                let computedExpireDateRaw = ldapResult[\"msDS-UserPasswordExpiryTimeComputed\"]\n                let userPasswordUACFlag = ldapResult[\"userAccountControl\"] ?? \"\"\n                let userHomeTemp = ldapResult[\"homeDirectory\"] ?? \"\"\n\n                var userDisplayName = ldapResult[\"displayName\"] ?? \"\"\n\n                TCSLogWithMark(\"userDisplayName: \\(userDisplayName)\")\n                if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapFullName.rawValue)  as? String, mapKey.count>0, let mapValue = ldapResult[mapKey]  {\n                    userDisplayName=mapValue\n                    TCSLogWithMark(\"userDisplayName: \\(userDisplayName)\")\n                }\n\n                TCSLogWithMark(\"userDisplayName: \\(userDisplayName)\")\n\n                var firstName = ldapResult[\"givenName\"] ?? \"\"\n\n                if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapFirstName.rawValue)  as? String, mapKey.count>0, let mapValue = ldapResult[mapKey]  {\n                    firstName=mapValue\n                }\n                var lastName = ldapResult[\"sn\"] ?? \"\"\n\n                if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapLastName.rawValue)  as? String, mapKey.count>0, let mapValue = ldapResult[mapKey]  {\n                    lastName=mapValue\n                }\n\n                var shortName = userPrincipalShort\n\n                if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapUserName.rawValue)  as? String, mapKey.count>0, let mapValue = ldapResult[mapKey]  {\n                    shortName=mapValue\n                }\n\n\n                var groupsTemp = ldapResult[\"memberOf\"]\n                let userEmail = ldapResult[\"mail\"] ?? \"\"\n                let UPN = ldapResult[\"userPrincipalName\"] ?? \"\"\n                let dn = ldapResult[\"dn\"] ?? \"\"\n                let cn = ldapResult[\"cn\"] ?? \"\"\n                let pso = ldapResult[\"msDS-ResultantPSO\"] ?? \"\"\n                let ntName = ldapResult[\"msDS-PrincipalName\"] ?? \"\"\n                \n                var customAttributeResults : [String:Any]?\n                \n                if customAttributes?.count ?? 0 > 0 {\n                    var tempCustomAttr = [String:Any]()\n                    for key in customAttributes! {\n                        tempCustomAttr[key] = ldapResult[key] ?? \"\"\n                    }\n                    customAttributeResults = tempCustomAttr\n                }\n                \n                if ldapResult.count == 0 {\n                    // we didn't get a result\n                }\n                \n                lookupRecursiveGroups(dn, &groupsTemp)\n                \n                if (passwordSetDate != \"\") && (passwordSetDate != nil ) {\n                    tempPasswordSetDate = NSDate(timeIntervalSince1970: (Double(passwordSetDate!)!)/10000000-11644473600) as Date\n                }\n                parseExpirationDate(computedExpireDateRaw, &passwordAging, &userPasswordExpireDate, userPasswordUACFlag, &serverPasswordExpirationDefault, tempPasswordSetDate)\n                \n                cleanGroups(groupsTemp, &groups)\n                \n                // clean up the home\n                \n                userHome = userHomeTemp.replacingOccurrences(of: \"\\\\\", with: \"/\")\n                userHome = userHome.replacingOccurrences(of: \" \", with: \"%20\")\n                \n                // pack up user record\n                TCSLogWithMark(\"userDisplayName: \\(userDisplayName)\")\n                TCSLogWithMark(\"ldifResult: \\(ldifResult.debugDescription)\")\n                userRecord = ADUserRecord(userPrincipal: userPrincipal,firstName: firstName, lastName: lastName, fullName: userDisplayName, shortName: shortName, upn: UPN, email: userEmail, groups: groups, homeDirectory: userHome, passwordSet: tempPasswordSetDate, passwordExpire: userPasswordExpireDate, uacFlags: Int(userPasswordUACFlag), passwordAging: passwordAging, computedExireDate: userPasswordExpireDate, updatedLast: Date(), domain: domain, cn: cn, pso: pso, passwordLength: getComplexity(pso: pso), ntName: ntName, customAttributes: customAttributeResults, rawAttributes: ldifResult.first)\n\n            } else {\n                myLogger.logit(.base, message: \"Unable to find user.\")\n            }\n            \n        } else {\n            \n            let attributes = [ \"homeDirectory\", \"displayName\", \"memberOf\", \"mail\", \"uid\"] // passwordSetDate, computedExpireDateRaw, userPasswordUACFlag, userHomeTemp, userDisplayName, groupTemp\n            // \"maxPwdAge\" // passwordExpirationLength\n            \n            let searchTerm = \"uid=\" + userPrincipalShort\n            \n            extractedFunc(attributes, searchTerm)\n        }\n        \n        // pack up the user record\n        return true\n    }\n    \n    // MARK: LDAP cleanup functions\n    \n    fileprivate func cleanLDIF(_ ldif: String) -> [[String:String]] {\n        //var myResult = [[String:String]]()\n        \n        var ldifLines: [String] = ldif.components(separatedBy: CharacterSet.newlines)\n        \n        var records = [[String:String]]()\n        var record = [String:String]()\n        var attributes = Set<String>()\n        \n        for var i in 0..<ldifLines.count {\n            // save current lineIndex\n            let lineIndex = i\n            ldifLines[lineIndex] = ldifLines[lineIndex].trim()\n            \n            // skip version\n            if i == 0 && ldifLines[lineIndex].hasPrefix(\"version\") {\n                continue\n            }\n            \n            if !ldifLines[lineIndex].isEmpty {\n                // fold lines\n                \n                while i+1 < ldifLines.count && ldifLines[i+1].hasPrefix(\" \") {\n                    ldifLines[lineIndex] += ldifLines[i+1].trim()\n                    i += 1\n                }\n            } else {\n                // end of record\n                if (record.count > 0) {\n                    records.append(record)\n                }\n                record = [String:String]()\n            }\n            \n            // skip comment\n            if ldifLines[lineIndex].hasPrefix(\"#\") {\n                continue\n            }\n\n            let attribute = ldifLines[lineIndex].split(separator: \":\", maxSplits: 1, omittingEmptySubsequences: false).map(String.init)\n            if attribute.count == 2 {\n                \n                // Get the attribute name (before ;),\n                // then add to attributes array if it doesn't exist.\n                var attributeName = attribute[0].trim()\n                if let index = attributeName.firstIndex(of: \";\") {\n                    attributeName = String(attributeName[..<index])\n                }\n                if !attributes.contains(attributeName) {\n                    attributes.insert(attributeName)\n                }\n                \n                // Get the attribute value.\n                // Check if it is a URL (<), or base64 string (:)\n                var attributeValue = attribute[1].trim()\n                // If\n                if attributeValue.hasPrefix(\"<\") {\n                    // url\n                    attributeValue = attributeValue.substring(from: attributeValue.index(after: attributeValue.startIndex)).trim()\n                } else if attributeValue.hasPrefix(\":\") {\n                    // base64\n                    let tempAttributeValue = attributeValue.substring(from: attributeValue.index(after: attributeValue.startIndex)).trim()\n                    if (Data(base64Encoded: tempAttributeValue, options: NSData.Base64DecodingOptions.init(rawValue: 0)) != nil) {\n                        //attributeValue = tempAttributeValue\n                        \n                        attributeValue = String.init(data: Data.init(base64Encoded: tempAttributeValue)!, encoding: String.Encoding.utf8) ?? \"\"\n                    } else {\n                        attributeValue = \"\"\n                    }\n                }\n                \n                // escape double quote\n                attributeValue = attributeValue.replacingOccurrences(of: \"\\\"\", with: \"\\\"\\\"\")\n                \n                // save attribute value or append it to the existing\n                if let val = record[attributeName] {\n                    //record[attributeName] = \"\\\"\" + val.substringWithRange(Range<String.Index>(start: val.startIndex.successor(), end: val.endIndex.predecessor())) + \";\" + attributeValue + \"\\\"\"\n                    record[attributeName] = val + \";\" + attributeValue\n                } else {\n                    record[attributeName] = attributeValue\n                }\n            }\n        }\n        // save last record\n        if record.count > 0 {\n            records.append(record)\n        }\n        \n        return records\n    }\n    \n    fileprivate func getAttributeForSingleRecordFromCleanedLDIF(_ attribute: String, ldif: [[String:String]]) -> String {\n        var result: String = \"\"\n        \n        var foundAttribute = false\n        \n        for record in ldif {\n            for (key, value) in record {\n                if attribute == key {\n                    foundAttribute = true\n                    result = value\n                    break;\n                }\n            }\n            if (foundAttribute == true) {\n                break;\n            }\n        }\n        return result\n    }\n    \n    fileprivate func getAttributesForSingleRecordFromCleanedLDIF(_ attributes: [String], ldif: [[String:String]]) -> [String:String] {\n        var results = [String: String]()\n        \n        var foundAttribute = false\n        for record in ldif {\n            for (key, value) in record {\n                if attributes.contains(key) {\n                    foundAttribute = true\n                    results[key] = value\n                }\n            }\n            if (foundAttribute == true) {\n                break;\n            }\n        }\n        return results\n    }\n    \n    fileprivate func cleanLDAPResultsMultiple(_ result: String, attribute: String) -> String {\n        let lines = result.components(separatedBy: \"\\n\")\n        \n        var myResult = \"\"\n        \n        for i in lines {\n            if (i.contains(attribute)) {\n                if myResult == \"\" {\n                    myResult = i.replacingOccurrences( of: attribute + \": \", with: \"\")\n                } else {\n                    myResult = myResult + (\", \" + i.replacingOccurrences( of: attribute + \": \", with: \"\"))\n                }\n            }\n        }\n        return myResult\n    }\n    \n    // private function that uses netcat to create a socket connection to the LDAP server to see if it's reachable.\n    // using ldapsearch for this can take a long time to timeout, this returns much quicker\n    \n    fileprivate func testSocket( _ host: String ) -> Bool {\n        \n        let mySocketResult = cliTask(\"/usr/bin/nc -G 5 -z \" + host + \" \" + String(port))\n        if mySocketResult.contains(\"succeeded!\") {\n            return true\n        } else {\n            return false\n        }\n    }\n    \n    // private function to test for an LDAP defaultNamingContext from the LDAP server\n    // this tests for LDAP connectivity and gets the default naming context at the same time\n    \n    fileprivate func testLDAP ( _ host: String ) -> Bool {\n        \n        var attribute = \"defaultNamingContext\"\n        \n        // if socket test works, then attempt ldapsearch to get default naming context\n        \n        if ldaptype == .OD {\n            attribute = \"namingContexts\"\n        }\n        \n        // TODO\n        //swapPrincipals(false)\n        \n        var myLDAPResult = \"\"\n        \n        if anonymous {\n            myLDAPResult = cliTask(\"/usr/bin/ldapsearch -N -LLL -x \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + host + \" \" + attribute)\n        } else {\n            myLDAPResult = cliTask(\"/usr/bin/ldapsearch -N -LLL -Q \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + host + \" \" + attribute)\n        }\n        \n        // TODO\n        //swapPrincipals(true)\n        \n        if myLDAPResult != \"\" && !myLDAPResult.contains(\"GSSAPI Error\") && !myLDAPResult.contains(\"Can't contact\") {\n            let ldifResult = cleanLDIF(myLDAPResult)\n            if ( ldifResult.count > 0 ) {\n                defaultNamingContext = getAttributeForSingleRecordFromCleanedLDIF(attribute, ldif: ldifResult)\n                return true\n            }\n        }\n        return false\n    }\n\n    // MARK: Kerberos preference file needs to be updated:\n    // This function builds new Kerb prefs with KDC included if possible\n\n    private func checkKpasswdServer() -> Bool {\n        if hosts.isEmpty {\n            TCSLogWithMark(\"Make sure we have LDAP servers\")\n            getHosts(domain)\n        }\n\n        TCSLogWithMark(\"Searching for kerberos srv records\")\n\n        let myKpasswdServers = getSRVRecords(domain, srv_type: \"_kpasswd._tcp.\")\n        TCSLogWithMark(\"New kpasswd Servers are: \" + myKpasswdServers.description)\n        TCSLogWithMark(\"Current Server is: \" + currentServer)\n\n        if myKpasswdServers.contains(currentServer) {\n            TCSLogWithMark(\"Found kpasswd server that matches current LDAP server.\")\n            TCSLogWithMark(\"Attempting to set kpasswd server to ensure Kerberos and LDAP are in sync.\")\n\n            // get the defaults for com.apple.Kerberos\n            let kerbPrefs = UserDefaults.init(suiteName: \"com.apple.Kerberos\")\n\n            // get the list defaults, or create an empty dictionary if there are none\n            let kerbDefaults = kerbPrefs?.dictionary(forKey: \"libdefaults\") ?? [String:AnyObject]()\n\n            // test to see if the domain_defaults key already exists, if not build it\n            if kerbDefaults[\"default_realm\"] != nil {\n                TCSLogWithMark(\"Existing default realm. Skipping adding default realm to Kerberos prefs.\")\n            } else {\n                // build a dictionary and add the KDC into it then write it back to defaults\n                let libDefaults = NSMutableDictionary()\n                libDefaults.setValue(kerberosRealm, forKey: \"default_realm\")\n                kerbPrefs?.set(libDefaults, forKey: \"libdefaults\")\n            }\n\n            // get the list of domains, or create an empty dictionary if there are none\n            var kerbRealms = kerbPrefs?.dictionary(forKey: \"realms\")  ?? [String:AnyObject]()\n\n            // test to see if the realm already exists, if not build it\n            if kerbRealms[kerberosRealm] != nil {\n                TCSLogWithMark(\"Existing Kerberos configuration for realm. Skipping adding KDC to Kerberos prefs.\")\n                return false\n            } else {\n                // build a dictionary and add the KDC into it then write it back to defaults\n                let realm = NSMutableDictionary()\n                //realm.setValue(myLDAPServers.currentServer, forKey: \"kdc\")\n                realm.setValue(currentServer, forKey: \"kpasswd_server\")\n                kerbRealms[kerberosRealm] = realm\n                kerbPrefs?.set(kerbRealms, forKey: \"realms\")\n                return true\n            }\n        } else {\n            myLogger.logit(LogLevel.base, message: \"Couldn't find kpasswd server that matches current LDAP server. Letting system chose.\")\n            return false\n        }\n    }\n\n    // calculate password complexity\n    \n    fileprivate func getComplexity(pso: String=\"\") -> Int? {\n        \n        if pso == \"\" {\n            // no PSO for the user, get domain default\n            \n            let result = try? getLDAPInformation([ \"minPwdLength\"], baseSearch: true, searchTerm: \"\", test: true, overrideDefaultNamingContext: false)\n            \n            if result == nil {\n                return nil\n            }\n            \n            let resultClean = getAttributesForSingleRecordFromCleanedLDIF([ \"minPwdLength\"], ldif: result!)\n            \n            let final = resultClean[ \"minPwdLength\"] ?? \"\"\n            \n            if final == \"\" {\n                return nil\n            } else {\n                return Int(final)\n            }\n        } else {\n            // go get the pso\n            \n            let tempDefault = defaultNamingContext\n            \n            defaultNamingContext = pso\n            \n            let result = try? getLDAPInformation([\"msDS-MinimumPasswordLength\"], baseSearch: false, searchTerm: \"(objectClass=msDS-PasswordSettings)\")\n            // set the default naming context back\n            \n            defaultNamingContext = tempDefault\n            \n            if result == nil {\n                return nil\n            }\n            \n            let resultClean = getAttributesForSingleRecordFromCleanedLDIF([ \"msDS-MinimumPasswordLength\"], ldif: result!)\n            let final = resultClean[\"msDS-MinimumPasswordLength\"] ?? \"\"\n            \n            if final == \"\" {\n                return nil\n            } else {\n                return Int(final)\n            }\n        }\n    }\n\n    // Remove a default realm from the Kerb pref file\n\n    fileprivate func cleanKerbPrefs(clearLibDefaults: Bool=false) {\n\n        // get the defaults for com.apple.Kerberos\n\n        let kerbPrefs = UserDefaults.init(suiteName: \"com.apple.Kerberos\")\n\n        // get the list of domains, or create an empty dictionary if there are none\n\n        var kerbRealms = kerbPrefs?.dictionary(forKey: \"realms\")  ?? [String:AnyObject]()\n\n        // test to see if the realm already exists, if it's already gone we are good\n\n        if kerbRealms[kerberosRealm] == nil {\n            TCSLogWithMark(\"No realm in com.apple.Kerberos defaults.\")\n        } else {\n            TCSLogWithMark(\"Removing realm from Kerberos Preferences.\")\n            // remove the realm from the realms list\n            kerbRealms.removeValue(forKey: kerberosRealm)\n            // save the dictionary back to the pref file\n            kerbPrefs?.set(kerbRealms, forKey: \"realms\")\n\n            if clearLibDefaults {\n                var libDefaults = kerbPrefs?.dictionary(forKey: \"libdefaults\")  ?? [String:AnyObject]()\n                libDefaults.removeValue(forKey: \"default_realm\")\n                kerbPrefs?.set(libDefaults, forKey: \"libdefaults\")\n            }\n        }\n    }\n\n\n}\n@available(macOS, deprecated: 11)\nextension NoMADSession: NoMADUserSession {\n\n    public func getKerberosTicket(principal: String? = nil, completion: @escaping (KerberosTicketResult) -> Void) {\n        // Check if system already has tickets\n        if let principal = principal, klistUtil.hasTickets(principal: principal) {\n            shareKerberosResult(completion: completion)\n            return\n        }\n\n        KerbUtil().getKerberosCredentials(userPass, userPrincipal) {  errorDict in\n            self.userPass = \"\"\n            if let errorDict = errorDict {\n                self.state = .kerbError\n                let sessionError: NoMADSessionError\n\n                let errorValue = errorDict[\"NSDescription\"] as? String ?? \"Unknown error\"\n\n                switch errorValue {\n                case NoMADSessionError.PasswordExpired.rawValue:\n                    sessionError = .PasswordExpired\n                case NoMADSessionError.wrongRealm.rawValue:\n                    sessionError = .wrongRealm\n                case _ where errorValue.contains(\"unable to reach any KDC in realm\"):\n                    sessionError = .OffDomain\n                default:\n                    sessionError = .KerbError\n                }\n                completion(.failure(sessionError))\n            } else {\n                self.processKerberosResult(completion: completion)\n            }\n        }\n    }\n\n    private func processKerberosResult(completion: @escaping (KerberosTicketResult) -> Void) {\n        state = .offDomain\n\n        // Get ticket\n        klistUtil.klist()\n\n        // Check that ticket is valid\n        if !klistUtil.returnDefaultPrincipal().contains(kerberosRealm) && !anonymous {\n            completion(.failure(.UnAuthenticated))\n            return\n        }\n\n        if useSSL {\n            URIPrefix = \"ldaps://\"\n            port = 636\n            maxSSF = \"-O maxssf=0 \"\n        }\n\n        if let server = siteManager.sites[domain] {\n            // use existing server\n            hosts = server\n            state = .success\n        } else {\n            getHosts(domain)\n            guard !hosts.isEmpty else {\n                completion(.failure(.OffDomain))\n                return\n            }\n            // write found server back to site manager\n            siteManager.sites[domain] = hosts\n\n            // LDAP Ping to find the correct site\n            if ldaptype == .AD {\n                findSite()\n                guard state == .success else {\n                    completion(.failure(.SiteError))\n                    return\n                }\n            }\n        }\n        testHosts()\n        shareKerberosResult(completion: completion)\n    }\n\n    private func shareKerberosResult(completion: (KerberosTicketResult) -> Void) {\n        let result: KerberosTicketResult\n        if let userRecord = userRecord {\n            result = .success(userRecord)\n        } else {\n            result = .failure(.KerbError)\n        }\n        completion(result)\n    }\n\n    /// Function to authenticate a user via Kerberos. If only looking to test the password, and not get a ticket, pass (authTestOnly: true).\n    ///\n    /// Note this will kill any pre-existing tickets for this user as well.\n    ///\n    /// - Parameter authTestOnly: Should this authentication attempt only validate the password without getting Kerberos tickets? Defaults to `false`.\n    public func authenticate(authTestOnly: Bool = false) {\n        // authenticate\n        let kerbUtil = KerbUtil()\n//        let kerbError = kerbUtil.getKerbCredentials(userPass, userPrincipal)\n\n        kerbUtil.getKerberosCredentials(userPass, userPrincipal) { errorDict in\n            // scrub the password field\n            self.userPass = \"\"\n\n            if let errorDict = errorDict as? Dictionary<String,Any>,\n               let description = errorDict[GSSErrorKey.descriptionKey.rawValue] as? String,\n               let majorErrorCode = errorDict[GSSErrorKey.majorErrorCodeKey.rawValue] as? Int,\n               let minorErrorCode = errorDict[GSSErrorKey.minorErrorCodeKey.rawValue] as? NSNumber,\n               let mechanism = errorDict[GSSErrorKey.mechanismKey.rawValue] as? String,\n               let mechanismOID = errorDict[GSSErrorKey.mechanismOIDKey.rawValue] as? String\n\n            {\n                let error = GSSError(mechanism: mechanism, mechanismOID: mechanismOID, majorErrorCode: majorErrorCode, minorErrorCode: UInt(UInt32(truncating:minorErrorCode)), description: description)\n\n                // error\n                self.state = .kerbError\n\n                switch error.description {\n                case \"Password has expired\" :\n                    self.delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.PasswordExpired, description: error.description)\n                    break\n                case \"Wrong realm\" :\n                    self.delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.wrongRealm, description: error.description)\n                    break\n                case _ where error.description.range(of: \"unable to reach any KDC in realm\") != nil :\n                    self.delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.OffDomain, description: error.description)\n                    break\n                default:\n                    //user not found\n                    if error.majorErrorCode == 0x0D0000, error.minorErrorCode == 0x96C73A06, mechanismOID == \"1 2 840 113554 1 2 2\" {\n                        self.delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.UnknownPrincipal, description: error.description)\n\n                        return\n                    }\n                    //other error\n                    self.delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.KerbError, description: error.description)\n                }\n            } else {\n                if authTestOnly {\n                    klistUtil.kdestroy(princ: self.userPrincipal)\n                }\n                self.delegate?.NoMADAuthenticationSucceeded()\n            }\n        }\n\n    }\n\n    /// Change the password for the current user session via closure\n//    public func changePassword(oldPassword: String, newPassword: String, completion: @escaping (String?) -> Void) {\n//        TCSLogWithMark(\"Change Kerberos password\")\n//        KerbUtil().changeKerberosPassword(oldPassword, newPassword, userPrincipal) {\n//            if let errorValue = $0 {\n//                completion(errorValue)\n//            } else {\n//                completion(nil)\n//            }\n//        }\n//    }\n\n    /// Change the password for the current user session via delegate.\n    ///\n    public func changeKerberosPassword() throws {\n        // change user's password\n        // check kerb prefs - otherwise we can get an error here if not set\n        TCSLogWithMark(\"Checking kpassword server.\")\n\n        _ = checkKpasswdServer()\n\n        // set up the KerbUtil\n        TCSLogWithMark(\"Init KerbUtil.\")\n\n        let kerbUtil = KerbUtil()\n        TCSLogWithMark(\"Change password for userPrincipal: \\(userPrincipal)\")\n\n        try kerbUtil.changeKerberosPassword(oldPass, newPass, userPrincipal)\n\n\n        // If the password change worked then we are online. Reauthenticate with new password.\n        //should update keychain here if we are in userspace\n\n        self.oldPass = \"\"\n        self.newPass = \"\"\n\n\n        // clean the kerb prefs so we don't reuse the KDCs\n        self.cleanKerbPrefs()\n    }\n\n\n\n    public func userInfo() {\n        // set state to offDomain on start\n        state = .offDomain\n\n        // check for valid ticket\n        klistUtil.klist()\n        if !klistUtil.returnDefaultPrincipal().contains(kerberosRealm) && !anonymous {\n\n            // no ticket for realm\n            delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.UnAuthenticated, description: \"No ticket for Kerberos realm \\(kerberosRealm)\")\n            return\n        }\n\n        // now some setup\n        if useSSL {\n            URIPrefix = \"ldaps://\"\n            port = 636\n            maxSSF = \"-O maxssf=0 \"\n        }\n\n        var lookupSite = true\n\n        // check for connectivity and site\n        if let server = siteManager.sites[domain] {\n            // we have an existing server, let's use it\n            lookupSite = false\n            hosts = server\n        }\n\n        if lookupSite {\n            getHosts(domain)\n        } else {\n            state = .success\n        }\n\n        // if no LDAP servers, we're off the domain so bail\n        if hosts.count == 0 {\n            var errorMessage = \"No LDAP servers can be reached.\"\n            switch ldaptype {\n            case .AD: errorMessage = \"No AD Domain Controllers can be reached.\"\n            case .OD: errorMessage = \"No Open Directory servers can be reached.\"\n                //default: errorMessage = \"No LDAP servers can be reached.\"\n            }\n            delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.OffDomain, description: errorMessage)\n            return\n        }\n\n        // Now for the LDAP Ping to find the correct site\n        if ldaptype == .AD && lookupSite  {\n            findSite()\n            // check for errors\n            if state != .success {\n                delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.SiteError, description: \"Unable to determine correct site.\")\n                return\n            }\n        }\n\n        testHosts()\n        if lookupSite {\n            // write found server back to site manager\n            siteManager.sites[domain] = hosts\n        }\n\n        if getUserInformation()==false {\n            delegate?.NoMADAuthenticationFailed(error: NoMADSessionError.UnknownPrincipal, description: \"Invalid user account\")\n            return\n        }\n\n        // return the userRecord unless we came back empty\n        if userRecord != nil {\n            delegate?.NoMADUserInformation(user: userRecord!)\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension NoMADSession {\n    // MARK: - testHosts with completion functionality\n\n//    public func testHosts(completion: @escaping (Bool) -> Void) {\n//\n//        let dispatchGroup = DispatchGroup()\n//\n//        if state == .success {\n//            for i in 0...( hosts.count - 1) {\n//                dispatchGroup.enter()\n//                if hosts[i].status != \"dead\" {\n//                    myLogger.logit(.info, message:\"Trying host: \" + hosts[i].host)\n//\n//                    // socket test first - this could be falsely negative\n//                    // also note that this needs to return stderr\n//\n//                    let cliTaskString = \"/usr/bin/nc -G 5 -z \" + hosts[i].host + \" \" + String(port)\n//                    cliTask(cliTaskString) { result in\n//                        self.handleSocketResult(result: result, index: i) {\n//                            dispatchGroup.leave()\n//                        }\n//                    }\n//                }\n//            }\n//        } else {\n//            myLogger.logit(.base, message: \"status not success but \\(state) \\n\")\n//            completion(false)\n//        }\n//        dispatchGroup.notify(queue: DispatchQueue.global()) {\n//            myLogger.logit(.base, message: \"Notifying that testHost groups dispatchGroup has finished their tasks\")\n//            completion(self.assertDomainStatus(assertionHosts: self.hosts))\n//        }\n//    }\n\n    private func assertDomainStatus(assertionHosts: [NoMADLDAPServer]) -> Bool {\n        guard (assertionHosts.count > 0) else {\n            myLogger.logit(.base, message: \"no hosts\")\n            return false\n        }\n\n        if assertionHosts.last!.status == \"dead\" {\n            myLogger.logit(.base, message: \"All DCs in are dead! You should really fix this.\")\n            state = .offDomain\n            return false\n        } else {\n            myLogger.logit(.base, message: \"on domain!\")\n            state = .success\n            return true\n        }\n    }\n\n    private func handleSocketResult(result: String, index: Int, completion: @escaping () -> Void) {\n        if result.contains(\"succeeded!\") {\n\n            var attribute = \"defaultNamingContext\"\n\n            // if socket test works, then attempt ldapsearch to get default naming context\n\n            if ldaptype == .OD {\n                attribute = \"namingContexts\"\n            }\n\n            // TODO: THINK ABOUT THIS\n            //swapPrincipals(false)\n\n            if anonymous {\n                let anonymusCliTaskCommand = \"/usr/bin/ldapsearch -N -LLL -x \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + hosts[index].host + \" \" + String(port) + \" \" + attribute\n                cliTask(anonymusCliTaskCommand) { result in\n                    self.handleSocketResultInternalCliTasks(result: result, index: index, attribute: attribute)\n                    completion()\n                }\n            } else {\n                let nonanonymusCliTaskCommand = \"/usr/bin/ldapsearch -N -LLL -Q \" + maxSSF + \"-l 3 -s base -H \" + URIPrefix + hosts[index].host + \" \" + String(port) + \" \" + attribute\n                cliTask(nonanonymusCliTaskCommand) { result in\n                    self.handleSocketResultInternalCliTasks(result: result, index: index, attribute: attribute)\n                    completion()\n                }\n            }\n            return\n        } else {\n            myLogger.logit(.info, message:\"Server is dead by way of socket test: \" + hosts[index].host)\n            hosts[index].status = \"dead\"\n            hosts[index].timeStamp = Date()\n            completion()\n        }\n    }\n\n    private func handleSocketResultInternalCliTasks(result: String, index: Int, attribute: String) {\n        // TODO: THINK ABOUT THIS\n        //swapPrincipals(false)\n\n        if result != \"\" && !result.contains(\"GSSAPI Error\") && !result.contains(\"Can't contact\") {\n            let ldifResult = cleanLDIF(result)\n            if ( ldifResult.count > 0 ) {\n                defaultNamingContext = getAttributeForSingleRecordFromCleanedLDIF(attribute, ldif: ldifResult)\n                hosts[index].status = \"live\"\n                hosts[index].timeStamp = Date()\n                myLogger.logit(.base, message:\"Current LDAP Server is: \" + hosts[index].host )\n                myLogger.logit(.base, message:\"Current default naming context: \" + defaultNamingContext )\n                current = index\n                return\n            }\n        }\n        // We didn't get an actual LDIF Result... so LDAP isn't working.\n        myLogger.logit(.info, message:\"Server is dead by way of ldap test: \" + hosts[index].host)\n        hosts[index].status = \"dead\"\n        hosts[index].timeStamp = Date()\n    }\n}\n"
  },
  {
    "path": "NomadLogin/DS+AD.swift",
    "content": "//\n//  DS+AD.swift\n//  NoMADLoginAD\n//\n//  Created by Josh Wisenbaker on 9/20/18.\n//  Copyright © 2018 Orchard & Grove. All rights reserved.\n//\nimport OpenDirectory\n\nenum NoMADQueryErrors: Error {\n    case noMigrationCandidates\n}\n\n// MARK: - NoMAD extensions for the DSQueryable Protocol.\nextension DSQueryable {\n    /// Check to see if a given local user has the `kODAttributeOktaUser` set on their account.\n    ///\n    /// - Parameter shortName: The shortname of the user to check as a `String`.\n    /// - Returns: `true` if the user has an Okta attribute. Otherwise `false`.\n    /// - Throws: A `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error.\n    public func checkForNoMADUser(_ shortName: String) throws -> Bool {\n        os_log(\"Checking for AD username\", type: .default)\n        do {\n            let userRecord = try getLocalRecord(shortName)\n            \n            let names = try userRecord.values(forAttribute: kODAttributeADUser)\n            if names.isEmpty {\n                return false\n            }\n            return true\n        } catch DSQueryableErrors.notLocalUser {\n            return false\n        } catch {\n            throw error\n        }\n    }\n\n    /// Search in DSLocal and find any potential migration users.\n    ///\n    /// - Parameter excludeList: An optional `Array` of `String` values to exclude from the candidate list. These are typically set in the `.MigrateUsersHide` preference key.\n    /// - Returns: The shortnames of the users to offer for Okta migration in an `Array` of `String` values.\n    /// - Throws: A `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error. Throws `NoMADQueryErrors.noMigrationCandidates` if no results are found.\n    public func findNoMADMigrationCandidates(excludeList: [String] = [String]()) throws -> [String] {\n        do {\n            os_log(\"Checking for NoMAD migration users.\", type: .default)\n            var candidates = [String]()\n            os_log(\"Getting all user records.\", type: .default)\n            let records = try getAllNonSystemUsers()\n            os_log(\"Filtering records\", type: .default)\n            let filtered = try records.filter({ (record) -> Bool in\n                if excludeList.contains(record.recordName) {\n                    os_log(\"User is exluded\", type: .default)\n                    return false\n                }\n                if try checkForNoMADUser(record.recordName) {\n                    os_log(\"User has a NoMAD Attribute\", type: .default)\n                    return false\n                }\n                return true\n            })\n            for record in filtered {\n                candidates.append(record.recordName)\n            }\n            if candidates.isEmpty {\n                throw NoMADQueryErrors.noMigrationCandidates\n            }\n            return candidates\n        } catch {\n            throw error\n        }\n    }\n}\n"
  },
  {
    "path": "NomadLogin/DSQueryable.swift",
    "content": "//\n//  DSQueryable.swift\n//  NoMADLogin-AD\n//\n//  Created by Josh Wisenbaker on 8/20/18.\n//  Copyright © 2018 Orchard & Grove. All rights reserved.\n//\n\nimport OpenDirectory\n\nenum DSQueryableResults {\n    case localUser\n}\n\nenum DSQueryableErrors: Error {\n    case notLocalUser\n    case multipleUsersFound\n}\n\n/// The `DSQueryable` protocol allows adopters to easily search and manipulate the DSLocal node of macOS.\npublic protocol DSQueryable {}\n\n// MARK: - Implimentations for DSQuerable protocol\npublic extension DSQueryable {\n\n    /// `ODNode` to DSLocal for queries and account manipulation.\n    var localNode: ODNode? {\n        do {\n            os_log(\"Finding the DSLocal node\", type: .debug)\n            return try ODNode.init(session: ODSession.default(), type: ODNodeType(kODNodeTypeLocalNodes))\n        } catch {\n            os_log(\"ODError creating local node.\", type: .error, error.localizedDescription)\n            return nil\n        }\n    }\n\n    /// Conviennce function to discover if a shortname has an existing local account.\n    ///\n    /// - Parameter shortName: The name of the user to search for as a `String`.\n    /// - Returns: `true` if the user exists in DSLocal, `false` if not.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error or the user is not local.\n    func isUserLocal(_ shortName: String) throws -> Bool {\n        do {\n            _ = try getLocalRecord(shortName)\n        } catch DSQueryableErrors.notLocalUser {\n            return false\n        } catch {\n            throw error\n        }\n        return true\n    }\n\n    /// Checks a local username and password to see if they are valid.\n    ///\n    /// - Parameters:\n    ///   - userName: The name of the user to search for as a `String`.\n    ///   - userPass: The password for the user being tested as a `String`.\n    /// - Returns: `true` if the name and password combo are valid locally. `false` if the validation fails.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error.\n    func isLocalPasswordValid(userName: String, userPass: String) throws -> Bool {\n        do {\n            let userRecord = try getLocalRecord(userName)\n            try userRecord.verifyPassword(userPass)\n        } catch {\n            let castError = error as NSError\n            switch castError.code {\n            case Int(kODErrorCredentialsInvalid.rawValue):\n                os_log(\"Tested password for user account: %{public}@ is not valid.\", type: .default, userName)\n                return false\n            default:\n                throw error\n            }\n        }\n        return true\n    }\n\n\n    /// Searches DSLocal for an account short name and returns the `ODRecord` for the group if found.\n    ///\n    /// - Parameter name: The name of the group to search for as a `String`.\n    /// - Returns: The `ODRecord` of the group if one is found in DSLocal.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error or the user is not local.\n    func getLocalGroupRecord(_ name: String) throws -> ODRecord {\n        do {\n            os_log(\"Building OD query for name %{public}@\", type: .default, name)\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeGroups,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: name,\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 1)\n            let records = try query.resultsAllowingPartial(false) as! [ODRecord]\n\n            if records.count > 1 {\n                os_log(\"More than one local group found for name.\", type: .default)\n                throw DSQueryableErrors.multipleUsersFound\n            }\n            guard let record = records.first else {\n                os_log(\"No local group found.\", type: .default)\n                throw DSQueryableErrors.notLocalUser\n            }\n//            os_log(\"Found local user: %{public}@\", record)\n            return record\n        } catch {\n            os_log(\"ODError while trying to check for local user: %{public}@\", type: .error, error.localizedDescription)\n            throw error\n        }\n    }\n\n\n    /// Searches DSLocal for an account short name and returns the `ODRecord` for the user if found.\n    ///\n    /// - Parameter shortName: The name of the user to search for as a `String`.\n    /// - Returns: The `ODRecord` of the user if one is found in DSLocal.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error or the user is not local.\n    func getLocalRecord(_ shortName: String) throws -> ODRecord {\n        do {\n            os_log(\"Building OD query for name %{public}@\", type: .default, shortName)\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: shortName,\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 0)\n            let records = try query.resultsAllowingPartial(false) as! [ODRecord]\n\n            if records.count > 1 {\n                os_log(\"More than one local user found for name.\", type: .default)\n                throw DSQueryableErrors.multipleUsersFound\n            }\n            guard let record = records.first else {\n                os_log(\"No local user found.\", type: .default)\n                throw DSQueryableErrors.notLocalUser\n            }\n//            os_log(\"Found local user: %{public}@\", record)\n            return record\n        } catch {\n            os_log(\"ODError while trying to check for local user: %{public}@\", type: .error, error.localizedDescription)\n            throw error\n        }\n    }\n\n    /// Finds all local user records on the Mac.\n    ///\n    /// - Returns: A `Array` that contains the `ODRecord` for every account in DSLocal.\n    /// - Throws: An error from `ODFrameworkErrors` if something fails.\n    func getAllLocalUserRecords() throws -> [ODRecord] {\n        do {\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: kODMatchAny,\n                                         returnAttributes: kODAttributeTypeAllAttributes,\n                                         maximumResults: 0)\n            return try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            os_log(\"ODError while finding local users.\", type: .error)\n            throw error\n        }\n    }\n    /// Finds OIDC User with specified iss and sub.\n    ///\n    /// - Returns: A `Array` that contains the `ODRecord` for  account in DSLocal\n    /// - Throws: An error from `ODFrameworkErrors` if something fails.\n    func getUserRecord(sub:String, iss:String) throws -> ODRecord {\n        do {\n            os_log(\"getting non system users.\", type: .info)\n\n            let allRecords = try getAllNonSystemUsers()\n            os_log(\"filtering\", type: .info)\n\n            let matchingRecords = allRecords.filter { (record) -> Bool in\n                guard let issValue = try? record.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_iss\") as? [String] else {\n                    return false\n                }\n                guard let subValue = try? record.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_sub\") as? [String] else {\n                    return false\n                }\n\n                os_log(\"checking \\(issValue) \\(subValue)\", type: .info)\n\n                return issValue.first == iss && subValue.first == sub\n            }\n            guard let userRecord = matchingRecords.first else {\n                os_log(\"no users match iss \\(iss) and sub \\(sub)\", type: .info)\n\n                throw DSQueryableErrors.notLocalUser\n            }\n            return userRecord\n        } catch {\n            os_log(\"ODError while finding local users.\", type: .error)\n            throw error\n        }\n    }\n    func getUserRecord(kerberosPrincipalNameToFind:String) throws -> ODRecord {\n        do {\n            os_log(\"getting non system users.\", type: .info)\n\n            let allRecords = try getAllNonSystemUsers()\n            os_log(\"filtering\", type: .info)\n\n            let matchingRecords = allRecords.filter { (record) -> Bool in\n                guard let foundKerberosPrincipal = try? record.values(forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? [String] else {\n                    return false\n                }\n\n                os_log(\"checking \\(foundKerberosPrincipal)\", type: .info)\n\n                return foundKerberosPrincipal.first == kerberosPrincipalNameToFind\n            }\n            guard let userRecord = matchingRecords.first else {\n                TCSLogWithMark(\"no users match \\(kerberosPrincipalNameToFind)\")\n\n                throw DSQueryableErrors.notLocalUser\n            }\n            return userRecord\n        } catch {\n            os_log(\"ODError while finding local users.\", type: .error)\n            throw error\n        }\n    }\n\n    /// Returns all the non-system users on a system above UID 500.\n    ///\n    /// - Returns: A `Array` that contains the `ODRecord` of all the non-system user accounts in DSLocal.\n    /// - Throws: An error from `ODFrameworkErrors` if something fails.\n    ///\n    func getAllNonSystemUsers() throws -> [ODRecord] {\n        do {\n            let allRecords = try getAllLocalUserRecords()\n            let nonSystem = try allRecords.filter { (record) -> Bool in\n                guard let uid = try record.values(forAttribute: kODAttributeTypeUniqueID) as? [String] else {\n                    return false\n                }\n                return Int(uid.first ?? \"\") ?? 0 > 500 && record.recordName.first != \"_\"\n            }\n            return nonSystem\n        } catch {\n            os_log(\"ODError while finding local users.\", type: .error)\n            throw error\n        }\n    }\n    func userWithUID(uid:String) throws -> [ODRecord] {\n        do {\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeUniqueID,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: uid,\n                                         returnAttributes: kODAttributeTypeAllAttributes,\n                                         maximumResults: 0)\n            return try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            os_log(\"ODError while user with \\(uid).\", type: .error)\n            throw error\n        }\n\n    }\n    func isAdmin(_ user:ODRecord) -> Bool {\n        let adminGroup = try? getLocalGroupRecord(\"admin\")\n        do{\n            if let adminGroup = adminGroup {\n                try adminGroup.isMemberRecord(user)\n                return true\n            }\n        }\n        catch {\n        }\n        return false\n\n    }\n\n    func makeAdmin(_ user:ODRecord) -> Bool {\n        do {\n            os_log(\"Find the administrators group\",  type: .debug)\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeGroups,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: \"admin\",\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 1)\n            let results = try query.resultsAllowingPartial(false) as! [ODRecord]\n            let adminGroup = results.first\n\n            os_log(\"Adding user to administrators group\", type: .debug)\n            \n            try adminGroup?.addMemberRecord(user)\n            try? user.setValue(\"1\", forAttribute: \"dsAttrTypeNative:_xcreds_promoted_to_admin\")\n\n\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"Unable to add user to administrators group: %{public}@\", type: .error, errorText)\n            return false\n        }\n        return true\n    }\n    func removeAdmin(_ user:ODRecord) -> Bool {\n        do {\n            if try getAllAdminUsers().count<2 {\n                TCSLogError(\"Will not remove last admin!!\")\n                return false\n            }\n\n        }\n        catch {\n            TCSLogErrorWithMark(\"Error when getting all admin users\")\n            return false\n        }\n        if isAdmin(user)==false { //user is not an admin already\n            return true\n        }\n        do {\n            os_log(\"Find the administrators group\",  type: .debug)\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeGroups,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: \"admin\",\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 1)\n            let results = try query.resultsAllowingPartial(false) as! [ODRecord]\n            let adminGroup = results.first\n\n            os_log(\"Remove user to administrators group\", type: .debug)\n            try adminGroup?.removeMemberRecord(user)\n\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"Unable to add user to administrators group: %{public}@\", type: .error, errorText)\n            return false\n        }\n        return true\n    }\n    func getAllStandardUsers() throws -> [ODRecord] {\n            let allRecords = try getAllNonSystemUsers()\n            let nonSystem = allRecords.filter { (record) -> Bool in\n\n\n                let adminGroup = try? getLocalGroupRecord(\"admin\")\n\n                do{\n\n                    if let adminGroup = adminGroup {\n                        try adminGroup.isMemberRecord(record)\n                        return false\n                    }\n                }\n                catch {\n\n                }\n\n                return true\n            }\n        return nonSystem\n    }\n    func getAllAdminUsers() throws -> [ODRecord] {\n            let allRecords = try getAllNonSystemUsers()\n            let nonSystemAdminUsers = try allRecords.filter { (record) -> Bool in\n                let adminGroup = try? getLocalGroupRecord(\"admin\")\n                do{\n\n                    if let adminGroup = adminGroup {\n                        try adminGroup.isMemberRecord(record)\n                        return true\n                    }\n                }\n                catch {\n                    TCSLog(\"error when looking for admin group membership\")\n                    throw error\n                }\n\n                return true\n            }\n        return nonSystemAdminUsers\n    }\n    // OD utils\n\n    func checkUIDandHome(name: String) -> (uid_t?, String?) {\n        os_log(\"Checking for local username\", log: noLoMechlog, type: .debug)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeNativeOnly, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            _ = error.localizedDescription\n            //            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return (nil, nil)\n        }\n\n        if records.count > 1 {\n            TCSLogErrorWithMark(\"More than one record. \")\n        }\n        do {\n            let home = try records.first?.values(forAttribute: kODAttributeTypeNFSHomeDirectory) as? [String] ?? nil\n            let uid = try records.first?.values(forAttribute: kODAttributeTypeUniqueID) as? [String] ?? nil\n\n            let uidt = uid_t.init(Double.init((uid?.first) ?? \"0\")! )\n            return ( uidt, home?.first ?? nil)\n        } catch {\n            TCSLogErrorWithMark(\"Unable to get home.\")\n            return (nil, nil)\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "NomadLogin/LocalCheckAndMigrate.swift",
    "content": "//\n//  LocalCheckAndMigrate.swift\n//  JamfConnectLogin\n//\n//  Created by Joel Rennich on 2/19/19.\n//  Copyright © 2019 Jamf Inc. All rights reserved.\n//\n\nimport Foundation\nimport OpenDirectory\n\nenum MigrationType {\n    case errorSkipMigration(String) // unable to complete migration\n    case fullMigration // perform full migration\n    case skipMigration // no need to migrate\n    case syncPassword // local password needs to be synced with local\n//    case mappedUserFound(ODRecord)\n    case userMatchSkipMigration\n    case complete // all good\n}\n\n// class to handle local checks and migration\n\nclass LocalCheckAndMigrate : NSObject, DSQueryable {\n    \n    var mech: MechanismRecord?\n    var delegate: XCredsMechanismProtocol?\n\n    private var user = \"\"\n    private var pass = \"\"\n    \n    public var migrationUsers: [String]?\n    var isInUserSpace = false\n\n    func migrationTypeRequired(userToCheck: String, passToCheck: String, kerberosPrincipalName:String?) -> MigrationType {\n\n        TCSLogWithMark()\n        user = userToCheck\n        pass = passToCheck\n        var user = userToCheck\n\n        //if we are in userspace, use the console user. If there not and there is a mapped user acccount with a kerb pricipal name in the DS record, use that. Otherwise, just keep on with the user passed in.\n        if isInUserSpace == true {\n            let consoleUser = getConsoleUser()\n            user=consoleUser\n        }\n\n        else\n        {\n            if let kerberosPrincipalName = kerberosPrincipalName, let foundRecord = try? getUserRecord(kerberosPrincipalNameToFind: kerberosPrincipalName) {\n                user = foundRecord.recordName\n            }\n        }\n        let shouldPromptToMigrate = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldPromptForMigration.rawValue)\n\n        // check local user pass to see if user exists\n        \n        do {\n            if try isLocalPasswordValid(userName: user, userPass: passToCheck) {\n\n                TCSLogWithMark(\"Network creds match local creds, nothing to migrate or update.\")\n                return .userMatchSkipMigration\n\n            } else {\n                \n                TCSLogWithMark(\"Local name matches, but not password\")\n                \n                if DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminUserName.rawValue) != nil &&\n                    DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminPassword.rawValue) != nil &&\n                    getManagedPreference(key: .PasswordOverwriteSilent) as? Bool ?? false  && isInUserSpace == false {\n                    TCSLogWithMark(\"Set to write keychain silently and we have admin. Skipping.\")\n                    TCSLogWithMark(\"Setting password to be overwritten.\")\n                    delegate?.setHint(type: .passwordOverwrite, hint: true as NSSecureCoding)\n                    TCSLogWithMark(\"Hint set\")\n                    return .complete\n                } else {\n                    TCSLogWithMark(\"setting to sync password\")\n                    return .syncPassword\n                }\n            }\n        } catch DSQueryableErrors.notLocalUser {\n            TCSLogWithMark(\"User is not a local user\")\n            \n            if shouldPromptToMigrate == false {\n                return .complete\n            }\n\n            TCSLogWithMark(\"prompting to migrate set. checking for local accounts as candidates\")\n            //                getMigrationCandidates()\n            let standardUsers = try? getAllLocalUserRecords()\n            guard let standardUsers = standardUsers, standardUsers.count>0 else {\n                return .skipMigration\n            }\n            return .fullMigration\n\n        } catch {\n            TCSLogWithMark(\"Unknown migration check error. skipping migration:\\(error.localizedDescription)\")\n            return .errorSkipMigration(error.localizedDescription)\n        }\n    }\n    \n    fileprivate func getMigrationCandidates() {\n        do {\n            if let hiddenMigrationUsers = getManagedPreference(key: .MigrateUsersHide) as? [String]  {\n                migrationUsers = try findNoMADMigrationCandidates(excludeList: hiddenMigrationUsers)\n            } else {\n                //os_log(\"No users are hidden from migration.\", log: uiLog, type: .default)\n                migrationUsers = try findNoMADMigrationCandidates()\n            }\n        } catch NoMADQueryErrors.noMigrationCandidates {\n            //os_log(\"No local users to possibly migrate.\", log: uiLog, type: .default)\n        } catch {\n            _ = error.localizedDescription\n            //os_log(\"Error while determining migration candidate users: %{public}@\", log: uiLog, type: .error, errorText)\n        }\n    }\n    \n    func syncPass(oldPass: String) -> Bool {\n\n        var userRecord: ODRecord?\n        \n        do {\n            userRecord = try getLocalRecord(user)\n            try userRecord?.changePassword(oldPass, toPassword: pass)\n        } catch {\n            if userRecord == nil {\n                //os_log(\"Unable to obtain local user record.\", log: uiLog, type: .default)\n            } else {\n                //os_log(\"Unable to change local user password.\", log: uiLog, type: .default)\n            }\n            return false\n        }\n        \n        //os_log(\"Local password changed.\", log: uiLog, type: .default)\n        delegate?.setHint(type: .existingLocalUserPassword, hint: oldPass as NSSecureCoding)\n        return true\n    }\n}\n"
  },
  {
    "path": "NomadLogin/SystemInfoHelper.swift",
    "content": "//\n//  SystemInfoHelper.swift\n//  NoMADLoginAD\n//\n//  Created by Joel Rennich on 3/31/20.\n//  Copyright © 2020 Orchard & Grove. All rights reserved.\n//\n\nimport Foundation\n\nimport NetworkExtension\nimport IOKit.ps\n\n@available(macOS, deprecated: 11)\nclass SystemInfoHelper {\n    enum BatteryError: Error { case error }\n\n    func appVersion() -> String? {\n        let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n        if let bundle = bundle {\n\n            let infoPlist = bundle.infoDictionary\n            if let infoPlist = infoPlist,\n               let verString = infoPlist[\"CFBundleShortVersionString\"],\n               let buildString = infoPlist[\"CFBundleVersion\"]\n            {\n\n                return \"XCreds \\(verString) (\\(buildString))\"\n            }\n        }\n        return nil\n\n    }\n    func info() -> [String] {\n        var info = [String]()\n        \n        if let versionInfo = appVersion(){\n            info.append(versionInfo)\n\n        }\n        info.append(\" ⌘  macOS \\(ProcessInfo.processInfo.operatingSystemVersionString)\")\n        \n        let serial = getSerial()\n        \n        if serial.isEmpty==false {\n            info.append(\"#️⃣ Serial: \\(serial)\")\n        }\n//        info.append(\"MAC: \\(getMAC())\")\n        info.append(\"💻 Computer Name: \\(Host.current().localizedName!)\")\n        info.append(\"👤 Hostname: \\(ProcessInfo.processInfo.hostName)\")\n\n        if let ssid = NetworkManager().getCurrentSSID(){\n            info.append(\"🛜 SSID: \\(ssid)\")\n        }\n        if StateFileHelper().fileExists(.fileVaultLogin)==true{\n            TCSLogWithMark( \"adding FileVault AutoLogin Enabled\")\n\n            info.append(\"🔑 FileVault AutoLogin Enabled\")\n        }\n        else {\n            TCSLogWithMark( \"Not showing FileVault AutoLogin Enabled\")\n\n        }\n\n        let ipAddresses = getIFAddresses()\n        if ipAddresses.count > 0 {\n            info.append(\"🌐 IP Address: \\(ipAddresses.joined(separator: \",\"))\")\n        }\n        if let systemInfoAdditionsArray = DefaultsOverride.standardOverride.array(forKey: PrefKeys.systemInfoAdditionsArray.rawValue) as? Array <String>, systemInfoAdditionsArray.count>0 {\n\n            for line in systemInfoAdditionsArray {\n                info.append(line)\n            }\n\n\n            \n        }\n        return info\n    }\n    \n    func batteryLevel() -> (isCharging:Bool, percent:Int)? {\n        var batteryLevelInt:Int = 0\n        var isChargingBool:Bool = false\n        do {\n            guard let powerSourceInfo = IOPSCopyPowerSourcesInfo()?.takeRetainedValue()\n                else { throw BatteryError.error }\n\n            guard let sources: NSArray = IOPSCopyPowerSourcesList(powerSourceInfo)?.takeRetainedValue()\n                else { throw BatteryError.error }\n            if sources.count == 0 {\n                return nil\n            }\n            guard let info: NSDictionary = IOPSGetPowerSourceDescription(powerSourceInfo, sources[0] as CFTypeRef)?.takeUnretainedValue()\n            else { return nil }\n\n            if let _ = info[kIOPSNameKey] as? String,\n               let state = info[kIOPSIsChargingKey] as? Bool,\n               let capacity = info[kIOPSCurrentCapacityKey] as? Int,\n               let _ = info[kIOPSMaxCapacityKey] as? Int {\n                isChargingBool = state\n                batteryLevelInt=capacity\n            }\n            else {\n                return nil\n            }\n\n        } catch {\n            print(\"Unable to get mac battery percent.\")\n            return nil\n        }\n\n        return (isChargingBool, batteryLevelInt)\n    }\n    func ipAddress() -> String? {\n        let ipAddresses = getIFAddresses()\n\n        if ipAddresses.count>0{\n            return ipAddresses.joined(separator: \",\")\n        }\n        return nil\n    }\n    private func getIFAddresses() -> [String] {\n        var addresses = [String]()\n\n        // Get list of all interfaces on the local machine:\n        var ifaddr : UnsafeMutablePointer<ifaddrs>?\n        guard getifaddrs(&ifaddr) == 0 else { return [] }\n        guard let firstAddr = ifaddr else { return [] }\n\n        // For each interface ...\n        for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {\n            let flags = Int32(ptr.pointee.ifa_flags)\n            let addr = ptr.pointee.ifa_addr.pointee\n\n            // Check for running IPv4, IPv6 interfaces. Skip the loopback interface.\n            if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {\n                if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) {\n\n                    // Convert interface address to a human readable string:\n                    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))\n                    if (getnameinfo(ptr.pointee.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) == 0) {\n                        let address = String(cString: hostname)\n                        if !address.contains(\":\"){\n                            addresses.append(address)\n                        }\n                    }\n                }\n            }\n        }\n\n        freeifaddrs(ifaddr)\n        return addresses\n    }\n}\n"
  },
  {
    "path": "Profile Manifest/README.md",
    "content": ""
  },
  {
    "path": "Profile Manifest/build.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright 2021-2024 Elliot Jordan\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Given a path to a folder containing profile manifests, this script aims to produce\nequivalent Jamf JSON schema manifests.\"\"\"\n\n\n__author__ = \"Elliot Jordan\"\n__version__ = \"1.1.0\"\n\nimport argparse\nimport json\nimport os\nimport plistlib\nimport shutil\nimport sys\nimport xml\n\n\ndef build_argument_parser():\n    \"\"\"Build and return the argument parser.\"\"\"\n    parser = argparse.ArgumentParser(\n        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter\n    )\n    parser.add_argument(\"--version\", action=\"version\", version=__version__)\n    parser.add_argument(\n        \"input_dir\",\n        action=\"store\",\n        help=\"path to a directory containing profile manifests to be converted\",\n    )\n    parser.add_argument(\n        \"-o\",\n        \"--output-dir\",\n        default=os.path.dirname(__file__) + \"/manifests\",\n        action=\"store\",\n        help=\"path to output directory of converted Jamf JSON schema manifest files\",\n    )\n    parser.add_argument(\n        \"-v\",\n        \"--verbose\",\n        action=\"count\",\n        default=0,\n        help=\"output verbosity level (may be specified multiple times)\",\n    )\n    parser.add_argument(\n        \"--overwrite\",\n        action=\"store_true\",\n        help=\"overwrite output_dir if it already exists\",\n    )\n    parser.add_argument(\n        \"--exclude\",\n        action=\"append\",\n        help=\"manifest domains to skip during conversion (may be \"\n        \"specified multiple times)\",\n    )\n    parser.add_argument(\n        \"--property-order-increment\",\n        action=\"store\",\n        default=\"5\",\n        help=\"if set to a positive integer, the order of properties will be preserved during \"\n        \"conversion and the property_order value will be incremented by this number. If set to \"\n        \"0, the property_order key will be omitted from the resulting manifest files\",\n    )\n\n    return parser\n\n\ndef validate_args(args):\n    \"\"\"Do sanity checking and validation on provided input arguments.\"\"\"\n\n    if not os.path.isdir(os.path.expanduser(args.input_dir)):\n        sys.exit(\"Input path provided is not a directory: %s\" % args.input_dir)\n    if os.path.exists(os.path.expanduser(args.output_dir)):\n        if args.overwrite:\n            print(\"WARNING: Will overwrite output dir: %s\" % args.output_dir)\n        else:\n            sys.exit(\n                \"Output path already exists: %s\\nUse --overwrite to replace contents \"\n                \"of output path with converted files.\" % args.output_dir\n            )\n    try:\n        int(args.property_order_increment)\n    except TypeError:\n        sys.exit(\"Property order increment must be a positive integer or 0.\")\n\n    return args\n\n\ndef read_manifest_plist(path):\n    \"\"\"Given a path to a profile manifest plist, return the contents of\n    the plist.\"\"\"\n    with open(path, \"rb\") as openfile:\n        try:\n            return plistlib.load(openfile)\n        except xml.parsers.expat.ExpatError:\n            print(\"Error reading %s\" % path)\n\n\ndef process_subkeys(subkeys):\n    \"\"\"Given a list of subkeys, return equivalent JSON schema manifest properties.\"\"\"\n\n    # Skip keys that describe the payload instead of the setting\n    meta_keys = (\n        \"PayloadDescription\",\n        \"PayloadDisplayName\",\n        \"PayloadIdentifier\",\n        \"PayloadType\",\n        \"PayloadUUID\",\n        \"PayloadVersion\",\n        \"PayloadOrganization\",\n    )\n\n    # Replacements for plist types with equivalent JSON schema types\n    replacements = (\n        (\"dictionary\", \"object\"),\n        (\"real\", \"number\"),\n        (\"float\", \"number\"),\n        # Omitting \"date\" since this is handled by json.dumps(default=str) later\n    )\n\n    properties = {}\n    for idx, subkey in enumerate(subkeys):\n        # Get subkey name\n        name = \"\"\n        try:\n            if subkey.get(\"pfm_name\", \"\") != \"\":\n                name = subkey[\"pfm_name\"]\n        except AttributeError:\n            print(\"WARNING: Syntax error. Skipping.\")\n            return\n\n        # Skip specific names\n        if name in meta_keys:\n            continue\n        if name.lower().startswith(\"pfc_\"):\n            continue\n        if name.lower().startswith(\"pfmx_\"):\n            continue\n\n        # Skip specific types\n        ignored_types = (\"data\",)\n        if subkey.get(\"pfm_type\") in ignored_types:\n            continue\n\n        # Type is the only required property\n        # TODO: Is failing back to dictionary too broad an assumption?\n        properties[name] = {\"type\": subkey.get(\"pfm_type\", \"object\")}\n\n        # Replace with JSON schema types\n        for repl in replacements:\n            if properties[name][\"type\"] == repl[0]:\n                properties[name][\"type\"] = repl[1]\n\n        # If type is array, create a dict to store its items\n        if properties[name][\"type\"] == \"array\":\n            properties[name][\"items\"] = {}\n\n        # Get subkey title, description, and other attributes\n        if subkey.get(\"pfm_title\") not in (None, \"\"):\n            properties[name][\"title\"] = subkey[\"pfm_title\"]\n        if subkey.get(\"pfm_default\") not in (None, \"\"):\n            properties[name][\"default\"] = subkey[\"pfm_default\"]\n        if subkey.get(\"pfm_description\") not in (None, \"\"):\n            properties[name][\"description\"] = subkey[\"pfm_description\"]\n        if subkey.get(\"pfm_format\") not in (None, \"\"):\n            properties[name][\"pattern\"] = subkey[\"pfm_format\"]\n        if subkey.get(\"pfm_documentation_url\") not in (None, \"\"):\n            properties[name][\"links\"] = [\n                {\"rel\": \"More information\", \"href\": subkey[\"pfm_documentation_url\"]}\n            ]\n        if subkey.get(\"pfm_value_placeholder\") not in (None, \"\"):\n            # TODO: Support placeholders.\n            pass\n\n        # Convert pre-defined lists of values\n        if \"pfm_range_list\" in subkey:\n            properties[name][\"enum\"] = subkey[\"pfm_range_list\"]\n            if \"pfm_range_list_titles\" in subkey:\n                properties[name][\"options\"] = {\n                    \"enum_titles\": subkey[\"pfm_range_list_titles\"]\n                }\n\n        # Recurse into sub-sub-keys\n        if \"pfm_subkeys\" in subkey and not isinstance(subkey[\"pfm_subkeys\"], list):\n            print(\"WARNING: Not a list: %s\" % subkey[\"pfm_subkeys\"])\n        if isinstance(subkey.get(\"pfm_subkeys\"), list):\n            subprop = process_subkeys(subkey[\"pfm_subkeys\"])\n            if \"items\" in properties[name]:\n                # If the parent type was array, we're only expecting a single dict\n                # here, since an array should only contain a single object type.\n                # TODO: Validate this assumption. Some warnings seen in the wild.\n                subprop_keys = list(subprop.keys())\n                if len(subprop_keys) > 1:\n                    print(\n                        \"WARNING: Array type should only have one subproperty \"\n                        \"key. Skipping all but the first: %s\" % subprop_keys\n                    )\n                elif len(subprop_keys) == 0:\n                    print(\"WARNING: No subproperty keys found in %s key.\" % name)\n                    continue\n                array_props = subprop[subprop_keys[0]]\n                properties[name][\"items\"] = array_props\n            else:\n                properties[name][\"properties\"] = subprop\n\n    return properties\n\n\ndef convert_to_jamf_manifest(data, property_order_increment=5):\n    \"\"\"Convert a profile manifest plist object to a Jamf JSON schema manifest.\n\n    Reference: https://docs.jamf.com/technical-papers/jamf-pro/json-schema/10.19.0/Understanding_the_Structure_of_a_JSON_Schema_Manifest.html\n    \"\"\"\n\n    # Create schema object\n    try:\n        schema = {\n            \"title\": \"{} ({})\".format(data[\"pfm_title\"], data[\"pfm_domain\"]),\n            \"description\": data[\"pfm_description\"],\n            \"properties\": process_subkeys(data[\"pfm_subkeys\"]),\n        }\n    except KeyError:\n        print(\"ERROR: Manifest is missing a title, domain, or description.\")\n        return\n\n    # Lock property order\n    if property_order_increment > 0:\n        order = property_order_increment\n        for property in schema[\"properties\"]:\n            schema[\"properties\"][property][\"property_order\"] = order\n            order += property_order_increment\n\n    return schema\n\n\ndef write_to_file(path, data):\n    \"\"\"Given a path to a file and JSON data, write the file.\"\"\"\n    path_head, path_tail = os.path.split(path)\n\n    # Create output subfolder if it doesn't exist\n    if not os.path.isdir(path_head):\n        os.makedirs(path_head)\n\n    # Write file\n    with open(os.path.join(path_head, path_tail), \"w\", encoding=\"utf-8\") as openfile:\n        openfile.write(\n            json.dumps(\n                data,\n                ensure_ascii=False,\n                indent=4,\n                sort_keys=False,\n                default=str,\n            )\n        )\n\n\ndef update_readme(count):\n    \"\"\"Updates README.md file with latest manifest count.\"\"\"\n\n    with open(\"README.md\", encoding=\"utf-8\") as f:\n        readme = f.readlines()\n    for idx, line in enumerate(readme):\n        if line.startswith(\"![Manifest Count](\"):\n            readme[idx] = (\n                \"![Manifest Count](https://img.shields.io/badge/manifests-%d-blue)\\n\"\n                % count\n            )\n            break\n    with open(\"README.md\", \"w\", encoding=\"utf-8\") as f:\n        f.write(\"\".join(readme))\n    print(\"Updated README.md\")\n\n\ndef main():\n    \"\"\"Main process.\"\"\"\n\n    # Parse command line arguments.\n    argparser = build_argument_parser()\n    args = validate_args(argparser.parse_args())\n\n    # Expand to full paths\n    input_dir = os.path.expanduser(args.input_dir)\n    output_dir = os.path.expanduser(args.output_dir)\n\n    # Optionally delete and recreate output path\n    if args.overwrite:\n        shutil.rmtree(output_dir)\n    if not os.path.isdir(output_dir):\n        os.makedirs(output_dir)\n\n    # Iterate through manifests in the input path\n    count = {\"done\": 0, \"skipped\": 0}\n    for root, dirs, files in os.walk(input_dir):\n        for name in files:\n            if name.endswith(\".plist\"):\n                relpath = os.path.relpath(os.path.join(root, name), start=input_dir)\n\n                # Output filename if in verbose mode\n                if args.verbose > 0:\n                    print(\"Processing %s\" % relpath)\n\n                # Load manifest\n                pfm_data = read_manifest_plist(os.path.join(root, name))\n                if not pfm_data:\n                    count[\"skipped\"] += 1\n                    continue\n\n                # Convert to Jamf manifest\n                manifest = convert_to_jamf_manifest(\n                    pfm_data, int(args.property_order_increment)\n                )\n                if not manifest:\n                    count[\"skipped\"] += 1\n                    continue\n\n                # Write manifest file\n                output_path = os.path.join(\n                    output_dir, relpath.replace(\".plist\", \".json\")\n                )\n                write_to_file(output_path, manifest)\n                count[\"done\"] += 1\n\n    print(\"Converted %d files. Skipped %d files.\" % (count[\"done\"], count[\"skipped\"]))\n    update_readme(count[\"done\"])\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "Profile Manifest/com.twocanoes.xcreds.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>pfm_app_url</key>\n\t<string>https://github.com/twocanoes/xcreds</string>\n\t<key>pfm_description</key>\n\t<string>XCreds 5.8 (9059) OAuth Settings</string>\n\t<key>pfm_documentation_url</key>\n\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t<key>pfm_domain</key>\n\t<string>com.twocanoes.xcreds</string>\n\t<key>pfm_format_version</key>\n\t<integer>1</integer>\n\t<key>pfm_last_modified</key>\n\t<date>2026-01-08T21:30:08Z</date>\n\t<key>pfm_platforms</key>\n\t<array>\n\t\t<string>macOS</string>\n\t</array>\n\t<key>pfm_subkeys</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The human-readable description of this payload. This description appears on the Detail screen.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>Optional. A human-readable description of this payload. This description is shown on the Detail screen.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadDescription</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Description</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The human-readable name for the profile payload. The name appears on the Detail screen and doesn&apos;t need to be unique.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>A human-readable name for the profile payload. This name is displayed on the Detail screen. It does not have to be unique.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadDisplayName</string>\n\t\t\t<key>pfm_require</key>\n\t\t\t<string>always</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Display Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The reverse-DNS-style identifier for the payload. This identifier is usually the same as the TopLevel value, with an additional appended component. This string must be unique within the profile.\nDuring a profile replacement, the system updates payloads with the same &apos;PayloadIdentifier&apos; and &apos;PayloadUUID&apos; in the old and new profiles.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>A reverse-DNS-style identifier for the specific payload. It is usually the same identifier as the root-level PayloadIdentifier value with an additional component appended.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadIdentifier</string>\n\t\t\t<key>pfm_require</key>\n\t\t\t<string>always</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Identifier</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The payload type, which each payload domain&apos;s reference page specifies.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>The payload type.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadType</string>\n\t\t\t<key>pfm_require</key>\n\t\t\t<string>always</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Type</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The globally unique identifier for the payload. The actual content is unimportant, but must be globally unique. In macOS, use &apos;uuidgen&apos; to generate UUIDs.\nDuring a profile replacement, the system updates payloads with the same &apos;PayloadIdentifier&apos; and &apos;PayloadUUID&apos; in the old and new profiles.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>A globally unique identifier for the payload. The actual content is unimportant, but it must be globally unique. In macOS, you can use uuidgen to generate reasonable UUIDs.</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadUUID</string>\n\t\t\t<key>pfm_require</key>\n\t\t\t<string>always</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload UUID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The version of this specific payload.</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>The version number of the individual payload.\nA profile can consist of payloads with different version numbers. For example, changes to the VPN software in iOS might introduce a new payload version to support additional features, but Mail payload versions would not necessarily change in the same release.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadVersion</string>\n\t\t\t<key>pfm_require</key>\n\t\t\t<string>always</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Version</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The human-readable string containing the name of the organization that provides the profile. This value doesn&apos;t need to match the organization payload value in the enclosing dictionary.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PayloadOrganization</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Payload Organization</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The desired AD domain</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>ADDomain</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>ADDomain</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The OIDC claim that has the kerberos principal name. This is used when logging in with OIDC and ADDomain is defined. During login, the claim that contains the kerberos principal name will be read and the local account will set dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal to the kerberos principal name. The menu item will then use this value and the password to get a kerberos ticket.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>mapKerberosPrincipalName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Map Kerberos Principal Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>If the user principal has a domain name and the OpenID token does not match the ADDomain name, replace it with the ADDomain name. For example: bob@sub.example.com -&gt; bob@example.com if ADDomain was example.com.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUpdateKerberosUserPrincipalADDomain</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Update Kerberos User Principal ADDomain</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The OIDC client id public identifier for the app.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>clientID</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Client ID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Client Secret sometimes required by identity provider.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>clientSecret</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Client Secret</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When set to true and the user account is created, the user will be a local admin.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>CreateAdminUser</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Create User as Admin</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.5</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When set to true and a new user home is created, the .skipbuddy file will be created at the top of the home folder to skip user setup screens.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>skipUserSetupBuddy</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Skip User Setup Buddy</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>upn</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The claim that contains the value to check for in the allowedUsersArray. Both must be defined.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>allowUsersClaim</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Allow Users Claim</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>List of users that are allowed to log in. An empty array or undefined array means any user can log in as long their cloud credentials are valid. The preference allowUsersClaim must be defined to a claim in the idToken that identifies the users. For example, if the allowUsersClaim is set to upn and the allowedUsersArray is set to an array that contains fred@twocanoes.com and the upn of a logging in user is fred@twocanoes.com, they would be allowed to log in. barney@twocanoes.com would not.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>allowedUsersArray</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>user</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Allowed Users</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>(OIDC Only) List of groups whose members should be allowed to login. If the user is a member of any of these groups they can login regardless (including creating new local account) if authorization succeeds. If a local account exists but the user is no longer part of a group the login will be denied.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>allowLoginIfMemberOfGroup</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>group</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Allow Login If Member Of Group</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>List of groups that should have members be given local administrator status. Local administrator status can be given on first authentication when account created, or on later sign in of existing user when a group member. Administrator status is removed if group membership later revoked. Administrator status is not removed if user is the only XCreds admin user. Set as an Array of Strings of the group identifier.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>CreateAdminIfGroupMember</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>group</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Create Admin If Group Member</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>List of claims that should be added to the user local account. Will be prefixed with _xcreds_oidc_. Set as an Array of Strings of the claim.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>claimsToAddToLocalUserAccount</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>claim</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Claims To Add To Local User Account</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.1</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Items to be added to the System Info Popover at login. Can be made dynamic by using the override script override to provide this setting</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>systemInfoAdditionsArray</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>item</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>System Info Additions</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSwitchToLoginWindowWhenLocked</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Switch To Login Window When Locked</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>If the user attempts to login as an AD user and the login fails against AD, try against local user account if off domain or AD user not found.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>LocalFallback</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>LocalFallback</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.1</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show the system info popover as active when first starting</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldActivateSystemInfoButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Activate System Info Button</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The discovery URL provided by your OIDC / Cloud provider. For Google it is typically https://accounts.google.com/.well-known/openid-configuration and for Azure it is typically https://login.microsoftonline.com/common/.well-known/openid-configuration.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>discoveryURL</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Discovery URL</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Enabled FDE enabled at first login on APFS disks.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>EnableFDE</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Enable Full Disk Encryption (FDE)</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Save the Personal Recovery Key (PRK) to disk for the MDM Escrow Service to collect.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>EnableFDERecoveryKey</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Save PRK</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Specify a custom path for the recovery key.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>EnableFDERecoveryKeyPath</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>FDE Recovery Key Path</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Rotate the Personal Recovery Key (PRK).</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>EnableFDERekey</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Enable FDE Rekey</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Login Window webview width (Integer). If this is not defined, it will be full width. Minimum value of 150.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowWidth</string>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>150</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Width</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Login Window webview height (Integer). If this is not defined, it will be full height. Minimum value of 150.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowHeight</string>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>150</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Height</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Please Wait....</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When no network connection or a profile is not defined, this title is shown in an HTML view to the user when cloud login is configured.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loadPageTitle</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>LoadPage Title</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>(or try connecting to network or check preferences)</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When no network connection or a profile is not defined, this text is shown in an HTML view to the user when cloud login is configured.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loadPageInfo</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>LoadPage Info</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.4</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Hide the login window logo.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldHideLoginWindowLogo</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>should Hide Login Window Logo</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>URL to an image to show icon in the username / password login window</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>(https?://|file:///).*</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowLogoPath</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Logo Path</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>file:///System/Library/CoreServices/DefaultDesktop.heic</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>URL to an image to show in the background while logging in. Default value: file:///System/Library/Desktop Pictures/Monterey Graphic.heic.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>(https?://|file:///).*</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowBackgroundImageURL</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Background Image URL</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<real>1</real>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Alpha value of loginWindowBackgroundImage. Default value: 1</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowBackgroundImageAlpha</string>\n\t\t\t<key>pfm_range_max</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Background Image Alpha</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>real</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>file:///System/Library/CoreServices/DefaultDesktop.heic</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>URL to an image to show in the background on secondary display while logging in. Default value: file:///System/Library/Desktop Pictures/Monterey Graphic.heic.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>(https?://|file:///).*</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowSecondaryMonitorsBackgroundImageURL</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Secondary Monitors Background Image URL</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Base64 data of icon. Should be 48 x 48.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>menuItemIconData</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Menu Item Icon Data</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>data</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Base64 data of icon with checkmark. Should be 48 x 48.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>menuItemIconCheckedData</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Menu Item Icon Checked Data</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>data</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>URL to an image to show in the background of the window that appears when logged in and prompting for Active Directory username and password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>(https?://|file:///).*</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>menuItemWindowBackgroundImageURL</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Menu Item Window BackgroundImageURL</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<real>1</real>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Alpha value of menuItemWindowBackgroundImageURL. Default value: 1</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>menuItemWindowBackgroundImageAlpha</string>\n\t\t\t<key>pfm_range_max</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Menu Item Background Image Alpha</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>real</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Set the background image to Fill Screen rather than Fit to Screen</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldLoginWindowBackgroundImageFillScreen</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Background Image Fill Screen</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Set the secondary monitor(s) background image to Fill Screen rather than Fit to Screen</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Secondary Monitors Background Image Fill Screen</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<real>1</real>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Alpha value of loginWindowSecondaryMonitorsBackground. Default value: 1</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>loginWindowSecondaryMonitorsBackgroundAlpha</string>\n\t\t\t<key>pfm_range_max</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Login Window Secondary Monitors Background Image Alpha</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>real</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When XCreds is installed, a launch agent is installed to automatically keep the menu item running when a user is logged in. Setting shouldRemoveMenuItemAutoLaunch to true makes XCreds at the login window remove the launchagent plist that was installed. This will cause the launchagent to not launch XCreds menu item on log in.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldRemoveMenuItemAutoLaunch</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Remove Menu Item Auto Launch</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.4</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When changing password via menu item, use the native UI to change password in Active Directory.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseADNativePasswordChangeMenuItem</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Use AD Native Password Change Menu Item</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Add a menu item for changing the password that will open this URL when the menu item is selected. If shouldUseADNativePasswordChangeMenuItem is set to true, this value is not used.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_format</key>\n\t\t\t<string>https?://.*</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>passwordChangeURL</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Password Change URL for Menu</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>xcreds://auth/</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The URI passed back to the webview after successful authentication. Default value: xcreds://auth/</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>redirectURI</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Redirect URI</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Determine if the Mac login window or the cloud login window is shown by default.  When not set or set to true, show cloud login. If false, shows Mac login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowCloudLoginByDefault</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Cloud Login By Default</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<integer>3</integer>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The number of hours between checks. Default value: 3. Minimum value: 0. Max value: 168.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>refreshRateHours</string>\n\t\t\t<key>pfm_range_max</key>\n\t\t\t<integer>168</integer>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Password Change Check Rate Hours</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t\t<key>pfm_value_unit</key>\n\t\t\t<string>hours</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The number of minutes between checks. Default value: 0. Minimum value: 0. Max value: 59. This value is added to refreshRateHours. If refreshRateHours is 0, minimum for refreshRateMinutes becomes 5.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>refreshRateMinutes</string>\n\t\t\t<key>pfm_range_max</key>\n\t\t\t<integer>59</integer>\n\t\t\t<key>pfm_range_min</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Password Change Check Rate Minutes</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t\t<key>pfm_value_unit</key>\n\t\t\t<string>minutes</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>profile openid offline_access</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Scopes tell the identify provider what information to return. Note that the values are provided with a single space between them.\n\nProvide the following values the follow IdPs:\n\nGoogle: profile openid email\nAzure: profile openid offline_access\n\nNote that Google does not support the offline_access scope so instead use the preference shouldSetGoogleAccessTypeToOffline. Azure provides unique_name which is mapped to the local user account by using the prefix before &quot;@&quot; in unique_name and matching to the short name of a user account. Google provides &quot;email&quot; and is matched in the same way.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>scopes</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>All scopes should be lowercase and separated by single spaces</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Scopes</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When using Google IdP, a refresh token may need be requested in a non-standard way.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSetGoogleAccessTypeToOffline</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Request Google Refresh Token</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Populate HD parameter for OIDC username with Google</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSetGoogleHDParam</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Set Google HD Param</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>If the domain controller returns back that the password is expired or needs to be changed, prompt the user. If this is set to false, login will fail and an error message will be shown.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldPromptForADPasswordChange</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Prompt For AD Password Change</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Determine if the Sign In menu item is shown in the XCreds menu. When not set or set to true, show Sign In. If false, the Sign In menu item is hidden.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowSignInMenuItem</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Sign In Menu Item</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.2</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Do not prompt for local password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSuppressLocalPasswordPrompt</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Suppress Local Password Prompt</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Favor using XCreds&apos; local login screen over the cloud login UI.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldPreferLocalLoginInsteadOfCloudLogin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Prefer Local Login over Cloud Login</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_deprecated</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_app_max</key>\n\t\t\t<string>3.2.1</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>(Deprecated in v4.0) When verifying password in the menu app, use ROPG.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldVerifyPasswordWithRopg</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Use ROPG when testing password</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When using ROPG, do basic HTTP auth. Default: false</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseBasicAuthWithROPG</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Use Basic Auth With ROPG</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_deprecated</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_app_max</key>\n\t\t\t<string>3.2.1</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>(Removed in v4.0) ROPG Client ID for use when checking password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>ropgClientID</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>ROPG Client ID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_deprecated</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_app_max</key>\n\t\t\t<string>3.2.1</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>(Removed in v4.0) ROPG Client Secret for use when checking password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>ropgClientSecret</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>ROPG Client Secret</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When verifying password in the login window, use ROPG.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseROPGForLoginWindowLogin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Use ROPG when logging in at login window</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When verifying password in the menu app, use ROPG.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseROPGForMenuLogin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Use ROPG for menu login</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When verifying local password matches cloud password in the background, use ROPG. If set to false, the refresh token will be used to verify password change.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseROPGForPasswordChangeChecking</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Use ROPG For Password Change Checking</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.8</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When verifying local password matches cloud password in the background, use Google LDAP. If set to false, the refresh token will be used to verify password change.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldUseLDAPForPasswordChangeChecking</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Use LDAP For Password Change Checking</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Resource URL when using ROPG. Typically needed only for Azure. Common value is https://graph.microsoft.com</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>resource</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>ROPG Resource</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.1</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>interaction_required</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When a ROPG request is completed successfully to verify password, it may return an error that two factor is required. Add the string that is returned for the JSON response. For Azure, it is typically interaction_required. For Okta, the response is usually {&quot;error&quot;:&quot;invalid_grant&quot;,&quot;error_description&quot;:&quot;Resource owner password credentials authentication denied by sign on policy.&quot;} Can be a string or an array of strings.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>ropgResponseValue</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>ROPG Response Value</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Don&apos;t show the UI if this key is defined and a file or folder exists at this path.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>hideIfPathExists</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Hide If Path Exists</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Name of OIDC claim that contains an alias to add to a user account. Usually this is the &quot;upn&quot; (eg syd@twocanoes.com) so the user can log in at the standard login window the same as the IdP login window. Adds the value to record name of the user account as an alias.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>aliasName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Alias Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Timer for automatically refreshing login screen in seconds. If set to 0, does not automatically refresh.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>autoRefreshLoginTimer</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Automatically Refresh Login Window (seconds)</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Cloud Login</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Text for return to cloud login on Mac login screen</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>cloudLoginText</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Cloud Login Text</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show the About Menu item menu. Default value: true</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowAboutMenu</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show About Menu</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Skip FileVault login during startup if FileVault is enabled. The current username and password are used to tell fdesetup to silently use the credentials during next reboot to unlock FileVault. Passthrough is also disabled and the user will see the XCreds Login Window. To avoid the user being prompted for admin credentials, set the &quot;Login And Background Item Management&quot; management item (com.apple.servicemanagement) to allow teamid UXP6YEHSPW to have background tasks.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSkipFileVaultLogin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Skip FileVault Login</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Skip FileVault authentication at startup if FileVault is enabled. The admin credentials will be used to tell fdesetup to silently use the credentials during next reboot to unlock FileVault. Passthrough is also disabled and the user will see the XCreds Login Window. To avoid the user being prompted for admin credentials, set the &quot;Login And Background Item Management&quot; management item (com.apple.servicemanagement) to allow teamid UXP6YEHSPW to have background tasks. Default value: false</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldSkipFileVaultLoginAdmin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Skip FileVault Login as Admin</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>If the discovery URL is defined and there are no tokens or tickets, the sign in window in the user session will show even if the user did not log in from the XCreds Login Window</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowMenuBarSignInWithoutLoginWindowSignin</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Show Menu Bar Sign In Without Login Window Sign In</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Log in to verify your cloud credentials. After verification, your local user account password will be set to your cloud password.</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Text at top of window shown in user session when prompting for password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>refreshBannerText</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Refresh Banner Text</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show text at the top of the prompt window when tokens expire.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowRefreshBanner</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Refresh Banner</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Configure WiFi button in XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowConfigureWifiButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Configure WiFi</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Shutdown button in XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowShutdownButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Shutdown Button</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Restart button in XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowRestartButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Restart Button</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Configure System Info in XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowSystemInfoButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show System Info Button</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Settings on start if none are defined. Default value: false</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowPreferencesOnStart</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Preferences on Startup</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Prompt for local account username and password if no account was mapped and there are standard users already on the system.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldPromptForMigration</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Prompt for Migration</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>4.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Allow key combo (control-option return) to switch logon window. Use command-option-control-return for Mac Login Window. </string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldAllowKeyComboForMacLoginWindow</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Allow Key Combo For Mac Login Window</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>key code for shouldAllowKeyComboForMacLoginWindow. If not defined, it is return or enter. If this is defined, this key is used with control-option to switch to login window and command-option-control and this key is used to switch to Mac Login Window. Uses CGKeyCode (for example, enter is 76 and return is 36)</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>keyCodeForLoginWindowChange</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Key Code For Login Window Change</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>integer</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show the Mac Login Window button in XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowMacLoginButton</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Mac Login Window button</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show the local only checkbox on the local login page </string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowLocalOnlyCheckbox</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Local Only Checkbox</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Placeholder text in local / AD login window for username</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>usernamePlaceholder</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Username Placeholder Text</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Placeholder text in local / AD login window for password</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>passwordPlaceholder</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Password Placeholder Text</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show message in XCreds Login reminding people to buy support.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowSupportStatus</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Support Status Message</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show Quit in the menu item menu. Default value: true</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowQuitMenu</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Quit Menu Item</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_deprecated</key>\n\t\t\t<string>5.4</string>\n\t\t\t<key>pfm_app_max</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>(Removed in v5.4 and replaced by shouldActivateSystemInfoButton) Show the version number and build number in the lower left corner of XCreds Login.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldShowVersionInfo</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Version and Build Number</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show push notifications for authentication progress. Default value: false</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>showDebug</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Show Debug Message</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When a user uses cloud login, XCreds will try and figure out the local username based on the email or other data returned for the IdP. Use this value to force the local username for any cloud login. Provide only the shortname.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>username</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Local Username</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_deprecated</key>\n\t\t\t<string>5.4</string>\n\t\t\t<key>pfm_app_max</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When a local user password does not match the cloud or AD password, this key will allow the user to select a Reset button to set their password to match their AD/cloud password, move their current keychain aside and create a new keychain. If XCreds does not have access to local admin credentials set from the XCreds command line tools, the user will prompted to enter local admin credentials.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>KeychainReset</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Keychain Reset</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Update the local user password silently to match the cloud / AD password. Requires access to admin credentials. See command line help to set admin username and password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>PasswordOverwriteSilent</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Overwrite Password Silently</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Hide AD Expiration even if defined in AD Account</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>HideExpiration</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Hide Expiration</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Username of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>localAdminUserName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Local Admin User Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Password of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>localAdminPassword</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Local Admin Password</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Unlock Account</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Title of dialog prompting user to enter in their prior local password when account is locked.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>accountLockedPasswordDialogTitle</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Account Locked Password Dialog Title</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.3</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>The user account is locked.  You can wait for the account to unlock or reset the password by clicking the Reset button below.</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Text of dialog prompting user to enter in their prior local password when account is locked.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>accountLockedPasswordDialogText</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Account Locked Password Dialog Text</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>Please enter your local login password to sync your cloud password and login.</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Title of dialog prompting user to enter in their prior local password.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>resetPasswordDialogTitle</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Reset Password Dialog Title</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>System Info</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>The title of the button for system info in the bottom right corner of the login screen. This can either be plain text or one of these special values: .os, .hostname, .ipaddress, .serial, .mac, .computername, .ssid. Using the special value will populate the associated information as the button title.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>systemInfoButtonTitle</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>System Info Button Title</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>When cloud password is changed and the local keychain password and local user account needs to be changed, a verification dialog can be shown to verify the password. Default value: true</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>verifyPassword</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Verify Cloud Password</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Check if network is up. If not, select username and password login window.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldDetectNetworkToDetermineLoginWindow</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Detect Network To Determine Login Window</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Hostname of the page that has the password field. When the user submits the form, XCreds will use idpHostName to identify a page it needs to look for the password field. The password value is identified by an HTML id defined by passwordElementID. If this value is not defined. XCreds will look for login.microsoftonline.com and accounts.google.com. This value is commonly set for other IdP’s and for Azure environments that use ADFS.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>idpHostName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>IDP Host Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>array of hostnames of the page that has the password field.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>idpHostNames</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>idpHostName</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>IDP Host Names</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.2</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>array of additional AD domains to accept</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>AdditionalADDomains</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>Domain</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Additional AD Domains</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.2</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Name of slot for CCID reader for reading RFID cards</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>ccidSlotName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>CCID Slot Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.2</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>If an unknown RFID card is tapped, show option to pair with local account.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shouldAllowLoginCardSetup</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Should Allow Login Card Setup</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>array of AD user attributes to add to local directory user account</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>adUserAttributesToAddToLocalUserAccount</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>userAttribute</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>string</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>AD User Attributes To Add To Local User Account</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Password element id of the html element that has the password. It is read by using JavaScript to get the value (for example, for Azure, the JavaScript document.getElementById(&apos;i0118&apos;).value is sent. If this default is not set, standard values for Azure and Google Cloud will be used. To find out this value, use a browser to inspect the source of the page that has the password on it. Find the id of the textfield that has the password. Fill in the password and then open the JavaScript console. Run:\n\ndocument.getElementById(&apos;passwordID&apos;).value\n\nchanging &quot;passwordID&quot; to the correct element ID. If the value you typed into the textfield is returned, this is the correct ID.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>passwordElementID</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Password Element ID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>given_name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC/AD Mapping for First Name. Default value: &quot;given_name&quot; (OIDC), &quot;givenName&quot; (AD). map_firstname should be set to an OIDC claim/AD Attribute for first name.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_firstname</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map firstName to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>First Name OIDC Mapping/AD Attribute</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>family_name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC/AD Mapping for Last Name. Default value: &quot;family_name&quot; (OIDC), &quot;sn&quot; (AD). map_lastname should be set to an OIDC claim for last name.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_lastname</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map lastName to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Last Name OIDC Mapping</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC/AD Attribute Mapping for Full Name. Default value: &quot;name&quot;(OIDC), &quot;displayName&quot; (AD). map_fullname should be set to an OIDC claim/AD Attribute for full name.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_fullname</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map fullName to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Full Name OIDC Mapping/AD Attribute</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC Mapping/AD Attribute for Name. Default value: &quot;name&quot; (OIDC), &quot;userPrincipalName&quot; (AD). map_username should be set to an OIDC claim/AD Attribute for name. The macOS username will be set as the portion of this value before an @ symbol if present.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_username</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map Username to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Username OIDC Mapping/AD Attribute</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC Mapping for Full Username (for example, freddy@twocanoes.com) Default value: &quot;unique_name&quot;. map_username should be set to an OIDC claim for full username.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_fullusername</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map Full Username (user@domain) to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Full Username OIDC Mapping/AD Attribute</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Local DS to OIDC Mapping/AD Attribute for UID at initial user creation. If not set, the uid will be set to the next available. If the mapped UID is used, login will fail.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_uid</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map UID to OIDC claim/AD Attribute</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Map UID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.5</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>20</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Primary Group ID when creating a new user. Default value 20.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>primaryGroupID</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Primary Group ID</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.0</string>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>pwd_exp</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Password expiry mapping to claim. If this value is set to an OIDC claim, the value in that claim should be the number of seconds from the token issued time (iat) to the expiry date. </string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>map_password_expiry</string>\n\t\t\t<key>pfm_note</key>\n\t\t\t<string>Map OIDC claim to Password Expiry Seconds</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Map OIDC claim to Password Expiry in Seconds</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<string>name</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Script to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by _securityagent and writable and executable only by _securityagent.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>settingsOverrideScriptPath</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Override Script Path</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_app_min</key>\n\t\t\t<string>5.2</string>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>In some Active Directory environments, users do not use username@domain to login; they use a UPN suffix to make the username easier to use. This setting maps the UPN suffix to the correct AD domain name. For example, if you have an AD domain of foo.com but want users to sign in as user@bar.com, a UPN suffix of foo.com is created in AD and the user account is set to user@foo.com. This setting then would map foo.com to bar.com by setting the key upn to foo.com and the domain key to bar.com.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>upnSuffixToDomainMappings</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_hidden</key>\n\t\t\t\t\t<string>container</string>\n\t\t\t\t\t<key>pfm_subkeys</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>UPN</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>upn</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>UPN</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>domain</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>domain</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>domain</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>dictionary</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>UPN Suffix To Domain Mappings</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Menu Items</string>\n\t\t\t<key>pfm_description_reference</key>\n\t\t\t<string>Optional Array of Additional Menu Items</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>menuItems</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t<string>Menu Item Name</string>\n\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t<string>menuItemName</string>\n\t\t\t\t\t<key>pfm_require</key>\n\t\t\t\t\t<string>always</string>\n\t\t\t\t\t<key>pfm_subkeys</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Menu Item</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>menuItemName</string>\n\t\t\t\t\t\t\t<key>pfm_require</key>\n\t\t\t\t\t\t\t<string>always</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Menu Item Name</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t\t<key>pfm_value_placeholder</key>\n\t\t\t\t\t\t\t<string>Menu Item Name</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Link or App Path</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>linkOrAppPath</string>\n\t\t\t\t\t\t\t<key>pfm_require</key>\n\t\t\t\t\t\t\t<string>always</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Web page URL or local path to app</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t\t<key>pfm_value_placeholder</key>\n\t\t\t\t\t\t\t<string>/System/Applications/Utilities/Keychain Access.app or http://twocanoes.com/info</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_default</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Separator line before menu item</string>\n\t\t\t\t\t\t\t<key>pfm_description_reference</key>\n\t\t\t\t\t\t\t<string>Add a line before menu item</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>separatorBefore</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Separator Before</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>boolean</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_default</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Separator line after menu item</string>\n\t\t\t\t\t\t\t<key>pfm_description_reference</key>\n\t\t\t\t\t\t\t<string>Add a line after menu item</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>separatorAfter</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Separator After</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>boolean</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t<string>Optional Menu Items</string>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>dictionary</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Menu Items</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Add menu item and mount/automount shares</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>Shares</string>\n\t\t\t<key>pfm_subkeys</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>pfm_subkeys</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Name of share to show in menu</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>Name</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Name</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>URL for share (eg smb://server.example.com/share)</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>URL</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>URL</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>string</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string></string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>Groups</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>Groups</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>array</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Allow mounting only if network connection is detected</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>ConnectedOnly</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>ConnectedOnly</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>boolean</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>pfm_description</key>\n\t\t\t\t\t\t\t<string>Automatically mount when XCreds starts</string>\n\t\t\t\t\t\t\t<key>pfm_name</key>\n\t\t\t\t\t\t\t<string>AutoMount</string>\n\t\t\t\t\t\t\t<key>pfm_title</key>\n\t\t\t\t\t\t\t<string>AutoMount</string>\n\t\t\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t\t\t<string>boolean</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>pfm_type</key>\n\t\t\t\t\t<string>dictionary</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Shares</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>array</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<true/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Show and mount home directory from AD profile if defined.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>HomeMountEnabled</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Home Mount Enabled</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_default</key>\n\t\t\t<false/>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Append the domain name to the share defined in the profile.</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>HomeAppendDomain</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Home Append Domain</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>boolean</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>pfm_description</key>\n\t\t\t<string>Name for Shares menu item. Default: &quot;Shares&quot;.</string>\n\t\t\t<key>pfm_documentation_url</key>\n\t\t\t<string>https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences</string>\n\t\t\t<key>pfm_name</key>\n\t\t\t<string>shareMenuItemName</string>\n\t\t\t<key>pfm_title</key>\n\t\t\t<string>Share Menu Item Name</string>\n\t\t\t<key>pfm_type</key>\n\t\t\t<string>string</string>\n\t\t</dict>\n\t</array>\n\t<key>pfm_targets</key>\n\t<array>\n\t\t<string>system</string>\n\t\t<string>user</string>\n\t</array>\n\t<key>pfm_title</key>\n\t<string>XCreds</string>\n\t<key>pfm_unique</key>\n\t<false/>\n\t<key>pfm_version</key>\n\t<integer>15</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Profile Manifest/jamf/com.twocanoes.xcreds.json",
    "content": "{\n    \"title\": \"XCreds (com.twocanoes.xcreds)\",\n    \"description\": \"XCreds 5.8 (9059) OAuth Settings\",\n    \"properties\": {\n        \"ADDomain\": {\n            \"type\": \"string\",\n            \"title\": \"ADDomain\",\n            \"description\": \"The desired AD domain\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 5\n        },\n        \"mapKerberosPrincipalName\": {\n            \"type\": \"string\",\n            \"title\": \"Map Kerberos Principal Name\",\n            \"description\": \"The OIDC claim that has the kerberos principal name. This is used when logging in with OIDC and ADDomain is defined. During login, the claim that contains the kerberos principal name will be read and the local account will set dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal to the kerberos principal name. The menu item will then use this value and the password to get a kerberos ticket.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 10\n        },\n        \"shouldUpdateKerberosUserPrincipalADDomain\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Update Kerberos User Principal ADDomain\",\n            \"default\": false,\n            \"description\": \"If the user principal has a domain name and the OpenID token does not match the ADDomain name, replace it with the ADDomain name. For example: bob@sub.example.com -> bob@example.com if ADDomain was example.com.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 15\n        },\n        \"clientID\": {\n            \"type\": \"string\",\n            \"title\": \"Client ID\",\n            \"description\": \"The OIDC client id public identifier for the app.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 20\n        },\n        \"clientSecret\": {\n            \"type\": \"string\",\n            \"title\": \"Client Secret\",\n            \"description\": \"Client Secret sometimes required by identity provider.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 25\n        },\n        \"CreateAdminUser\": {\n            \"type\": \"boolean\",\n            \"title\": \"Create User as Admin\",\n            \"default\": false,\n            \"description\": \"When set to true and the user account is created, the user will be a local admin.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 30\n        },\n        \"skipUserSetupBuddy\": {\n            \"type\": \"boolean\",\n            \"title\": \"Skip User Setup Buddy\",\n            \"default\": false,\n            \"description\": \"When set to true and a new user home is created, the .skipbuddy file will be created at the top of the home folder to skip user setup screens.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 35\n        },\n        \"allowUsersClaim\": {\n            \"type\": \"string\",\n            \"title\": \"Allow Users Claim\",\n            \"default\": \"upn\",\n            \"description\": \"The claim that contains the value to check for in the allowedUsersArray. Both must be defined.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 40\n        },\n        \"allowedUsersArray\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"Allowed Users\",\n            \"description\": \"List of users that are allowed to log in. An empty array or undefined array means any user can log in as long their cloud credentials are valid. The preference allowUsersClaim must be defined to a claim in the idToken that identifies the users. For example, if the allowUsersClaim is set to upn and the allowedUsersArray is set to an array that contains fred@twocanoes.com and the upn of a logging in user is fred@twocanoes.com, they would be allowed to log in. barney@twocanoes.com would not.\",\n            \"property_order\": 45\n        },\n        \"allowLoginIfMemberOfGroup\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"Allow Login If Member Of Group\",\n            \"description\": \"(OIDC Only) List of groups whose members should be allowed to login. If the user is a member of any of these groups they can login regardless (including creating new local account) if authorization succeeds. If a local account exists but the user is no longer part of a group the login will be denied.\",\n            \"property_order\": 50\n        },\n        \"CreateAdminIfGroupMember\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"Create Admin If Group Member\",\n            \"description\": \"List of groups that should have members be given local administrator status. Local administrator status can be given on first authentication when account created, or on later sign in of existing user when a group member. Administrator status is removed if group membership later revoked. Administrator status is not removed if user is the only XCreds admin user. Set as an Array of Strings of the group identifier.\",\n            \"property_order\": 55\n        },\n        \"claimsToAddToLocalUserAccount\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"Claims To Add To Local User Account\",\n            \"description\": \"List of claims that should be added to the user local account. Will be prefixed with _xcreds_oidc_. Set as an Array of Strings of the claim.\",\n            \"property_order\": 60\n        },\n        \"systemInfoAdditionsArray\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"System Info Additions\",\n            \"description\": \"Items to be added to the System Info Popover at login. Can be made dynamic by using the override script override to provide this setting\",\n            \"property_order\": 65\n        },\n        \"shouldSwitchToLoginWindowWhenLocked\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Switch To Login Window When Locked\",\n            \"default\": false,\n            \"description\": \"When set to true and the user locks the current session, XCreds will tell the system to switch to Login Window. The current session will stay active but the user will login with the XCreds Login Window to resume the session.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 70\n        },\n        \"LocalFallback\": {\n            \"type\": \"boolean\",\n            \"title\": \"LocalFallback\",\n            \"default\": false,\n            \"description\": \"If the user attempts to login as an AD user and the login fails against AD, try against local user account if off domain or AD user not found.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 75\n        },\n        \"shouldActivateSystemInfoButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Activate System Info Button\",\n            \"default\": true,\n            \"description\": \"Show the system info popover as active when first starting\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 80\n        },\n        \"discoveryURL\": {\n            \"type\": \"string\",\n            \"title\": \"Discovery URL\",\n            \"default\": \"https://login.microsoftonline.com/common/.well-known/openid-configuration\",\n            \"description\": \"The discovery URL provided by your OIDC / Cloud provider. For Google it is typically https://accounts.google.com/.well-known/openid-configuration and for Azure it is typically https://login.microsoftonline.com/common/.well-known/openid-configuration.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 85\n        },\n        \"EnableFDE\": {\n            \"type\": \"boolean\",\n            \"title\": \"Enable Full Disk Encryption (FDE)\",\n            \"default\": false,\n            \"description\": \"Enabled FDE enabled at first login on APFS disks.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 90\n        },\n        \"EnableFDERecoveryKey\": {\n            \"type\": \"boolean\",\n            \"title\": \"Save PRK\",\n            \"default\": false,\n            \"description\": \"Save the Personal Recovery Key (PRK) to disk for the MDM Escrow Service to collect.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 95\n        },\n        \"EnableFDERecoveryKeyPath\": {\n            \"type\": \"string\",\n            \"title\": \"FDE Recovery Key Path\",\n            \"description\": \"Specify a custom path for the recovery key.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 100\n        },\n        \"EnableFDERekey\": {\n            \"type\": \"boolean\",\n            \"title\": \"Enable FDE Rekey\",\n            \"default\": false,\n            \"description\": \"Rotate the Personal Recovery Key (PRK).\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 105\n        },\n        \"loginWindowWidth\": {\n            \"type\": \"integer\",\n            \"title\": \"Login Window Width\",\n            \"description\": \"Login Window webview width (Integer). If this is not defined, it will be full width. Minimum value of 150.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 110\n        },\n        \"loginWindowHeight\": {\n            \"type\": \"integer\",\n            \"title\": \"Login Window Height\",\n            \"description\": \"Login Window webview height (Integer). If this is not defined, it will be full height. Minimum value of 150.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 115\n        },\n        \"loadPageTitle\": {\n            \"type\": \"string\",\n            \"title\": \"LoadPage Title\",\n            \"default\": \"Please Wait....\",\n            \"description\": \"When no network connection or a profile is not defined, this title is shown in an HTML view to the user when cloud login is configured.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 120\n        },\n        \"loadPageInfo\": {\n            \"type\": \"string\",\n            \"title\": \"LoadPage Info\",\n            \"default\": \"(or try connecting to network or check preferences)\",\n            \"description\": \"When no network connection or a profile is not defined, this text is shown in an HTML view to the user when cloud login is configured.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 125\n        },\n        \"shouldHideLoginWindowLogo\": {\n            \"type\": \"boolean\",\n            \"title\": \"should Hide Login Window Logo\",\n            \"default\": false,\n            \"description\": \"Hide the login window logo.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 130\n        },\n        \"loginWindowLogoPath\": {\n            \"type\": \"string\",\n            \"title\": \"Login Window Logo Path\",\n            \"description\": \"URL to an image to show icon in the username / password login window\",\n            \"pattern\": \"(https?://|file:///).*\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 135\n        },\n        \"loginWindowBackgroundImageURL\": {\n            \"type\": \"string\",\n            \"title\": \"Login Window Background Image URL\",\n            \"default\": \"file:///System/Library/CoreServices/DefaultDesktop.heic\",\n            \"description\": \"URL to an image to show in the background while logging in. Default value: file:///System/Library/Desktop Pictures/Monterey Graphic.heic.\",\n            \"pattern\": \"(https?://|file:///).*\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 140\n        },\n        \"loginWindowBackgroundImageAlpha\": {\n            \"type\": \"number\",\n            \"title\": \"Login Window Background Image Alpha\",\n            \"default\": 1.0,\n            \"description\": \"Alpha value of loginWindowBackgroundImage. Default value: 1\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 145\n        },\n        \"loginWindowSecondaryMonitorsBackgroundImageURL\": {\n            \"type\": \"string\",\n            \"title\": \"Login Window Secondary Monitors Background Image URL\",\n            \"default\": \"file:///System/Library/CoreServices/DefaultDesktop.heic\",\n            \"description\": \"URL to an image to show in the background on secondary display while logging in. Default value: file:///System/Library/Desktop Pictures/Monterey Graphic.heic.\",\n            \"pattern\": \"(https?://|file:///).*\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 150\n        },\n        \"menuItemWindowBackgroundImageURL\": {\n            \"type\": \"string\",\n            \"title\": \"Menu Item Window BackgroundImageURL\",\n            \"description\": \"URL to an image to show in the background of the window that appears when logged in and prompting for Active Directory username and password.\",\n            \"pattern\": \"(https?://|file:///).*\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 155\n        },\n        \"menuItemWindowBackgroundImageAlpha\": {\n            \"type\": \"number\",\n            \"title\": \"Menu Item Background Image Alpha\",\n            \"default\": 1.0,\n            \"description\": \"Alpha value of menuItemWindowBackgroundImageURL. Default value: 1\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 160\n        },\n        \"shouldLoginWindowBackgroundImageFillScreen\": {\n            \"type\": \"boolean\",\n            \"title\": \"Login Window Background Image Fill Screen\",\n            \"default\": true,\n            \"description\": \"Set the background image to Fill Screen rather than Fit to Screen\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 165\n        },\n        \"shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen\": {\n            \"type\": \"boolean\",\n            \"title\": \"Login Window Secondary Monitors Background Image Fill Screen\",\n            \"default\": true,\n            \"description\": \"Set the secondary monitor(s) background image to Fill Screen rather than Fit to Screen\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 170\n        },\n        \"loginWindowSecondaryMonitorsBackgroundAlpha\": {\n            \"type\": \"number\",\n            \"title\": \"Login Window Secondary Monitors Background Image Alpha\",\n            \"default\": 1.0,\n            \"description\": \"Alpha value of loginWindowSecondaryMonitorsBackground. Default value: 1\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 175\n        },\n        \"shouldRemoveMenuItemAutoLaunch\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Remove Menu Item Auto Launch\",\n            \"default\": false,\n            \"description\": \"When XCreds is installed, a launch agent is installed to automatically keep the menu item running when a user is logged in. Setting shouldRemoveMenuItemAutoLaunch to true makes XCreds at the login window remove the launchagent plist that was installed. This will cause the launchagent to not launch XCreds menu item on log in.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 180\n        },\n        \"shouldUseADNativePasswordChangeMenuItem\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Use AD Native Password Change Menu Item\",\n            \"default\": false,\n            \"description\": \"When changing password via menu item, use the native UI to change password in Active Directory.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 185\n        },\n        \"passwordChangeURL\": {\n            \"type\": \"string\",\n            \"title\": \"Password Change URL for Menu\",\n            \"description\": \"Add a menu item for changing the password that will open this URL when the menu item is selected. If shouldUseADNativePasswordChangeMenuItem is set to true, this value is not used.\",\n            \"pattern\": \"https?://.*\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 190\n        },\n        \"redirectURI\": {\n            \"type\": \"string\",\n            \"title\": \"Redirect URI\",\n            \"default\": \"xcreds://auth/\",\n            \"description\": \"The URI passed back to the webview after successful authentication. Default value: xcreds://auth/\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 195\n        },\n        \"shouldShowCloudLoginByDefault\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Cloud Login By Default\",\n            \"default\": true,\n            \"description\": \"Determine if the Mac login window or the cloud login window is shown by default.  When not set or set to true, show cloud login. If false, shows Mac login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 200\n        },\n        \"refreshRateHours\": {\n            \"type\": \"integer\",\n            \"title\": \"Password Change Check Rate Hours\",\n            \"default\": 3,\n            \"description\": \"The number of hours between checks. Default value: 3. Minimum value: 0. Max value: 168.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 205\n        },\n        \"refreshRateMinutes\": {\n            \"type\": \"integer\",\n            \"title\": \"Password Change Check Rate Minutes\",\n            \"default\": 0,\n            \"description\": \"The number of minutes between checks. Default value: 0. Minimum value: 0. Max value: 59. This value is added to refreshRateHours. If refreshRateHours is 0, minimum for refreshRateMinutes becomes 5.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 210\n        },\n        \"scopes\": {\n            \"type\": \"string\",\n            \"title\": \"Scopes\",\n            \"default\": \"profile openid offline_access\",\n            \"description\": \"Scopes tell the identify provider what information to return. Note that the values are provided with a single space between them.\\n\\nProvide the following values the follow IdPs:\\n\\nGoogle: profile openid email\\nAzure: profile openid offline_access\\n\\nNote that Google does not support the offline_access scope so instead use the preference shouldSetGoogleAccessTypeToOffline. Azure provides unique_name which is mapped to the local user account by using the prefix before \\\"@\\\" in unique_name and matching to the short name of a user account. Google provides \\\"email\\\" and is matched in the same way.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 215\n        },\n        \"shouldSetGoogleAccessTypeToOffline\": {\n            \"type\": \"boolean\",\n            \"title\": \"Request Google Refresh Token\",\n            \"default\": false,\n            \"description\": \"When using Google IdP, a refresh token may need be requested in a non-standard way.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 220\n        },\n        \"shouldPromptForADPasswordChange\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Prompt For AD Password Change\",\n            \"default\": true,\n            \"description\": \"If the domain controller returns back that the password is expired or needs to be changed, prompt the user. If this is set to false, login will fail and an error message will be shown.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 225\n        },\n        \"shouldShowSignInMenuItem\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Sign In Menu Item\",\n            \"default\": true,\n            \"description\": \"Determine if the Sign In menu item is shown in the XCreds menu. When not set or set to true, show Sign In. If false, the Sign In menu item is hidden.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 230\n        },\n        \"shouldSuppressLocalPasswordPrompt\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Suppress Local Password Prompt\",\n            \"default\": false,\n            \"description\": \"Do not prompt for local password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 235\n        },\n        \"shouldPreferLocalLoginInsteadOfCloudLogin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Prefer Local Login over Cloud Login\",\n            \"default\": false,\n            \"description\": \"Favor using XCreds' local login screen over the cloud login UI.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 240\n        },\n        \"shouldVerifyPasswordWithRopg\": {\n            \"type\": \"boolean\",\n            \"title\": \"Use ROPG when testing password\",\n            \"default\": false,\n            \"description\": \"(Deprecated in v4.0) When verifying password in the menu app, use ROPG.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 245\n        },\n        \"shouldUseBasicAuthWithROPG\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Use Basic Auth With ROPG\",\n            \"default\": false,\n            \"description\": \"When using ROPG, do basic HTTP auth. Default: false\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 250\n        },\n        \"ropgClientID\": {\n            \"type\": \"string\",\n            \"title\": \"ROPG Client ID\",\n            \"description\": \"(Removed in v4.0) ROPG Client ID for use when checking password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 255\n        },\n        \"ropgClientSecret\": {\n            \"type\": \"string\",\n            \"title\": \"ROPG Client Secret\",\n            \"description\": \"(Removed in v4.0) ROPG Client Secret for use when checking password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 260\n        },\n        \"shouldUseROPGForLoginWindowLogin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Use ROPG when logging in at login window\",\n            \"default\": false,\n            \"description\": \"When verifying password in the login window, use ROPG.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 265\n        },\n        \"shouldUseROPGForMenuLogin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Use ROPG for menu login\",\n            \"default\": false,\n            \"description\": \"When verifying password in the menu app, use ROPG.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 270\n        },\n        \"shouldUseROPGForPasswordChangeChecking\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Use ROPG For Password Change Checking\",\n            \"default\": false,\n            \"description\": \"When verifying local password matches cloud password in the background, use ROPG. If set to false, the refresh token will be used to verify password change.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 275\n        },\n        \"shouldUseLDAPForPasswordChangeChecking\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Use LDAP For Password Change Checking\",\n            \"default\": false,\n            \"description\": \"When verifying local password matches cloud password in the background, use Google LDAP. If set to false, the refresh token will be used to verify password change.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 280\n        },\n        \"resource\": {\n            \"type\": \"string\",\n            \"title\": \"ROPG Resource\",\n            \"description\": \"Resource URL when using ROPG. Typically needed only for Azure. Common value is https://graph.microsoft.com\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 285\n        },\n        \"ropgResponseValue\": {\n            \"type\": \"string\",\n            \"title\": \"ROPG Response Value\",\n            \"default\": \"interaction_required\",\n            \"description\": \"When a ROPG request is completed successfully to verify password, it may return an error that two factor is required. Add the string that is returned for the JSON response. For Azure, it is typically interaction_required. For Okta, the response is usually {\\\"error\\\":\\\"invalid_grant\\\",\\\"error_description\\\":\\\"Resource owner password credentials authentication denied by sign on policy.\\\"} Can be a string or an array of strings.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 290\n        },\n        \"hideIfPathExists\": {\n            \"type\": \"string\",\n            \"title\": \"Hide If Path Exists\",\n            \"description\": \"Don't show the UI if this key is defined and a file or folder exists at this path.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 295\n        },\n        \"aliasName\": {\n            \"type\": \"string\",\n            \"title\": \"Alias Name\",\n            \"description\": \"Name of OIDC claim that contains an alias to add to a user account. Usually this is the \\\"upn\\\" (eg syd@twocanoes.com) so the user can log in at the standard login window the same as the IdP login window. Adds the value to record name of the user account as an alias.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 300\n        },\n        \"autoRefreshLoginTimer\": {\n            \"type\": \"integer\",\n            \"title\": \"Automatically Refresh Login Window (seconds)\",\n            \"default\": 0,\n            \"description\": \"Timer for automatically refreshing login screen in seconds. If set to 0, does not automatically refresh.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 305\n        },\n        \"cloudLoginText\": {\n            \"type\": \"string\",\n            \"title\": \"Cloud Login Text\",\n            \"default\": \"Cloud Login\",\n            \"description\": \"Text for return to cloud login on Mac login screen\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 310\n        },\n        \"shouldShowAboutMenu\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show About Menu\",\n            \"default\": true,\n            \"description\": \"Show the About Menu item menu. Default value: true\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 315\n        },\n        \"shouldSkipFileVaultLogin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Skip FileVault Login\",\n            \"default\": false,\n            \"description\": \"Skip FileVault login during startup if FileVault is enabled. The current username and password are used to tell fdesetup to silently use the credentials during next reboot to unlock FileVault. Passthrough is also disabled and the user will see the XCreds Login Window. To avoid the user being prompted for admin credentials, set the \\\"Login And Background Item Management\\\" management item (com.apple.servicemanagement) to allow teamid UXP6YEHSPW to have background tasks.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 320\n        },\n        \"shouldSkipFileVaultLoginAdmin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Skip FileVault Login as Admin\",\n            \"default\": false,\n            \"description\": \"Skip FileVault authentication at startup if FileVault is enabled. The admin credentials will be used to tell fdesetup to silently use the credentials during next reboot to unlock FileVault. Passthrough is also disabled and the user will see the XCreds Login Window. To avoid the user being prompted for admin credentials, set the \\\"Login And Background Item Management\\\" management item (com.apple.servicemanagement) to allow teamid UXP6YEHSPW to have background tasks. Default value: false\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 325\n        },\n        \"shouldShowMenuBarSignInWithoutLoginWindowSignin\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Show Menu Bar Sign In Without Login Window Sign In\",\n            \"default\": false,\n            \"description\": \"If the discovery URL is defined and there are no tokens or tickets, the sign in window in the user session will show even if the user did not log in from the XCreds Login Window\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 330\n        },\n        \"refreshBannerText\": {\n            \"type\": \"string\",\n            \"title\": \"Refresh Banner Text\",\n            \"default\": \"Log in to verify your cloud credentials. After verification, your local user account password will be set to your cloud password.\",\n            \"description\": \"Text at top of window shown in user session when prompting for password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 335\n        },\n        \"shouldShowRefreshBanner\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Refresh Banner\",\n            \"default\": true,\n            \"description\": \"Show text at the top of the prompt window when tokens expire.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 340\n        },\n        \"shouldShowConfigureWifiButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Configure WiFi\",\n            \"default\": true,\n            \"description\": \"Show Configure WiFi button in XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 345\n        },\n        \"shouldShowShutdownButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Shutdown Button\",\n            \"default\": true,\n            \"description\": \"Show Shutdown button in XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 350\n        },\n        \"shouldShowRestartButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Restart Button\",\n            \"default\": true,\n            \"description\": \"Show Restart button in XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 355\n        },\n        \"shouldShowSystemInfoButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show System Info Button\",\n            \"default\": true,\n            \"description\": \"Show Configure System Info in XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 360\n        },\n        \"shouldShowPreferencesOnStart\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Preferences on Startup\",\n            \"default\": false,\n            \"description\": \"Show Settings on start if none are defined. Default value: false\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 365\n        },\n        \"shouldPromptForMigration\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Prompt for Migration\",\n            \"default\": false,\n            \"description\": \"Prompt for local account username and password if no account was mapped and there are standard users already on the system.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 370\n        },\n        \"shouldAllowKeyComboForMacLoginWindow\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Allow Key Combo For Mac Login Window\",\n            \"default\": false,\n            \"description\": \"Allow key combo (control-option return) to switch logon window. Use command-option-control-return for Mac Login Window. \",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 375\n        },\n        \"keyCodeForLoginWindowChange\": {\n            \"type\": \"integer\",\n            \"title\": \"Key Code For Login Window Change\",\n            \"description\": \"key code for shouldAllowKeyComboForMacLoginWindow. If not defined, it is return or enter. If this is defined, this key is used with control-option to switch to login window and command-option-control and this key is used to switch to Mac Login Window. Uses CGKeyCode (for example, enter is 76 and return is 36)\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 380\n        },\n        \"shouldShowMacLoginButton\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Mac Login Window button\",\n            \"default\": true,\n            \"description\": \"Show the Mac Login Window button in XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 385\n        },\n        \"shouldShowLocalOnlyCheckbox\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Local Only Checkbox\",\n            \"default\": true,\n            \"description\": \"Show the local only checkbox on the local login page \",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 390\n        },\n        \"usernamePlaceholder\": {\n            \"type\": \"string\",\n            \"title\": \"Username Placeholder Text\",\n            \"description\": \"Placeholder text in local / AD login window for username\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 395\n        },\n        \"passwordPlaceholder\": {\n            \"type\": \"string\",\n            \"title\": \"Password Placeholder Text\",\n            \"description\": \"Placeholder text in local / AD login window for password\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 400\n        },\n        \"shouldShowSupportStatus\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Support Status Message\",\n            \"default\": true,\n            \"description\": \"Show message in XCreds Login reminding people to buy support.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 405\n        },\n        \"shouldShowQuitMenu\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Quit Menu Item\",\n            \"default\": false,\n            \"description\": \"Show Quit in the menu item menu. Default value: true\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 410\n        },\n        \"shouldShowVersionInfo\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Version and Build Number\",\n            \"default\": true,\n            \"description\": \"(Removed in v5.4 and replaced by shouldActivateSystemInfoButton) Show the version number and build number in the lower left corner of XCreds Login.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 415\n        },\n        \"showDebug\": {\n            \"type\": \"boolean\",\n            \"title\": \"Show Debug Message\",\n            \"default\": false,\n            \"description\": \"Show push notifications for authentication progress. Default value: false\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 420\n        },\n        \"username\": {\n            \"type\": \"string\",\n            \"title\": \"Local Username\",\n            \"description\": \"When a user uses cloud login, XCreds will try and figure out the local username based on the email or other data returned for the IdP. Use this value to force the local username for any cloud login. Provide only the shortname.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 425\n        },\n        \"KeychainReset\": {\n            \"type\": \"boolean\",\n            \"title\": \"Keychain Reset\",\n            \"default\": false,\n            \"description\": \"When a local user password does not match the cloud or AD password, this key will allow the user to select a Reset button to set their password to match their AD/cloud password, move their current keychain aside and create a new keychain. If XCreds does not have access to local admin credentials set from the XCreds command line tools, the user will prompted to enter local admin credentials.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 430\n        },\n        \"PasswordOverwriteSilent\": {\n            \"type\": \"boolean\",\n            \"title\": \"Overwrite Password Silently\",\n            \"default\": false,\n            \"description\": \"Update the local user password silently to match the cloud / AD password. Requires access to admin credentials. See command line help to set admin username and password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 435\n        },\n        \"HideExpiration\": {\n            \"type\": \"boolean\",\n            \"title\": \"Hide Expiration\",\n            \"default\": false,\n            \"description\": \"Hide AD Expiration even if defined in AD Account\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 440\n        },\n        \"localAdminUserName\": {\n            \"type\": \"string\",\n            \"title\": \"Local Admin User Name\",\n            \"description\": \"Username of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 445\n        },\n        \"localAdminPassword\": {\n            \"type\": \"string\",\n            \"title\": \"Local Admin Password\",\n            \"description\": \"Password of local admin user. DO NOT SET THIS IN PREFERENCES. It is recommended to set this with the settingsOverrideScriptPath script. This user is used to reset the keychain if the user forgets their local password and to setup a secure token for newly created users.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 450\n        },\n        \"accountLockedPasswordDialogTitle\": {\n            \"type\": \"string\",\n            \"title\": \"Account Locked Password Dialog Title\",\n            \"default\": \"Unlock Account\",\n            \"description\": \"Title of dialog prompting user to enter in their prior local password when account is locked.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 455\n        },\n        \"accountLockedPasswordDialogText\": {\n            \"type\": \"string\",\n            \"title\": \"Account Locked Password Dialog Text\",\n            \"default\": \"The user account is locked.  You can wait for the account to unlock or reset the password by clicking the Reset button below.\",\n            \"description\": \"Text of dialog prompting user to enter in their prior local password when account is locked.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 460\n        },\n        \"resetPasswordDialogTitle\": {\n            \"type\": \"string\",\n            \"title\": \"Reset Password Dialog Title\",\n            \"default\": \"Please enter your local login password to sync your cloud password and login.\",\n            \"description\": \"Title of dialog prompting user to enter in their prior local password.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 465\n        },\n        \"systemInfoButtonTitle\": {\n            \"type\": \"string\",\n            \"title\": \"System Info Button Title\",\n            \"default\": \"System Info\",\n            \"description\": \"The title of the button for system info in the bottom right corner of the login screen. This can either be plain text or one of these special values: .os, .hostname, .ipaddress, .serial, .mac, .computername, .ssid. Using the special value will populate the associated information as the button title.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 470\n        },\n        \"verifyPassword\": {\n            \"type\": \"boolean\",\n            \"title\": \"Verify Cloud Password\",\n            \"default\": true,\n            \"description\": \"When cloud password is changed and the local keychain password and local user account needs to be changed, a verification dialog can be shown to verify the password. Default value: true\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 475\n        },\n        \"shouldDetectNetworkToDetermineLoginWindow\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Detect Network To Determine Login Window\",\n            \"default\": false,\n            \"description\": \"Check if network is up. If not, select username and password login window.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 480\n        },\n        \"idpHostName\": {\n            \"type\": \"string\",\n            \"title\": \"IDP Host Name\",\n            \"description\": \"Hostname of the page that has the password field. When the user submits the form, XCreds will use idpHostName to identify a page it needs to look for the password field. The password value is identified by an HTML id defined by passwordElementID. If this value is not defined. XCreds will look for login.microsoftonline.com and accounts.google.com. This value is commonly set for other IdP’s and for Azure environments that use ADFS.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 485\n        },\n        \"idpHostNames\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"IDP Host Names\",\n            \"description\": \"array of hostnames of the page that has the password field.\",\n            \"property_order\": 490\n        },\n        \"AdditionalADDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"Additional AD Domains\",\n            \"description\": \"array of additional AD domains to accept\",\n            \"property_order\": 495\n        },\n        \"ccidSlotName\": {\n            \"type\": \"string\",\n            \"title\": \"CCID Slot Name\",\n            \"description\": \"Name of slot for CCID reader for reading RFID cards\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 500\n        },\n        \"shouldAllowLoginCardSetup\": {\n            \"type\": \"boolean\",\n            \"title\": \"Should Allow Login Card Setup\",\n            \"default\": true,\n            \"description\": \"If an unknown RFID card is tapped, show option to pair with local account.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 505\n        },\n        \"adUserAttributesToAddToLocalUserAccount\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"string\"\n            },\n            \"title\": \"AD User Attributes To Add To Local User Account\",\n            \"description\": \"array of AD user attributes to add to local directory user account\",\n            \"property_order\": 510\n        },\n        \"passwordElementID\": {\n            \"type\": \"string\",\n            \"title\": \"Password Element ID\",\n            \"description\": \"Password element id of the html element that has the password. It is read by using JavaScript to get the value (for example, for Azure, the JavaScript document.getElementById('i0118').value is sent. If this default is not set, standard values for Azure and Google Cloud will be used. To find out this value, use a browser to inspect the source of the page that has the password on it. Find the id of the textfield that has the password. Fill in the password and then open the JavaScript console. Run:\\n\\ndocument.getElementById('passwordID').value\\n\\nchanging \\\"passwordID\\\" to the correct element ID. If the value you typed into the textfield is returned, this is the correct ID.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 515\n        },\n        \"map_firstname\": {\n            \"type\": \"string\",\n            \"title\": \"First Name OIDC Mapping/AD Attribute\",\n            \"default\": \"given_name\",\n            \"description\": \"Local DS to OIDC/AD Mapping for First Name. Default value: \\\"given_name\\\" (OIDC), \\\"givenName\\\" (AD). map_firstname should be set to an OIDC claim/AD Attribute for first name.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 520\n        },\n        \"map_lastname\": {\n            \"type\": \"string\",\n            \"title\": \"Last Name OIDC Mapping\",\n            \"default\": \"family_name\",\n            \"description\": \"Local DS to OIDC/AD Mapping for Last Name. Default value: \\\"family_name\\\" (OIDC), \\\"sn\\\" (AD). map_lastname should be set to an OIDC claim for last name.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 525\n        },\n        \"map_fullname\": {\n            \"type\": \"string\",\n            \"title\": \"Full Name OIDC Mapping/AD Attribute\",\n            \"default\": \"name\",\n            \"description\": \"Local DS to OIDC/AD Attribute Mapping for Full Name. Default value: \\\"name\\\"(OIDC), \\\"displayName\\\" (AD). map_fullname should be set to an OIDC claim/AD Attribute for full name.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 530\n        },\n        \"map_username\": {\n            \"type\": \"string\",\n            \"title\": \"Username OIDC Mapping/AD Attribute\",\n            \"default\": \"name\",\n            \"description\": \"Local DS to OIDC Mapping/AD Attribute for Name. Default value: \\\"name\\\" (OIDC), \\\"userPrincipalName\\\" (AD). map_username should be set to an OIDC claim/AD Attribute for name. The macOS username will be set as the portion of this value before an @ symbol if present.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 535\n        },\n        \"map_fullusername\": {\n            \"type\": \"string\",\n            \"title\": \"Full Username OIDC Mapping/AD Attribute\",\n            \"default\": \"name\",\n            \"description\": \"Local DS to OIDC Mapping for Full Username (for example, freddy@twocanoes.com) Default value: \\\"unique_name\\\". map_username should be set to an OIDC claim for full username.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 540\n        },\n        \"map_uid\": {\n            \"type\": \"string\",\n            \"title\": \"Map UID\",\n            \"description\": \"Local DS to OIDC Mapping/AD Attribute for UID at initial user creation. If not set, the uid will be set to the next available. If the mapped UID is used, login will fail.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 545\n        },\n        \"primaryGroupID\": {\n            \"type\": \"string\",\n            \"title\": \"Primary Group ID\",\n            \"default\": \"20\",\n            \"description\": \"Primary Group ID when creating a new user. Default value 20.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 550\n        },\n        \"map_password_expiry\": {\n            \"type\": \"string\",\n            \"title\": \"Map OIDC claim to Password Expiry in Seconds\",\n            \"default\": \"pwd_exp\",\n            \"description\": \"Password expiry mapping to claim. If this value is set to an OIDC claim, the value in that claim should be the number of seconds from the token issued time (iat) to the expiry date. \",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 555\n        },\n        \"settingsOverrideScriptPath\": {\n            \"type\": \"string\",\n            \"title\": \"Override Script Path\",\n            \"default\": \"name\",\n            \"description\": \"Script to override defaults. Must return valid property list with specified defaults. Script must exist at path, be owned by _securityagent and writable and executable only by _securityagent.\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 560\n        },\n        \"upnSuffixToDomainMappings\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"upn\": {\n                        \"type\": \"string\",\n                        \"title\": \"UPN\",\n                        \"description\": \"UPN\"\n                    },\n                    \"domain\": {\n                        \"type\": \"string\",\n                        \"title\": \"domain\",\n                        \"description\": \"domain\"\n                    }\n                }\n            },\n            \"title\": \"UPN Suffix To Domain Mappings\",\n            \"description\": \"In some Active Directory environments, users do not use username@domain to login; they use a UPN suffix to make the username easier to use. This setting maps the UPN suffix to the correct AD domain name. For example, if you have an AD domain of foo.com but want users to sign in as user@bar.com, a UPN suffix of foo.com is created in AD and the user account is set to user@foo.com. This setting then would map foo.com to bar.com by setting the key upn to foo.com and the domain key to bar.com.\",\n            \"property_order\": 565\n        },\n        \"menuItems\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"object\",\n                \"title\": \"Optional Menu Items\",\n                \"description\": \"Menu Item Name\",\n                \"properties\": {\n                    \"menuItemName\": {\n                        \"type\": \"string\",\n                        \"title\": \"Menu Item Name\",\n                        \"description\": \"Menu Item\"\n                    },\n                    \"linkOrAppPath\": {\n                        \"type\": \"string\",\n                        \"title\": \"Web page URL or local path to app\",\n                        \"description\": \"Link or App Path\"\n                    },\n                    \"separatorBefore\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"Separator Before\",\n                        \"default\": false,\n                        \"description\": \"Separator line before menu item\"\n                    },\n                    \"separatorAfter\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"Separator After\",\n                        \"default\": false,\n                        \"description\": \"Separator line after menu item\"\n                    }\n                }\n            },\n            \"title\": \"Menu Items\",\n            \"description\": \"Menu Items\",\n            \"property_order\": 570\n        },\n        \"Shares\": {\n            \"type\": \"array\",\n            \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"Name\": {\n                        \"type\": \"string\",\n                        \"title\": \"Name\",\n                        \"description\": \"Name of share to show in menu\"\n                    },\n                    \"URL\": {\n                        \"type\": \"string\",\n                        \"title\": \"URL\",\n                        \"description\": \"URL for share (eg smb://server.example.com/share)\"\n                    },\n                    \"Groups\": {\n                        \"type\": \"array\",\n                        \"items\": {},\n                        \"title\": \"Groups\"\n                    },\n                    \"ConnectedOnly\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"ConnectedOnly\",\n                        \"description\": \"Allow mounting only if network connection is detected\"\n                    },\n                    \"AutoMount\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"AutoMount\",\n                        \"description\": \"Automatically mount when XCreds starts\"\n                    }\n                }\n            },\n            \"title\": \"Shares\",\n            \"description\": \"Add menu item and mount/automount shares\",\n            \"property_order\": 575\n        },\n        \"HomeMountEnabled\": {\n            \"type\": \"boolean\",\n            \"title\": \"Home Mount Enabled\",\n            \"default\": true,\n            \"description\": \"Show and mount home directory from AD profile if defined.\",\n            \"property_order\": 580\n        },\n        \"HomeAppendDomain\": {\n            \"type\": \"boolean\",\n            \"title\": \"Home Append Domain\",\n            \"default\": false,\n            \"description\": \"Append the domain name to the share defined in the profile.\",\n            \"property_order\": 585\n        },\n        \"shareMenuItemName\": {\n            \"type\": \"string\",\n            \"title\": \"Share Menu Item Name\",\n            \"description\": \"Name for Shares menu item. Default: \\\"Shares\\\".\",\n            \"links\": [\n                {\n                    \"rel\": \"More information\",\n                    \"href\": \"https://twocanoes.com/knowledge-base/xcreds-admin-guide/#preferences\"\n                }\n            ],\n            \"property_order\": 590\n        }\n    }\n}"
  },
  {
    "path": "README-Resources.md",
    "content": "Sample configuration profiles, manifest, and share config is located at:\n\nhttps://twocanoes-app-resources.s3.amazonaws.com/xcreds/xcreds-4_0-resources.zip\n"
  },
  {
    "path": "README.md",
    "content": "# XCreds: Sync Your Cloud Password to your Mac\n\n## How It Works\nXCreds has 2 components: the XCreds app that runs in user space and XCreds Login Window that is a security agent that runs when the user is logging in to their mac. Both the security agent and the app share keychain items in the user's keychain to key track of the current local password and the tokens from the cloud provider. Both items prompt the user withe a web view to authenticate to their cloud provider, verify log in was successful and then updates the local password and user keychain passwords as needed. \n\n## Requirements\nXCreds currently works with Azure and Google cloud as an OIDC identity provider. It has been tested on macOS Monterey but should support earlier version of macOS.\n\n## Components\nXCreds consists of XCreds Login and XCreds app. They do similar tasks but run at different times. \n\n### XCreds Login\nXCreds Login is a Security Agent that replaces the login window on macOS to provide authentication to the cloud provider. It presents a web view at the login window and fully supports multi-factor authentication. When authentication completes, the web view receives Open Id Connect (OIDC) tokens and stores those tokens in the login keychain. If the local password and the cloud password are different, the local password is updated to match the cloud password and the login keychain password is updated a well. The local password is then stored in the user keychain so that any password changes in the future can be updated silently. Only the security agent and the XCreds app are given permission to access the password and tokens.\n\n### XCreds App\nThe XCreds app runs when the user logs in. On first launch, it checks to see if xcreds tokens as available in the login keychain. If they are, the refresh token is used to see if it is still valid. If it is invalid (due to a remote password change), the user is prompted with a web view to authenticate with their cloud credentials. If they authenticate successfully, the tokens are updated in the login keychain and the password is check to see if it has been changed. If it changed, the local account and login keychain is updated to match the cloud password. \n\n## Setup and Configuration\n\nSee the [admin guide](https://github.com/twocanoes/xcreds/wiki/AdminGuide) on the wiki.\n\n## Video\nSee the [video on youtube](https://www.youtube.com/watch?v=qtPy5ddp9kg&list=PLFtGGT240LAMYGcueZT76BySBQRFCzdce)\n\n## Support\nPlease join the #xcreds MacAdmins slack channel for any questions you have. \n\n## Thanks\n\nSpecial thanks to North Carolina State University and Everette Allen for supporting this project.\n\nOIDCLite is Copyright (c) 2022 Joel Rennich (https://gitlab.com/Mactroll/OIDCLite) under MIT License.\n\nXCreds is licensed under BSD Open Source License.\n\n\n"
  },
  {
    "path": "Sample Profile/Auth0OIDC.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.86350731-1130-4F85-AAA8-A99BBBD55F8E.com.twocanoes.xcreds.07C53DE9-CA33-4E52-A008-F5EA5068D819</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>07C53DE9-CA33-4E52-A008-F5EA5068D819</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>R150TTFcwSNIhEg7j9v44DZpISe40R7C</string>\n\t\t\t<key>clientSecret</key>\n\t\t\t<string>NoQ1usaOzVMDvPKfTGfW1EF3vdiA-1_xcsBHPJ8IH17jNXraljLsOLJ__5_RNbpM</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://dev-4vea1756mp0xnss6.us.auth0.com/.well-known/openid-configuration</string>\n\t\t\t<key>idpHostName</key>\n\t\t\t<string>dev-4vea1756mp0xnss6.us.auth0.com</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid offline_access xcreds</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDisplayName</key>\n\t<string>Auth0 OIDC</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreator.86350731-1130-4F85-AAA8-A99BBBD55F8E</string>\n\t<key>PayloadOrganization</key>\n\t<string>Twocanoes Software, Inc</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>86350731-1130-4F85-AAA8-A99BBBD55F8E</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Only Just Domain.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Only backgtround.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>93392af1-8e10-4691-9702-a4d5e7f7c781</string>\n\t\t\t\t<string>47b36644-8477-4194-b42d-9e519e9193e7</string>\n\t\t\t</array>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n\t\t\t<key>menuItemWindowBackgroundImageURL</key>\n\t\t\t<string>https://fastly.picsum.photos/id/372/1500/1500.jpg?hmac=zlpxcyac6DNQTPTFpYVh94P9leqIknZ1ATvb4I-3NSQ</string>\n\t\t\t<key>shouldLoginWindowBackgroundImageFillScreen</key>\n\t\t\t<false/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Only copy.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>hideExpiration</key>\n\t\t\t<true/>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>93392af1-8e10-4691-9702-a4d5e7f7c781</string>\n\t\t\t\t<string>47b36644-8477-4194-b42d-9e519e9193e7</string>\n\t\t\t</array>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Only.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>93392af1-8e10-4691-9702-a4d5e7f7c781</string>\n\t\t\t\t<string>47b36644-8477-4194-b42d-9e519e9193e7</string>\n\t\t\t</array>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Only_admin_group.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>Administrators</string>\n\t\t\t</array>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Onlysubdomain.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>hideExpiration</key>\n\t\t\t<true/>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>AdditionalADDomains</key>\n\t\t\t<array>\n\t\t\t\t<string>paddle.twocanoes.com</string>\n\t\t\t</array>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD Onlysubdomain_upn_mappings.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>hideExpiration</key>\n\t\t\t<true/>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>AdditionalADDomains</key>\n\t\t\t<array>\n\t\t\t\t<string>paddle.twocanoes.com</string>\n\t\t\t</array>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>upnSuffixToDomainMappings</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>upn</key>\n\t\t\t\t\t<string>naperville.twocanoes.com</string>\n\t\t\t\t\t<key>domain</key>\n\t\t\t\t\t<string>paddle.twocanoes.com</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>upn</key>\n\t\t\t\t\t<string>chicago.twocanoes.com</string>\n\t\t\t\t\t<key>domain</key>\n\t\t\t\t\t<string>twocanoes.com</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD With Menu and Shares.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>93392af1-8e10-4691-9702-a4d5e7f7c781</string>\n\t\t\t\t<string>47b36644-8477-4194-b42d-9e519e9193e7</string>\n\t\t\t</array>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>HomeMountEnabled</key>\n\t\t\t<false/>\n\t\t\t<key>HomeMountOptions</key>\n\t\t\t<array/>\n\t\t\t<key>HomeMountGroups</key>\n\t\t\t<array>\n\t\t\t\t<string>All</string>\n\t\t\t</array>\n\t\t\t<key>Shares</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Groups</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<string>XCred Shares</string>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>ConnectedOnly</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Options</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>LocalMount</key>\n\t\t\t\t\t<string></string>\n\t\t\t\t\t<key>AutoMount</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Name</key>\n\t\t\t\t\t<string>server22 files</string>\n\t\t\t\t\t<key>URL</key>\n\t\t\t\t\t<string>smb://server22.twocanoes.com/Files</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Groups</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>ConnectedOnly</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Options</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>LocalMount</key>\n\t\t\t\t\t<string></string>\n\t\t\t\t\t<key>AutoMount</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Name</key>\n\t\t\t\t\t<string>Home Shares</string>\n\t\t\t\t\t<key>URL</key>\n\t\t\t\t\t<string>smb://dc1.nomad.test/Homes</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Groups</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>ConnectedOnly</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>Options</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>LocalMount</key>\n\t\t\t\t\t<string></string>\n\t\t\t\t\t<key>AutoMount</key>\n\t\t\t\t\t<false/>\n\t\t\t\t\t<key>Name</key>\n\t\t\t\t\t<string>File Space</string>\n\t\t\t\t\t<key>URL</key>\n\t\t\t\t\t<string>smb://dc1.nomad.test/File Space</string>\n\t\t\t\t</dict>\n                <dict>\n                    <key>Groups</key>\n                    <array>\n                        <string>one</string>\n                    </array>\n                    <key>Options</key>\n                    <array/>\n                    <key>LocalMount</key>\n                    <string></string>\n                    <key>AutoMount</key>\n                    <false/>\n                    <key>Name</key>\n                    <string>File Space</string>\n                    <key>URL</key>\n                    <string>smb://dc1.nomad.test/File Space</string>\n                </dict>\n\n\t\t\t</array>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t\t<key>menuItems</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>linkOrAppPath</key>\n\t\t\t\t\t<string>https://twocanoes.com</string>\n\t\t\t\t\t<key>menuItemName</key>\n\t\t\t\t\t<string>Home</string>\n\t\t\t\t\t<key>separatorAfter</key>\n\t\t\t\t\t<false/>\n\t\t\t\t\t<key>separatorBefore</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>linkOrAppPath</key>\n\t\t\t\t\t<string>/System/Applications/Utilities/Keychain Access.app</string>\n\t\t\t\t\t<key>menuItemName</key>\n\t\t\t\t\t<string>Keychain Access</string>\n\t\t\t\t\t<key>separatorAfter</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>separatorBefore</key>\n\t\t\t\t\t<false/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds-AD With Menu.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t\t<key>CreateAdminIfGroupMember</key>\n\t\t\t<array>\n\t\t\t\t<string>93392af1-8e10-4691-9702-a4d5e7f7c781</string>\n\t\t\t\t<string>47b36644-8477-4194-b42d-9e519e9193e7</string>\n\t\t\t</array>\n\t\t\t<key>passwordChangeURL</key>\n\t\t\t<string>ADNative</string>\n\t\t\t<key>PasswordOverwriteSilent</key>\n\t\t\t<true/>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t\t\t<true/>\n            <key>settingsOverrideScriptPath</key>\n            <string>/usr/local/xcreds/override.sh</string>\n\t\t\t<key>refreshRateHours</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>refreshRateMinutes</key>\n\t\t\t<integer>5</integer>\n\t\t\t<key>menuItems</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>linkOrAppPath</key>\n\t\t\t\t\t<string>https://twocanoes.com</string>\n\t\t\t\t\t<key>menuItemName</key>\n\t\t\t\t\t<string>Home</string>\n\t\t\t\t\t<key>separatorAfter</key>\n\t\t\t\t\t<false/>\n\t\t\t\t\t<key>separatorBefore</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>linkOrAppPath</key>\n\t\t\t\t\t<string>/System/Applications/Utilities/Keychain Access.app</string>\n\t\t\t\t\t<key>menuItemName</key>\n\t\t\t\t\t<string>Keychain Access</string>\n\t\t\t\t\t<key>separatorAfter</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>separatorBefore</key>\n\t\t\t\t\t<false/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>AD Only</string>\n\t<key>PayloadDisplayName</key>\n\t<string>xcreds-AD Only</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreat0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_allow_fred.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<false/>\n\t\t\t<key>map_firstname</key>\n\t\t\t<string>given_name</string>\n\t\t\t<key>map_fullname</key>\n\t\t\t<string>name</string>\n\t\t\t<key>map_lastname</key>\n\t\t\t<string>family_name</string>\n\t\t\t<key>map_username</key>\n\t\t\t<string>name</string>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowBackgroundImageURL</key>\n\t\t\t<string>file:///System/Library/Desktop Pictures/Monterey Graphic.heic</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>allowedUsersArray</key>\n\t\t\t<array>\n\t\t\t\t<string>fred@twocanoes.com</string>\n\t\t\t</array>\n\t\t\t<key>allowUsersClaim</key>\n\t\t\t<string>upn</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_background.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n\t\t\t<key>loginWindowBackgroundImageURL</key>\n\t\t\t<string>file:///Applications/XCreds.app/Contents/Resources/colorline.png</string>\n\t\t\t<key>loginWindowSecondaryMonitorsBackgroundImageURL</key>\n\t\t\t<string>file:///Applications/XCreds.app/Contents/Resources/colorline.png</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>shouldLoginWindowBackgroundImageFillScreen</key>\n\t\t\t<false/>\n\t\t\t<key>shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_hide.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<false/>\n\t\t\t<key>map_firstname</key>\n\t\t\t<string>given_name</string>\n\t\t\t<key>map_fullname</key>\n\t\t\t<string>name</string>\n\t\t\t<key>map_lastname</key>\n\t\t\t<string>family_name</string>\n\t\t\t<key>map_username</key>\n\t\t\t<string>name</string>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowBackgroundImageURL</key>\n\t\t\t<string>file:///System/Library/Desktop Pictures/Monterey Graphic.heic</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t\t<key>hideIfPathExists</key>\n\t\t\t<string>/tmp/hide</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n\t\t\t<key>shouldShowQuitMenu</key>\n\t\t\t<false/>\n            <key>loadPageTitle</key>\n            <string>This is a custom title!</string>\n            <key>loadPageInfo</key>\n            <string>please make sure add in some interest interesting information and let the user to click Refresh.\\n\\nHi Mom!\n            </string>\n\t\t\t<key>map_firstname</key>\n\t\t\t<string>given_name</string>\n\t\t\t<key>map_fullname</key>\n\t\t\t<string>name</string>\n\t\t\t<key>map_lastname</key>\n\t\t\t<string>family_name</string>\n\t\t\t<key>map_username</key>\n\t\t\t<string>name</string>\n\t\t\t<key>cloudLoginText</key>\n\t\t\t<string>Back to XCreds</string>\n\t\t\t<key>loginWindowBackgroundImageURL</key>\n\t\t\t<string>file:///System/Library/Desktop Pictures/Monterey Graphic.heic</string>\n\t\t\t<key>loginWindowHeight</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>loginWindowWidth</key>\n\t\t\t<integer>500</integer>\n\t\t\t<key>shouldShowConfigureWifiButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowSupportStatus</key>\n\t\t\t<true/>\n\t\t\t<key>shouldShowVersionInfo</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_ropg.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/e64a2b5d-3eb1-436e-9e8a-521f0c5cd489/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>shouldUseROPGForPasswordChangeChecking</key>\n\t\t\t<true/>\n\t\t\t<key>clientSecret</key>\n\t\t\t<string>[REDACTED]</string>\n\t\t\t<key>resource</key>\n\t\t\t<string>https://graph.microsoft.com</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_skip_fv.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>shouldSkipFileVaultLogin</key>\n\t\t\t<true/>\n\t\t\t<key>shouldSkipFileVaultLoginAdmin</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_azure_with_AD.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>5487c4cd-949a-402d-9eee-ae8fb696b415</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>ADDomain</key>\n\t\t\t<string>twocanoes.com</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_change_app_settings.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>PayloadContent</key>\n  <array>\n    <dict>\n      <key>PayloadDescription</key>\n      <string>Configures XCreds configuration preferences</string>\n      <key>PayloadDisplayName</key>\n      <string>XCreds</string>\n      <key>PayloadIdentifier</key>\n      <string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n      <key>PayloadOrganization</key>\n      <string></string>\n      <key>PayloadType</key>\n      <string>com.twocanoes.xcreds</string>\n      <key>PayloadUUID</key>\n      <string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n      <key>PayloadVersion</key>\n      <integer>1</integer>\n      <key>clientID</key>\n      <string>[redacted]</string>\n      <key>discoveryURL</key>\n      <string>https://login.microsoftonline.com/common/.well-known/openid-configuration</string>\n      <key>redirectURI</key>\n      <string>https://127.0.0.1/xcreds</string>\n      <key>scopes</key>\n      <string>profile openid email offline_access</string>\n      <key>shouldShowQuitMenu</key>\n      <false/>\n      <key>map_firstname</key>\n      <string>given_name</string>\n      <key>map_fullname</key>\n      <string>name</string>\n      <key>map_lastname</key>\n      <string>family_name</string>\n      <key>map_username</key>\n      <string>name</string>\n      <key>cloudLoginText</key>\n      <string>Back to XCreds</string>\n      <key>loginWindowBackgroundImageURL</key>\n      <string>file:///System/Library/Desktop Pictures/Monterey Graphic.heic</string>\n      <key>loginWindowHeight</key>\n      <integer>500</integer>\n      <key>loginWindowWidth</key>\n      <integer>500</integer>\n      <key>shouldShowConfigureWifiButton</key>\n      <true/>\n      <key>shouldShowMacLoginButton</key>\n      <true/>\n      <key>shouldShowSupportStatus</key>\n      <true/>\n      <key>shouldShowVersionInfo</key>\n      <true/>\n    </dict>\n  </array>\n  <key>PayloadDescription</key>\n  <string>azure xcreds</string>\n  <key>PayloadDisplayName</key>\n  <string>azure xcreds</string>\n  <key>PayloadIdentifier</key>\n  <string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n  <key>PayloadOrganization</key>\n  <string>twocanoes</string>\n  <key>PayloadScope</key>\n  <string>System</string>\n  <key>PayloadType</key>\n  <string>Configuration</string>\n  <key>PayloadUUID</key>\n  <string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n  <key>PayloadVersion</key>\n  <integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_google.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>F5B79C66-146F-4F8A-9237-CAF10606615C</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>[redacted]</string>\n\t\t\t<key>clientSecret</key>\n\t\t\t<string>[redacted]</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://accounts.google.com/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>google xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>google xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>47F59CD0-E476-4016-A8C6-82837B61C7CE</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_okta.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>0oae3u4ktuUuqSAcJ5d7</string>\n\t\t\t<string>0oae3u4ktuUuqSAcJ5d7</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://twocanoes.okta.com/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n            <key>shouldUseROPGForPasswordChangeChecking</key>\n            <true/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>azure xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_okta_ropg.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>0oae3u4ktuUuqSAcJ5d7</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://twocanoes.okta.com/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>aliasName</key>\n\t\t\t<string>preferred_username</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n            <key>shouldUseROPGForPasswordChangeChecking</key>\n            <true/>\n\t\t\t\n<key>shouldShowMacLoginButton</key>\n<false/>\n<key>shouldAllowKeyComboForMacLoginWindow</key>\n<true/>\n<key>shouldPromptForMigration</key>\n<true/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>okta xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>okta xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_example_okta_ropg_menu_item.mobileconfig",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PayloadContent</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>PayloadDescription</key>\n\t\t\t<string>Configures XCreds configuration preferences</string>\n\t\t\t<key>PayloadDisplayName</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PayloadIdentifier</key>\n\t\t\t<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.xcreds.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadOrganization</key>\n\t\t\t<string></string>\n\t\t\t<key>PayloadType</key>\n\t\t\t<string>com.twocanoes.xcreds</string>\n\t\t\t<key>PayloadUUID</key>\n\t\t\t<string>11BE4B70-7A81-4351-A799-6B6BCBCF0900</string>\n\t\t\t<key>PayloadVersion</key>\n\t\t\t<integer>1</integer>\n\t\t\t<key>clientID</key>\n\t\t\t<string>0oae3u4ktuUuqSAcJ5d7</string>\n\t\t\t<key>discoveryURL</key>\n\t\t\t<string>https://twocanoes.okta.com/.well-known/openid-configuration</string>\n\t\t\t<key>redirectURI</key>\n\t\t\t<string>https://127.0.0.1/xcreds</string>\n\t\t\t<key>aliasName</key>\n\t\t\t<string>preferred_username</string>\n\t\t\t<key>scopes</key>\n\t\t\t<string>profile openid email offline_access</string>\n\t\t\t<key>shouldUseBasicAuthWithROPG</key>\n\t\t\t<true/>\n\t\t\t<key>shouldUseROPGForPasswordChangeChecking</key>\n\t\t\t<true/>\n\t\t\t<key>ropgResponseValue</key>\n\t\t\t<string>{\"error\":\"invalid_grant\",\"error_description\":\"Resource owner password credentials cannot be used with MFA enabled.\"}</string>\n\t\t\t<key>shouldShowMacLoginButton</key>\n\t\t\t<false/>\n\t\t\t<key>shouldAllowKeyComboForMacLoginWindow</key>\n\t\t\t<true/>\n\t\t\t<key>shouldPromptForMigration</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</array>\n\t<key>PayloadDescription</key>\n\t<string>okta xcreds</string>\n\t<key>PayloadDisplayName</key>\n\t<string>okta xcreds</string>\n\t<key>PayloadIdentifier</key>\n\t<string>com.github.erikberglund.ProfileCreatorAF7B74FE-BF9D-4789-9E78-519C49324120</string>\n\t<key>PayloadOrganization</key>\n\t<string>twocanoes</string>\n\t<key>PayloadScope</key>\n\t<string>System</string>\n\t<key>PayloadType</key>\n\t<string>Configuration</string>\n\t<key>PayloadUUID</key>\n\t<string>7620DBF9-295B-4DFF-B0AE-0629207ECF5A</string>\n\t<key>PayloadVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample Profile/xcreds_profile_rfid.configprofile",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n<key>PayloadContent</key>\n<array>\n<dict>\n<key>PayloadDescription</key>\n<string>Configures XCreds Card configuration preferences</string>\n<key>PayloadDisplayName</key>\n<string>XCreds Card Configuration</string>\n<key>PayloadIdentifier</key>\n<string>com.github.erikberglund.ProfileCreator.47F59CD0-E476-4016-A8C6-82837B61C7CE.com.twocanoes.taplogin.F5B79C66-146F-4F8A-9237-CAF10606615C.11BE4B70-7A81-4351-A799-6B6BCBCF0900.C499E48D-61A5-4463-BB5A-FFFB14936411.0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n<key>PayloadOrganization</key>\n<string></string>\n<key>PayloadType</key>\n<string>com.twocanoes.xcreds</string>\n<key>PayloadUUID</key>\n<string>0C06D77A-983C-43D4-939E-AA6AF0AF9AFA</string>\n<key>PayloadVersion</key>\n<integer>1</integer>\n<key>shouldShowConfigureWifiButton</key>\n<true/>\n<key>shouldSuppressLocalPasswordPrompt</key>\n<true/>\n<key>shouldShowMacLoginButton</key>\n<false/>\n<key>showDebug</key>\n<true/>\n<key>ccidSlotName</key>\n<string>Feitian R502 Contactless Reader</string>\n<key>shouldSwitchToLoginWindowWhenLocked</key>\n<true/>\n</dict>\n</array>\n<key>PayloadDescription</key>\n<string>Tap</string>\n<key>PayloadDisplayName</key>\n<string>XCreds Card Configuration</string>\n<key>PayloadIdentifier</key>\n<string>com.twocanoes.t0C865A8B-0494-42F7-9108-1AAFC2C85B72</string>\n<key>PayloadOrganization</key>\n<string>twocanoes</string>\n<key>PayloadScope</key>\n<string>System</string>\n<key>PayloadType</key>\n<string>Configuration</string>\n<key>PayloadUUID</key>\n<string>56A788D5-4AFE-48CD-81D0-7F455F2DD5E5</string>\n<key>PayloadVersion</key>\n<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "SessionManager.swift",
    "content": "//\n//  SessionManager.swift\n//  NoMAD-ADAuth\n//\n//  Created by Joel Rennich on 11/10/17.\n//  Copyright © 2018 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n//import NoMADPRIVATE\n\n// what we're keeping track of for every user\n@available(macOS, deprecated: 11)\npublic struct NoMADSessionUserObject {\n    var userPrincipal: String\n    var session: NoMADSession\n    var aging: Bool\n    var expiration: Date?\n    var daysToGo: Int?\n    var userInfo: ADUserRecord?\n}\n\n// class to keep track and manage multiple AD sessions simultaneously\n@available(macOS, deprecated: 11)\npublic class SessionManager: NoMADUserSessionDelegate {\n\n    /// The default instance of `SessionManager` to be used.\n    public static let shared = SessionManager()\n\n    public var sessions = [String : NoMADSessionUserObject]()\n\n    let dateFormatter = DateFormatter()\n    let myWorkQueue = DispatchQueue(label: \"menu.nomad.NoMADADAuth.sessionmanager.background_work_queue\", attributes: [])\n    \n    init() {\n        \n        // a bit more setup\n        \n        dateFormatter.dateStyle = .medium\n        dateFormatter.timeStyle = .short\n        \n        // get all of the current principals with tickets\n        self.getList()\n    }\n    \n    // udpate the list\n    \n    public func update(user : String) {\n        \n        if sessions[user] == nil {\n            \n            // We don't know about this user yet\n            return\n        }\n        \n        sessions[user]?.session.delegate = self\n        let _ = sessions[user]?.session.getUserInformation()\n\n    }\n    \n    // updates all known users\n    \n    public func updateAll() {\n        \n        if sessions.count < 1 {\n            // no sessions so return\n            return\n        }\n        \n        for session in sessions {\n            session.value.session.delegate = self\n            let _ = session.value.session.getUserInformation()\n        }\n        \n    }\n    \n    // gets new list of users\n    \n    public func getList() {\n        \n        klistUtil.klist()\n        let principals = klistUtil.returnPrincipals()\n        \n        if principals.count > 0 {\n            for user in principals {\n                if sessions[user] == nil {\n                    // add the account\n                    \n                    let userSession = NoMADSession.init(domain: user.components(separatedBy: \"@\").last?.lowercased() ?? \"\", user: user, type: .AD)\n                    \n                    myWorkQueue.async {\n                        userSession.delegate = self\n                        userSession.userInfo()\n                        \n                    }\n                    sessions[user] = NoMADSessionUserObject.init(userPrincipal: user, session: userSession, aging: false, expiration: nil, daysToGo: nil, userInfo: nil)\n                }\n            }\n        }\n        \n    }\n    \n    // manually adds a user with a session\n    \n    public func createEntry(user : String, session : NoMADSession, update: Bool=true) {\n        \n        sessions[user] = NoMADSessionUserObject.init(userPrincipal: user, session: session, aging: false, expiration: nil, daysToGo: nil, userInfo: nil)\n        \n        if update {\n            // update the information\n\n            session.delegate = self\n            let _ = session.getUserInformation()\n        }\n        \n    }\n    \n    // update a NoMADSessionUserObject object\n    \n    public func updateUser(user : String) {\n        \n    }\n    \n    // Add a new session to the list\n    \n    // PRAGMA: Auth callbacks\n    \n    public func NoMADAuthenticationSucceeded() {\n        // we'll never auth here\n    }\n    \n    public func NoMADAuthenticationFailed(error: NoMADSessionError, description: String) {\n        // we'll never auth here\n    }\n    \n    public func NoMADUserInformation(user: ADUserRecord) {\n        \n        // we shouldn't not already know about this user, but we'll double check\n        \n        if sessions[user.userPrincipal] == nil {\n            return\n        }\n        \n        if user.passwordExpire != nil && user.passwordAging! {\n            sessions[user.userPrincipal]?.daysToGo = Int((user.passwordExpire?.timeIntervalSince(Date()))!)/86400\n            sessions[user.userPrincipal]?.expiration = user.passwordExpire\n            sessions[user.userPrincipal]?.aging = true\n        } else {\n            sessions[user.userPrincipal]?.aging = false\n        }\n    }\n}\n"
  },
  {
    "path": "ShareMounter.swift",
    "content": "//\n//  ShareMounter.swift\n//  NoMAD\n//\n//  Created by Joel  on 8/29/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n// mad props to Kyle Crawshaw\n// since much of this is cribbed from Share Mounter\n//\n//  ShareMounter.swift\n//  ShareMounterCLI\n//\n//  Created by Joel Rennich on 7/10/19.\n//  Copyright © 2019 Joel Rennich. All rights reserved.\n//\n\nimport Foundation\nimport Cocoa\nimport NetFS\n\nenum ShareKeys {\n    static let homeMount = \"HomeMountEnabled\"\n    static let mount = \"Mount\"\n    static let shares = \"Shares\"\n//    static let groups = \"Groups\"\n    static let connectedOnly = \"ConnectedOnly\"\n    static let options = \"Options\"\n    static let name = \"Name\"\n    static let autoMount = \"AutoMount\"\n    static let localMount = \"LocalMount\"\n    static let url = \"URL\"\n    static let userShares = \"UserShares\"\n    static let finderMount = \"FinderMount\"\n    static let slowMount = \"SlowMount\"\n    static let slowMountDelay = \"SlowMountDelay\"\n    static let ignoreShareNames = \"IgnoreShareNames\"\n}\n\nenum mountStatus {\n    case unmounted, toBeMounted, notInGroup, mounting, mounted, errorOnMount\n}\n\nstruct share_info {\n    var groups: [String]\n    var originalURL: String\n    var url: URL\n    var name: String\n    var options: [String]\n    var connectedOnly: Bool\n    var mountStatus: mountStatus?\n    var localMount: String?\n    var autoMount: Bool\n    var reqID: AsyncRequestID?\n    var attemptDate: Date?\n    var localMountPoints: String?\n    var isHome=false\n}\n\nstruct mounting_shares_info {\n    var share_url: URL\n    var reqID: AsyncRequestID?\n    var mount_time: Date\n}\n@available(macOS, deprecated: 11)\nclass ShareMounter {\n    \n    let defaults = UserDefaults.standard\n\n    let fm = FileManager.default\n    let ws = NSWorkspace.shared\n    let sharePrefs = UserDefaults.standard\n\n    var mountedShares = [URL]()\n    var mountedOriginalShares = [String]()\n    var mountedSharePaths = [URL:String]()\n    \n    var all_shares = [share_info]()\n    var resolvedShares = [URL:String]()\n    var now = Date()\n    \n    var tickets = false\n    var userPrincipal = \"\"\n    var connectedState = false\n    \n    var adUserRecord:ADUserRecord?\n    let openOptionsDict : [String : Any] = [\n        kNAUIOptionKey : kNAUIOptionNoUI,\n        kNetFSUseGuestKey : false,\n        kNetFSForceNewSessionKey : false,\n        kNetFSUseAuthenticationInfoKey : true\n    ]\n    \n    let mountOptionsDict : [String : Any] = [\n        kNetFSSoftMountKey : true\n    ]\n    \n    func getMounts() {\n        \n        var tempShares = [share_info]()\n        \n        guard let groups = adUserRecord?.groups else { return }\n\n        if sharePrefs.bool(forKey: ShareKeys.homeMount)==true{\n\n            TCSLogWithMark(\"Evaluating home share for automounts.\")\n            if let homePathRaw = adUserRecord?.homeDirectory {\n                if var homePath = URL(string: \"smb:\" + homePathRaw) {\n\n                    if defaults.bool(forKey: PrefKeys.homeAppendDomain.rawValue) {\n                        if let domain = defaults.string(forKey: PrefKeys.aDDomain.rawValue),  let host = homePath.host {\n                            var newHome = \"smb://\" + host + \".\" + domain\n                            newHome += homePath.path\n                            if let url = URL(string: newHome){\n                                homePath = url\n                            }\n                        }\n                    }\n\n                    let homeShareGroups = sharePrefs.value(forKey: \"HomeMountGroups\") as? [String] ?? []\n                    let homeShareOptions = sharePrefs.value(forKey: \"HomeMountOptions\") as? [String] ?? []\n\n                    var currentShare = share_info(groups: homeShareGroups, originalURL: homePathRaw, url: homePath, name: defaults.string(forKey: PrefKeys.menuHomeDirectory.rawValue) ?? \"Network Home\", options: homeShareOptions, connectedOnly: true, mountStatus: .unmounted, localMount: nil, autoMount: true, reqID: nil, attemptDate: nil, localMountPoints: nil, isHome:true)\n\n                    for share in all_shares {\n                        if share.originalURL == currentShare.originalURL && (mountedOriginalShares.contains(share.originalURL) || share.mountStatus == .mounting) {\n                            // share is still  mounting, so copy the share\n                            if CommandLine.arguments.contains(\"-shares\") {\n                                print(\"Share is still mounting, using existing information\")\n                                print(share)\n                            }\n                            currentShare = share\n                        }\n                    }\n\n                    tempShares.append(currentShare)\n                    resolvedShares[currentShare.url] = homePathRaw\n\n                }\n            } else {\n                TCSLogWithMark(\"Unable to get home share from preferences.\")\n            }\n        } else {\n            TCSLogWithMark(\"No home mount dictionary\")\n        }\n        \n        TCSLogWithMark(\"evaluating Shares\")\n        if let mountsRaw = sharePrefs.array(forKey: ShareKeys.shares) {\n            \n            if mountsRaw.count == 0 { \n                TCSLogWithMark(\"Mounts Empty\")\n\n                return\n            }\n\n            for mount in mountsRaw {\n                \n                guard mount is Dictionary<String, AnyObject> else { continue }\n                let mountDict = mount as? [String:AnyObject] ?? [:]\n                let shareGroups = mountDict[\"Groups\"] as? [String] ?? []\n                let shareLocalMount = mountDict[\"LocalMount\"] as? String ?? \"\"\n                let shareOptions = mountDict[\"Options\"] as? [String] ?? []\n                let shareConnectedOnly = mountDict[\"ConnectedOnly\"] as? Bool ?? true\n                if let shareName = mountDict[\"Name\"] as? String,\n                   let shareURL = mountDict[\"URL\"] as? String,\n                   let shareAutoMount = mountDict[\"AutoMount\"] as? Bool,\n                   let urlRaw = subVariables(shareURL) {\n\n                    TCSLogWithMark(\"checking group membership for mounts\")\n                    let groupsArray = groups\n\n                    if Set(groupsArray).intersection(Set(shareGroups)).count < 1 && shareGroups.count > 0 {\n                        TCSLogWithMark(\"Not in the right group\")\n                        continue\n                    }\n\n                    guard let url = URL(string: urlRaw) else { continue }\n\n                    var currentShare = share_info(groups: shareGroups, originalURL: shareURL, url: url, name: shareName, options: shareOptions, connectedOnly: shareConnectedOnly, mountStatus: .unmounted, localMount: shareLocalMount, autoMount: shareAutoMount, reqID: nil, attemptDate: nil, localMountPoints: nil)\n\n                    if CommandLine.arguments.contains(\"-shares\") {\n                        print(\"Evaluating share: \\(currentShare.originalURL)\")\n                    }\n\n                    for share in all_shares {\n                        if share.originalURL == currentShare.originalURL && (mountedOriginalShares.contains(share.originalURL) || share.mountStatus == .mounting) {\n                            // share is still  mounting, so copy the share\n                            if CommandLine.arguments.contains(\"-shares\") {\n                                print(\"Share is still mounting, using existing information\")\n                                print(share)\n                            }\n                            currentShare = share\n                        } else {\n                            if CommandLine.arguments.contains(\"-shares\") {\n                                print(\"Share: \\(share.originalURL) doesn't match current share being evaluated: \\(currentShare.originalURL), skipping \")\n                            }\n                        }\n                    }\n                    tempShares.append(currentShare)\n                    resolvedShares[currentShare.url] = shareURL\n                }\n            }\n        } else {\n            TCSLogWithMark(\"No mount dictionary\")\n        }\n\n        if CommandLine.arguments.contains(\"-shares\") {\n            print(\"***all_shares***\")\n            print(all_shares)\n        }\n\n        // do this atomically since other serivces depend on this list\n        all_shares = tempShares\n    }\n    \n    func getMountedShares() {\n\n        // zero out the currently mounted shares\n        mountedShares.removeAll()\n        mountedSharePaths.removeAll()\n        mountedOriginalShares.removeAll()\n        \n        guard let myShares = fm.mountedVolumeURLs(includingResourceValuesForKeys: nil, options: FileManager.VolumeEnumerationOptions(rawValue: 0)) else { return }\n        \n        TCSLogWithMark(\"Currently mounted shares: \\n\" + String(describing: myShares))\n        \n        // we hardcode .timemachine in here b/c that will always fail on the getFileSystemInfo call\n        var ignoreShares = [\".timemachine\", \"/private/\", \"System/Volumes\"]\n        \n        if let ignoreShareNamesTemp = sharePrefs.array(forKey: ShareKeys.ignoreShareNames) as? [String] {\n            ignoreShares.append(contentsOf: ignoreShareNamesTemp)\n        }\n        \n        for share in myShares {\n            \n            var myDes: NSString? = nil\n            var myType: NSString? = nil\n            \n            // need to watch out for funky VM and TimeMachine shares\n                      \n            if ignoreShare(ignoreList: ignoreShares, share: share) {\n                continue\n            }\n            \n            guard ws.getFileSystemInfo(forPath: share.path, isRemovable: nil, isWritable: nil, isUnmountable: nil, description: &myDes, type: &myType) else {\n                TCSLogWithMark(\"Get File info failed. Probably a synthetic Shared Folder.\")\n                // skip this share and move on to the next\n                continue\n            }\n            \n            guard let shareType = myType as String? else { continue }\n            \n            switch shareType {\n            case \"smbfs\", \"afpfs\", \"nfsfs\", \"webdavfs\" :\n                TCSLogWithMark(\"Volume: \" + share.path + \", is a \\(shareType.uppercased()) network volume.\")\n                guard let shareURL = getURL(share: share) else { continue }\n                mountedShares.append(shareURL)\n                mountedSharePaths[shareURL] = share.path\n                mountedOriginalShares.append(resolvedShares[shareURL] ?? \"NONE\")\n                \n            default :\n                // not a remote share\n                TCSLogWithMark(\"Volume: \" + share.path + \", is not a network volume.\")\n            }\n        }\n        TCSLogWithMark(\"Mounted shares: \" + String(describing: mountedShares) )\n    }\n    \n    func mountShares() {\n        \n        if all_shares.count == 0 {\n            TCSLogWithMark(\"No shares to mount\")\n            return\n        }\n        \n        for index in 0...(all_shares.count - 1) {\n            \n            if sharePrefs.bool(forKey: ShareKeys.homeMount)==false && all_shares[index].isHome==true {\n                continue\n            }\n\n            TCSLogWithMark(\"Evaluating mount: \" + all_shares[index].name)\n\n            // TODO: ensure the URL is reachable before attempting to mount\n            \n            // loop through all the reasons to not mount this share\n            \n            if all_shares[index].mountStatus == .mounted || mountedShares.contains(all_shares[index].url) {\n                // already mounted\n                \n                if  mountedShares.contains(all_shares[index].url) {\n                    all_shares[index].mountStatus = .mounted\n                }\n                \n                TCSLogWithMark(\"Skipping mount because it's already mounted.\")\n                continue\n            } else if mountedOriginalShares.contains(all_shares[index].originalURL) {\n                \n                all_shares[index].mountStatus = .mounted\n                \n                TCSLogWithMark(\"Skipping mount because share is still mounted from a previous variable substitution.\")\n                continue\n            } else if all_shares[index].mountStatus == .mounting {\n                TCSLogWithMark(\"Skipping mount because share is still in the process of being mounted - kick back on a natural for a bit.\")\n                if let mountInterval = (all_shares[index].attemptDate?.timeIntervalSinceNow) {\n                    if abs(mountInterval) > 5 * 60 {\n                        all_shares[index].mountStatus = .toBeMounted\n                    }\n                }\n                continue\n            } else {\n                all_shares[index].mountStatus = .unmounted\n            }\n            \n            if !all_shares[index].autoMount {\n                // not to be automounted\n                TCSLogWithMark(\"Skipping mount because it's not set to Automount.\")\n                continue\n            }\n            \n            if all_shares[index].connectedOnly && !connectedState {\n                // not connected\n                TCSLogWithMark(\"Skipping mount because we're not connected.\")\n                continue\n            }\n            \n            if !tickets {\n                // skipping b/c we don't have kerb tickets\n                TCSLogWithMark(\"Skipping mount because we don't have tickets\")\n                continue\n            }\n            \n            if (all_shares[index].mountStatus != .errorOnMount) && (all_shares[index].mountStatus != .mounting) {\n                \n                let openOptions = openOptionsDict\n                var mountOptions = mountOptionsDict\n                \n                if all_shares[index].options.count > 0 {\n                    let mountFlagValue = parseOptions(options: all_shares[index].options)\n                    TCSLogWithMark(\"Mount options: (mountFlagValue)\")\n                    mountOptions[kNetFSMountFlagsKey] = mountFlagValue\n                }\n                \n                var requestID: AsyncRequestID?\n                let queue = DispatchQueue.main\n                \n                TCSLogWithMark(\"Attempting to mount: \" + all_shares[index].url.absoluteString)\n                \n                if sharePrefs.bool(forKey: ShareKeys.slowMount)  {\n                    let delay: useconds_t\n                    delay = useconds_t(1000 * (sharePrefs.integer(forKey: ShareKeys.slowMountDelay)))\n                    usleep(delay)\n                    TCSLogWithMark(\"Delaying next Mount by \" + String(delay/1000) + \" milliseconds since SlowMount is set.\")\n                }\n                                \n                if sharePrefs.bool(forKey: ShareKeys.finderMount) {\n\n                    TCSLogWithMark(\"Mounting share via Finder\")\n                    _ = cliTask(\"/usr/bin/open \\(all_shares[index].url.absoluteString)\")\n                    all_shares[index].mountStatus = .mounted\n                    all_shares[index].reqID = nil\n                    all_shares[index].attemptDate = Date()\n                    \n                    // going for next share\n                    continue\n                }\n                \n                _ = NetFSMountURLAsync(all_shares[index].url as CFURL?,\n                                       nil,\n                                       userPrincipal as CFString?,\n                                       nil,\n                                       (openOptions as! CFMutableDictionary),\n                                       (mountOptions as! CFMutableDictionary),\n                                       &requestID,\n                                       queue) {(stat: Int32, requestID: AsyncRequestID?, mountpoints: CFArray?) -> Void in\n                    TCSLogWithMark(\"Request ID: \\(requestID!)\")\n                    for index in 0...(self.all_shares.count - 1) {\n                        if self.all_shares[index].reqID == requestID {\n                            if stat == 0 {\n                                TCSLogWithMark(\"Mounted share: \" + self.all_shares[index].name)\n                                self.all_shares[index].mountStatus = .mounted\n                                self.all_shares[index].reqID = nil\n                                let mounts = mountpoints as! Array<String>\n                                self.all_shares[index].localMountPoints = mounts[0]\n                            } else {\n                                TCSLogWithMark(\"Error on mounting share: \" + self.all_shares[index].name)\n                                self.all_shares[index].mountStatus = .errorOnMount\n                                self.all_shares[index].reqID = nil\n                            }\n                        }\n                    }\n                    //NotificationCenter.default.post(name: NSNotification.Name(rawValue: \"menu.nomad.NoMAD.updateNow\"), object: self)\n                    //                                        self.mountShares()\n\n                }\n                \n                all_shares[index].mountStatus = .mounting\n                all_shares[index].reqID = requestID\n                all_shares[index].attemptDate = Date()\n                \n            } else {\n                // clean up any errored mounts\n                let mountInterval = (all_shares[index].attemptDate?.timeIntervalSinceNow)!\n                if abs(mountInterval) > 5 * 60 {\n                    all_shares[index].mountStatus = .toBeMounted\n                }\n            }\n        }\n    }\n    \n    func syncMountShare(_ serverAddress: URL, options: [String], open: Bool=false) {\n        \n        let openOptions = openOptionsDict\n        var mountOptions = mountOptionsDict\n        \n        if options.count > 0 {\n            let mountFlagValue = parseOptions(options: options)\n            TCSLogWithMark(\"Mount options: (mountFlagValue)\")\n            mountOptions[kNetFSMountFlagsKey] = mountFlagValue\n        }\n        \n        var mountArray: Unmanaged<CFArray>? = nil\n        \n        let myResult = NetFSMountURLSync(serverAddress as CFURL?, nil, nil, nil, (openOptions as! CFMutableDictionary), (mountOptions as! CFMutableDictionary), &mountArray)\n        TCSLogWithMark(myResult.description)\n        \n        if let mountPoint = mountArray!.takeRetainedValue() as? [String] {\n            if myResult == 0 && open {\n                NSWorkspace.shared.open(URL(fileURLWithPath: mountPoint[0], isDirectory: true))\n            }\n        }\n    }\n    \n    func asyncMountShare(_ serverAddress: URL, options: [String], open: Bool=false) {\n        \n        let openOptions = openOptionsDict\n        var mountOptions = mountOptionsDict\n        \n        if options.count > 0 {\n            let mountFlagValue = parseOptions(options: options)\n            TCSLogWithMark(\"Mount options: (mountFlagValue)\")\n            mountOptions[kNetFSMountFlagsKey] = mountFlagValue\n        }\n        \n        var requestID: AsyncRequestID? = nil\n        let queue = DispatchQueue.main\n        \n        TCSLogWithMark(\"Attempting to mount: \" + String(describing: serverAddress))\n        \n        let _ = NetFSMountURLAsync(serverAddress as CFURL?,\n                                   nil,\n                                   userPrincipal as CFString?,\n                                   nil,\n                                   (openOptions as! CFMutableDictionary),\n                                   (mountOptions as! CFMutableDictionary),\n                                   &requestID,\n                                   queue)\n        {(stat:Int32, requestID:AsyncRequestID?, mountpoints:CFArray?) -> Void in\n            \n            if stat == 0 {\n                TCSLogWithMark(\"Mounted share: \" + String(describing: serverAddress))\n                \n                if let mountPoint = (mountpoints! as! [String]).first {\n                    NSWorkspace.shared.open(URL(fileURLWithPath: mountPoint, isDirectory: true))\n                }\n            } else {\n                TCSLogWithMark(\"Error mounting share: \" + String(describing: serverAddress))\n            }\n        }\n    }\n    \n    ///MARK: Helper functions\n    \n    private func getURL(share: URL) -> URL? {\n        let shareURLUnmanaged = NetFSCopyURLForRemountingVolume(share as CFURL)\n        guard let myShare = shareURLUnmanaged else {\n            return nil\n        }\n        \n        let shareURL = myShare.takeUnretainedValue() as URL\n        return URL(string: (shareURL.scheme! + \"://\" + shareURL.host! + shareURL.path.safeURLPath()!))!\n    }\n    @available(macOS, deprecated: 11)\n    fileprivate func subVariables(_ url: String) -> String? {\n        // TODO: get e-mail address as a variable\n        var createdURL = url\n        \n        guard let domain = adUserRecord?.domain,\n              let fullName = adUserRecord?.fullName.safeURLPath(),\n            let serial = getSerial().safeURLPath(),\n              let shortName = adUserRecord?.shortName\n            else {\n                return nil\n        }\n        // filter out any blank spaces too\n        \n        createdURL = createdURL.replacingOccurrences(of: \" \", with: \"%20\")\n        createdURL = createdURL.replacingOccurrences(of: \"<<domain>>\", with: domain)\n        createdURL = createdURL.replacingOccurrences(of: \"<<fullname>>\", with: fullName)\n        createdURL = createdURL.replacingOccurrences(of: \"<<serial>>\", with: serial)\n        createdURL = createdURL.replacingOccurrences(of: \"<<shortname>>\", with: shortName)\n        \n        let currentDC = defaults.string(forKey: PrefKeys.aDDomainController.rawValue) ?? \"NONE\"\n        createdURL = createdURL.replacingOccurrences(of: \"<<domaincontroller>>\", with: currentDC)\n        \n        return createdURL\n    }\n    \n    fileprivate func parseOptions(options:  [String] ) -> Int {\n        var mountFlagValue = 0\n        for option in options {\n            switch option {\n            case \"MNT_RDONLY\"            : mountFlagValue += 0x00000001\n            case \"MNT_SYNCHRONOUS\"       : mountFlagValue += 0x00000002\n            case \"MNT_NOEXEC\"            : mountFlagValue += 0x00000004\n            case \"MNT_NOSUID\"            : mountFlagValue += 0x00000008\n            case \"MNT_NODEV\"             : mountFlagValue += 0x00000010\n            case \"MNT_UNION\"             : mountFlagValue += 0x00000020\n            case \"MNT_ASYNC\"             : mountFlagValue += 0x00000040\n            case \"MNT_CPROTECT\"          : mountFlagValue += 0x00000080\n            case \"MNT_EXPORTED\"          : mountFlagValue += 0x00000100\n            case \"MNT_QUARANTINE\"        : mountFlagValue += 0x00000400\n            case \"MNT_LOCAL\"             : mountFlagValue += 0x00001000\n            case \"MNT_QUOTA\"             : mountFlagValue += 0x00002000\n            case \"MNT_ROOTFS\"            : mountFlagValue += 0x00004000\n            case \"MNT_DOVOLFS\"           : mountFlagValue += 0x00008000\n            case \"MNT_DONTBROWSE\"        : mountFlagValue += 0x00100000\n            case \"MNT_IGNORE_OWNERSHIP\"  : mountFlagValue += 0x00200000\n            case \"MNT_AUTOMOUNTED\"       : mountFlagValue += 0x00400000\n            case \"MNT_JOURNALED\"         : mountFlagValue += 0x00800000\n            case \"MNT_NOUSERXATTR\"       : mountFlagValue += 0x01000000\n            case \"MNT_DEFWRITE\"          : mountFlagValue += 0x02000000\n            case \"MNT_MULTILABEL\"        : mountFlagValue += 0x04000000\n            case \"MNT_NOATIME\"           : mountFlagValue += 0x10000000\n            default                      : mountFlagValue += 0\n            }\n        }\n        return mountFlagValue\n    }\n    \n    fileprivate func ignoreShare(ignoreList: [String], share: URL) -> Bool {\n    \n        for ignoreName in ignoreList {\n            if share.path.containsIgnoringCase(ignoreName) {\n                myLogger.logit(.info, message: \"Ignoring share: \\(share.path) because of share name\")\n                return true\n            }\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "ShareMounterMenu.swift",
    "content": "//\n//  ShareMounterMenu.swift\n//  NoMAD\n//\n//  Created by Joel Rennich on 8/12/17.\n//  Copyright © 2017 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n@available(macOS, deprecated: 11)\nlet shareMounterMenu = ShareMounterMenu()\nlet shareMounterQueue = DispatchQueue(label: \"menu.nomad.NoMAD.shareMounting\", attributes: [])\n\n// class to build the share mount menu and accept clicks\n@available(macOS, deprecated: 11)\n@objc class ShareMounterMenu: NSObject {\n\n    let defaults = UserDefaults.standard\n\n    var shareMounter:ShareMounter?\n    @objc var worksWhenModal = true\n    @objc let myShareMenu = NSMenu()\n    \n    var sharePrefs = UserDefaults.standard\n\n    @objc func updateShares(connected: Bool=false, tickets: Bool=false) {\n        \n        guard let kerbUser = PasswordUtils().kerberosPrincipalFromCurrentLoggedInUser() else {\n\n         return\n        }\n\n        shareMounterQueue.sync(execute: {\n            self.shareMounter?.connectedState = connected\n            self.shareMounter?.tickets = tickets\n            self.shareMounter?.userPrincipal = kerbUser\n            self.shareMounter?.getMountedShares()\n            self.shareMounter?.getMounts()\n            self.shareMounter?.mountShares()\n        })\n\n    }\n    \n    @objc func buildMenu(connected: Bool=false) -> NSMenu {\n        \n        guard let shareMounter = shareMounter else {\n            return NSMenu()\n\n        }\n        \n        klistUtil.klist()\n\n        if shareMounter.all_shares.count > 0 {\n            // Menu Items and Menu\n            \n            myShareMenu.removeAllItems()\n            \n            if CommandLine.arguments.contains(\"-shares\") {\n                print(\"***Building Share Menu***\")\n                print(shareMounter.all_shares)\n            }\n            \n            for share in shareMounter.all_shares {\n                let myItem = NSMenuItem()\n                myItem.title = share.name\n                myItem.target = self\n\n                if share.connectedOnly == true  && connected == false {\n                    myItem.target = nil\n                }\n                myItem.action = #selector(openShareFromMenu(_:))\n                myItem.toolTip = String(describing: share.url)\n                if share.mountStatus == .mounted {\n                    myItem.isEnabled = true\n                    myItem.state = NSControl.StateValue(rawValue: 1)\n                } else if share.mountStatus == .mounting {\n                    myItem.isEnabled = false\n                    myItem.state = NSControl.StateValue(rawValue: 0)\n                } else if share.mountStatus == .unmounted {\n                    myItem.isEnabled = true\n                    myItem.state = NSControl.StateValue(rawValue: 0)\n                } else if share.mountStatus == .errorOnMount {\n                    myItem.isEnabled = false\n                    myItem.state = NSControl.StateValue(rawValue: 0)\n                }\n\n                myShareMenu.addItem(myItem)\n            }\n        }\n        \n        if CommandLine.arguments.contains(\"-shares\") {\n            print(\"***Share Menu***\")\n            print(myShareMenu)\n        }\n        \n        return myShareMenu\n    }\n    \n    @IBAction func openShareFromMenu(_ sender: AnyObject) {\n        guard let shareMounter = shareMounter else {\n            return\n        }\n        for share in shareMounter.all_shares {\n            if share.name == sender.title {\n                if share.mountStatus != .mounted {\n                    TCSLogWithMark(\"Mounting share: \" + String(describing: share.url))\n                    \n                    //myShareMounter.asyncMountShare(share.url, options: share.options, open: true)\n                    //_ = cliTask(\"open \" + DFSResolver.checkAndReplace(url: share.url))\n                    _ = cliTask(\"open \" + share.url.absoluteString.safeURLPath()!)\n                } else if share.mountStatus == .mounted {\n                    // open up the local shares\n                    \n                    // cliTask(“open ” + DFSResolver.checkAndReplace(url: share.url))\n                    \n                    if share.localMountPoints != nil {\n                        NSWorkspace.shared.open(URL(fileURLWithPath: share.localMountPoints!, isDirectory: true))\n                    } else {\n                        _ = cliTask(\"open \" + share.url.absoluteString.safeURLPath()!)\n                    }\n                }\n            }\n        }\n    updateShares()\n    }\n    \n    // utility functions\n    \n    @objc func sharesAvilable() -> Bool {\n        if myShareMenu.items.count == 0 {\n            return false\n        } else {\n            return true\n        }\n    }\n}\n"
  },
  {
    "path": "Shared/AuthRightsHelper.swift",
    "content": "//\n//  AuthRIghtsHelper.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 5/31/23.\n//\n\nimport Foundation\n\n\nclass AuthRightsHelper: NSObject {\n    static let rightsArray = [\n        [\"builtin:policy-banner\":\"XCredsLoginPlugin:UserSetup,privileged\"],\n        [\"XCredsLoginPlugin:LoginWindow\":\"XCredsLoginPlugin:PowerControl,privileged\"],\n        [\"loginwindow:done\":\"XCredsLoginPlugin:KeychainAdd,privileged\"],\n        [\"builtin:login-begin\":\"XCredsLoginPlugin:CreateUser,privileged\"],\n        [\"loginwindow:done\":\"XCredsLoginPlugin:EnableFDE,privileged\"],\n        [\"loginwindow:done\":\"XCredsLoginPlugin:LoginDone\"]\n    ]\n\n    static func resetRights() ->Bool {\n        TCSLogWithMark(\"resetting rights\")\n        if AuthorizationDBManager.shared.rightExists(right:\"XCredsLoginPlugin:LoginWindow\")==true {\n            TCSLogWithMark(\"replacing XCredsLoginPlugin:LoginWindow with loginwindow:login\")\n            if AuthorizationDBManager.shared.replace(right: \"XCredsLoginPlugin:LoginWindow\", withNewRight: \"loginwindow:login\") == false {\n                TCSLogErrorWithMark(\"Error removing XCredsLoginPlugin:LoginWindow. bailing\")\n                return false\n            }\n        }\n        else if AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\")==false {\n            TCSLogErrorWithMark(\"There was no XCredsLoginPlugin:LoginWindow and no loginwindow:login. Please remove /var/db/auth.db and reboot\")\n            return false\n        }\n\n        for authRight in AuthorizationDBManager.shared.consoleRights() {\n            if authRight.hasPrefix(\"XCredsLoginPlugin\") {\n                TCSLogWithMark(\"Removing \\(authRight)\")\n                if AuthorizationDBManager.shared.remove(right: authRight) == false {\n                    TCSLogErrorWithMark(\"Error removing \\(authRight)\")\n\n                }\n            }\n\n        }\n        return true\n\n    }\n    static func verifyRights() -> Bool {\n        var foundRights=0\n\n        for right in rightsArray {\n\n            if AuthorizationDBManager.shared.rightExists(right: right.values.first!)==true {\n                foundRights = foundRights + 1\n            }\n\n        }\n        if foundRights == 0 && AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\")==true {\n//            TCSLogWithMark(\"no xcreds rights but loginwindow:login exists, so we are good\")\n            return true\n        }\n        else if foundRights == rightsArray.count && AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\")==false{\n//                TCSLogWithMark(\"all xcreds found and no loginwindow:login\")\n\n            return true\n        }\n        TCSLogWithMark(\"verified rights failed.\")\n\n        return false\n    }\n    static func addRights() ->Bool {\n\n        TCSLogWithMark(\"Adding rights back in\")\n        if AuthorizationDBManager.shared.replace(right: \"loginwindow:login\", withNewRight: \"XCredsLoginPlugin:LoginWindow\")==false {\n            TCSLogWithMark(\"error adding loginwindow:login after XCredsLoginPlugin:LoginWindow. bailing since this shouldn't happen\")\n\n            return false\n        }\n\n        for right in rightsArray {\n\n            if AuthorizationDBManager.shared.rightExists(right: right.keys.first!){\n                if AuthorizationDBManager.shared.rightExists(right:right.values.first!) == false {\n\n                    if AuthorizationDBManager.shared.insertRight(newRight: right.values.first!, afterRight: right.keys.first!) {\n\n                        TCSLogWithMark(\"adding \\(right.values.first!) after \\(right.keys.first!)\")\n                    }\n                    else {\n                        TCSLogWithMark(\"right \\(right.values.first!) already exists. Skipping\")\n\n                    }\n                }\n\n                else {\n                    TCSLogErrorWithMark(\"\\(right.keys.first!) does not exist. not inserting \\(right.values.first!)\")\n                }\n\n            }\n        }\n        return true\n\n    }\n\n}\n"
  },
  {
    "path": "Shared/ManagedPreferences.swift",
    "content": "//\n//  ManagedPreferences.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 7/2/22.\n//\n\nimport Foundation\n\nclass ManagedPreferences {\n    static let shared = ManagedPreferences()\n\n    init() {\n   \n}\n\n\n\n"
  },
  {
    "path": "Shared/Tokens.swift",
    "content": "//\n//  Tokens.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 7/2/22.\n//\n\nimport Foundation\nimport OIDCLite\nstruct Creds {\n    var password:String? = \"\"\n    public var accessToken: String?\n    public var idToken: String?\n    public var refreshToken: String?\n    public var jsonDict: [String:Any]?\n\n    init(password:String?, tokens:OIDCLite.TokenResponse) {\n\n        self.accessToken=tokens.accessToken\n        self.idToken=tokens.idToken\n        self.refreshToken=tokens.refreshToken\n        self.password=password\n        self.jsonDict=tokens.jsonDict\n\n   }\n    init(accessToken:String?, idToken:String?,refreshToken:String?, password:String?,jsonDict:Dictionary <String,Any>) {\n\n        self.accessToken=accessToken\n        self.idToken=idToken\n        self.refreshToken=refreshToken\n        self.password=password\n        self.jsonDict=jsonDict\n\n   }\n    func hasTokens() -> Bool {\n\n        return (self.accessToken != nil) && (self.idToken != nil) && (self.refreshToken != nil)\n    }\n\n    func hasAccessAndRefresh() -> Bool {\n\n        return (self.accessToken != nil) && (self.refreshToken != nil)\n    }\n    func hasAccess() -> Bool {\n\n        return (self.accessToken != nil)\n    }\n\n}\n\n\n\n"
  },
  {
    "path": "Shared/XCredsAudit.swift",
    "content": "//\n//  Audit.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 1/20/25.\n//\n\nimport Foundation\n\n@available(macOS, deprecated: 11)\nclass XCredsAudit {\n\n\n    struct AuditRecord:Codable {\n        var lastSuccessfulLoginDate:Date?\n        var lastSuccessfulLoginUser:String?\n        var username:String?\n        var identityToken:String?\n        var identityTokenUpdateDate:Date?\n\n        var refreshTokenUpdateDate:Date?\n        var refreshTokenUpdateSuccess:Bool?\n        var tokenLastUpdatedDate:Date?\n        var lastError:String?\n        var lastErrorDate:Date?\n    }\n    var configFileURL:URL\n\n    init() {\n        let applicationSupportPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .localDomainMask, true)\n\n        let loginWindowConfigFilePath = ((applicationSupportPath[0] as NSString).appendingPathComponent(\"XCreds\") as NSString).appendingPathComponent(\"xcredsaudit\")\n\n        if geteuid()==0 {\n            configFileURL = URL(fileURLWithPath: loginWindowConfigFilePath)\n        }\n\n        else {\n            let home = NSHomeDirectory()\n            let userConfigFilePath = home + \"/\" + \".xcredsaudit\"\n            configFileURL = URL(fileURLWithPath: userConfigFilePath)\n        }\n    }\n    internal func saveAuditRecord(_ auditRecord:AuditRecord){\n        let encoder = PropertyListEncoder()\n        encoder.outputFormat = .xml\n        do {\n          let data = try encoder.encode(auditRecord)\n            try data.write(to: configFileURL)\n        } catch {\n            TCSLogWithMark(error.localizedDescription)\n        }\n\n    }\n    func tokensUpdated(idToken:String)  {\n        var auditRecord = AuditRecord()\n        var decodedIdToken:String=idToken\n        if let decodedTokenString = try? String(data: TokenManager().idTokenData(jwtString: idToken), encoding: .utf8) {\n            decodedIdToken = decodedTokenString\n        }\n\n        auditRecord.identityToken = decodedIdToken\n        auditRecord.identityTokenUpdateDate = Date()\n        saveAuditRecord(auditRecord)\n\n    }\n    func refreshTokenUpdated(_ wasSuccessful:Bool)  {\n        var auditRecord = currentAuditRecord()\n        auditRecord.refreshTokenUpdateSuccess = wasSuccessful\n        auditRecord.refreshTokenUpdateDate = Date()\n        saveAuditRecord(auditRecord)\n    }\n\n\n   internal func auditError(_ error:String)  {\n        var auditRecord = currentAuditRecord()\n        auditRecord.lastError = error\n        saveAuditRecord(auditRecord)\n    }\n    internal func loginWindowLogin(user:String){\n        var loginWindowAuditRecord = currentAuditRecord()\n        loginWindowAuditRecord.lastSuccessfulLoginUser = user\n        loginWindowAuditRecord.lastSuccessfulLoginDate = Date()\n        saveAuditRecord(loginWindowAuditRecord)\n    }\n\n    internal func currentAuditRecord() -> AuditRecord {\n        if FileManager.default.fileExists(atPath:configFileURL.path){\n            if let data = try? Data(contentsOf: configFileURL) {\n              let decoder = PropertyListDecoder()\n                if let auditRecord =  try? decoder.decode(AuditRecord.self, from: data) {\n                    return auditRecord\n                }\n            }\n        }\n        return AuditRecord()\n    }\n    func auditRecord(path:String) -> AuditRecord? {\n        if FileManager.default.fileExists(atPath:path){\n            if let data = try? Data(contentsOf: URL(filePath:path)) {\n              let decoder = PropertyListDecoder()\n                if let auditRecord =  try? decoder.decode(AuditRecord.self, from: data) {\n                    return auditRecord\n                }\n            }\n        }\n        return AuditRecord()\n    }\n    func auditRecordDictionary(_ auditRecord:AuditRecord) -> [String:String]{\n\n        var returnDict:[String:String] = [:]\n\n        if let lastSuccessfulLoginDate = auditRecord.lastSuccessfulLoginDate {\n            returnDict[\"lastSuccessfulLoginDate\"] = lastSuccessfulLoginDate.description\n        }\n\n        if let lastSuccessfulLoginUser = auditRecord.lastSuccessfulLoginUser {\n            returnDict[\"lastSuccessfulLoginUser\"] = lastSuccessfulLoginUser\n        }\n\n        if let username = auditRecord.username {\n            returnDict[\"username\"] = username\n        }\n\n        if let identityToken = auditRecord.identityToken {\n            returnDict[\"identityToken\"] = identityToken\n        }\n\n        if let identityTokenUpdateDate = auditRecord.identityTokenUpdateDate {\n            returnDict[\"identityTokenUpdateDate\"] = identityTokenUpdateDate.description\n        }\n\n        if let refreshTokenUpdateDate = auditRecord.refreshTokenUpdateDate {\n            returnDict[\"refreshTokenUpdateDate\"] = refreshTokenUpdateDate.description\n        }\n\n        if let refreshTokenUpdateSuccess = auditRecord.refreshTokenUpdateSuccess {\n            returnDict[\"refreshTokenUpdateSuccess\"] = refreshTokenUpdateSuccess==true ? \"true\":\"false\"\n        }\n\n        if let tokenLastUpdatedDate = auditRecord.tokenLastUpdatedDate {\n            returnDict[\"tokenLastUpdatedDate\"] = tokenLastUpdatedDate.description\n        }\n\n        if let lastError = auditRecord.lastError {\n            returnDict[\"lastError\"] = lastError\n        }\n\n        if let lastErrorDate = auditRecord.lastErrorDate {\n            returnDict[\"lastErrorDate\"] = lastErrorDate.description\n        }\n\n\n\n        return returnDict\n\n    }\n}\n\n"
  },
  {
    "path": "SiteManager.swift",
    "content": "//\n//  SiteManager.swift\n//  NoMAD\n//\n//  Created by Joel Rennich on 9/11/17.\n//  Copyright © 2018 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\nimport SystemConfiguration\n//import NoMADPRIVATE\n\n// singleton for the class\n\nlet siteManager = SiteManager()\n\nvar updatePending = false\nvar updateTimer: Timer? = nil\n\n// simple class to use as a global site manager\n\nclass SiteManager {\n    \n    // variables\n    \n    var sites = [String:[NoMADLDAPServer]]()\n    \n    // this seems silly to set a notification to notify internally to clearSites... but here goes\n    \n    let changed: SCDynamicStoreCallBack = { dynamicStore, _, _ in\n        \n        // TODO: throttle too many lookups too quickly\n        \n        print(\"Network change\")\n        let updateNotification = Notification(name: Notification.Name(rawValue: \"menu.nomad.NoMAD-ADAuth.updateNow\"))\n        NotificationQueue.default.enqueue(updateNotification, postingStyle: .now)\n        \n    }\n    \n    func checkNetwork() {\n        var dynamicContext = SCDynamicStoreContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)\n        let dcAddress = withUnsafeMutablePointer(to: &dynamicContext, {UnsafeMutablePointer<SCDynamicStoreContext>($0)})\n        \n        if let dynamicStore = SCDynamicStoreCreate(kCFAllocatorDefault, \"menu.nomad.NoMAD.networknotification\" as CFString, changed, dcAddress) {\n            let keysArray = [\"State:/Network/Global/IPv4\" as CFString, \"State:/Network/Global/IPv6\"] as CFArray\n            SCDynamicStoreSetNotificationKeys(dynamicStore, nil, keysArray)\n            let loop = SCDynamicStoreCreateRunLoopSource(kCFAllocatorDefault, dynamicStore, 0)\n            CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, .defaultMode)\n        }\n        \n        // register for notifications\n        \n        NotificationCenter.default.addObserver(self, selector: #selector(clearSites), name: NSNotification.Name(rawValue: \"menu.nomad.NoMAD-ADAuth.updateNow\"), object: nil)\n    }\n    \n    @objc func clearSites() {\n        \n        // removes all sites\n        \n        sites.removeAll()\n    }\n    \n    // listen for network changes\n}\n"
  },
  {
    "path": "StateFileHelper.swift",
    "content": "//\n//  RunFileHelper.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 11/27/24.\n//\n\nimport Foundation\n\nclass StateFileHelper {\n    enum StateFileHelperError:Error {\n    case FileCreationError\n    }\n\n    enum StateFileType {\n        case returnType\n        case delayType\n        case fileVaultLogin\n    }\n\n    func paths(_ fileType:StateFileType) -> (folderPath:String, filePath:String){\n        var folderPath=\"\"\n        var filePath=\"\"\n        switch fileType {\n        case .returnType:\n            folderPath = \"/usr/local/var/\"\n            filePath = \"xcreds_return\"\n\n        case .delayType:\n            folderPath = \"/usr/local/var/\"\n            filePath = \"xcreds_delay\"\n        case .fileVaultLogin:\n            folderPath = \"/Library/Application Support/XCreds/statefile/\"\n            filePath = \"xcreds_filevaultlogin\"\n        }\n        return (folderPath, filePath)\n    }\n    func createFile(_ fileType:StateFileType) throws  {\n        TCSLogWithMark()\n\n        \n        let (folderPath, filePath) = paths(fileType)\n\n        var attributes = [FileAttributeKey : Any]()\n        attributes[.posixPermissions] = 0o770\n        attributes[.ownerAccountID] = 92\n        attributes[.groupOwnerAccountID] = 0\n\n\n        if FileManager.default.fileExists(atPath: folderPath)==false {\n            try FileManager.default.createDirectory(atPath: folderPath, withIntermediateDirectories: true, attributes:attributes)\n\n        }\n        attributes[.posixPermissions] = 0o660\n\n\n        if FileManager.default.createFile(atPath: folderPath+filePath, contents: nil, attributes: attributes)==false {\n            throw StateFileHelperError.FileCreationError\n        }\n\n\n    }\n    func fileExists(_ fileType:StateFileType) -> Bool {\n        TCSLogWithMark()\n        let (folderPath, filePath) = paths(fileType)\n\n        let fullPath = folderPath + filePath\n        return FileManager.default.fileExists(atPath: fullPath)\n    }\n    func removeFile(_ fileType:StateFileType) throws {\n        TCSLogWithMark()\n        let (folderPath, filePath) = paths(fileType)\n\n        let fullPath = folderPath + filePath\n        if FileManager.default.fileExists(atPath: fullPath){\n            return try FileManager.default.removeItem(atPath: fullPath)\n        }\n\n    }\n\n    func killOrReboot(){\n\n        if UserDefaults.standard.bool(forKey:PrefKeys.shouldUseKillWhenLoginWindowSwitching.rawValue)==true{\n            TCSLogWithMark(\"killing loginwindow\")\n\n            do {\n                try createFile(.delayType)\n            }\n            catch {\n                TCSLog(\"could not create delay file\")\n            }\n\n            let _ = cliTask(\"/usr/bin/killall loginwindow\")\n\n        }\n        else {\n            TCSLogWithMark(\"Reboot\")\n            let _ = cliTask(\"/sbin/reboot\")\n\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "StatusMenuWindowController.swift",
    "content": "//\n//  StatusMenuWindowController.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 12/8/23.\n//\n\nimport Cocoa\n\nclass StatusMenuWindowController: NSWindowController {\n\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n    }\n    \n\n}\n"
  },
  {
    "path": "StatusMenuWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"StatusMenuWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"107\" y=\"10\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "TCSTKSmartCard.h",
    "content": "//\n//  TCSTKSmartCard.h\n//  Smart Card Utility\n//\n//  Created by Timothy Perfitt on 11/2/25.\n//  Copyright © 2025 Twocanoes Software. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <CryptoTokenKit/CryptoTokenKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n\n@interface TCSTKSmartCard : TKSmartCard\n@property (retain) TKSmartCard *tkSmartCard;\n- (instancetype)initFromTKSmartCard:(TKSmartCard *)smartcard ;\n- (nullable NSData *)sendIns:(UInt8)ins p1:(UInt8)p1 p2:(UInt8)p2 data:(nullable NSData *)requestData le:(nullable NSNumber *)le sw2:(UInt16 *)sw error:(NSError **)error;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "TCSTKSmartCard.m",
    "content": "//\n//  TCSTKSmartCard.m\n//  Smart Card Utility\n//\n//  Created by Timothy Perfitt on 11/2/25.\n//  Copyright © 2025 Twocanoes Software. All rights reserved.\n//\n\n#import \"TCSTKSmartCard.h\"\n#import <CryptoTokenKit/CryptoTokenKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@implementation TCSTKSmartCard\n\n\n- (instancetype)initFromTKSmartCard:(TKSmartCard *)smartcard {\n    self = [super init];\n    if (self) {\n        self.tkSmartCard=smartcard;\n    }\n    return self;\n}\n- (nullable NSData *)sendIns:(UInt8)ins p1:(UInt8)p1 p2:(UInt8)p2 data:(nullable NSData *)requestData le:(nullable NSNumber *)le sw2:(UInt16 *)sw error:(NSError **)error{\n\n    \n    NSData * res = [self.tkSmartCard sendIns:ins p1:p1 p2:p2 data:requestData le:le sw:sw error:error];\n    return res;\n\n}\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "TCTaskHelper.h",
    "content": "//\n//  TCTaskHelper.h\n//\n//  Created by Tim Perfitt on 2/20/17.\n//  Copyright © 2017 Twocanoes Software, Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TCTaskHelper : NSObject\n\n+(TCTaskHelper *)sharedTaskHelper;\n-(NSString *)runCommand:(NSString *)command withOptions:(NSArray *)inOptions;\n\n@end\n"
  },
  {
    "path": "UserRecord.swift",
    "content": "//\n//  UserRecord.swift\n//  nomad-ad\n//\n//  Created by Joel Rennich on 9/9/17.\n//  Copyright © 2018 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol NoMADUserRecord {\n    var firstName: String { get }\n    var lastName: String { get }\n    var fullName: String { get }\n    var shortName: String { get }\n    var upn: String { get }\n    var email: String? { get }\n    var groups: [String] { get }\n    var homeDirectory: String? { get }\n    var passwordSet: Date { get }\n    var passwordExpire: Date? { get }\n    var uacFlags: Int? { get }\n}\n\npublic struct ADUserRecord: NoMADUserRecord, Equatable {\n    \n    public let type : LDAPType = .AD\n    public var userPrincipal : String\n    public var firstName: String\n    public var lastName: String\n    public var fullName: String\n    public var shortName: String\n    public var upn: String\n    public var email: String?\n    public var groups: [String]\n    public var homeDirectory: String?\n    public var passwordSet: Date\n    public var passwordExpire: Date?\n    public var uacFlags: Int?\n    public var passwordAging: Bool?\n    public var computedExireDate: Date?\n    public var updatedLast: Date\n    public var domain: String\n    public var cn: String\n    public var pso: String?\n    public var passwordLength: Int?\n    public var ntName: String\n    public var customAttributes: [String:Any]?\n    public var rawAttributes:[String:String]?\n\n    public static func ==(lhs: ADUserRecord, rhs: ADUserRecord) -> Bool {\n        return (lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName)\n    }\n}\n"
  },
  {
    "path": "XCreds/AboutWindow.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"AboutWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"aboutTextView\" destination=\"HTA-3B-1DF\" id=\"19t-VL-p6y\"/>\n                <outlet property=\"window\" destination=\"e3r-XM-xJP\" id=\"3Kl-qd-Sux\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"5Ar-2a-lNk\"/>\n        <window title=\"About\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"e3r-XM-xJP\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"560\" y=\"551\" width=\"915\" height=\"564\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"ZbF-tC-vpZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"915\" height=\"564\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView borderType=\"none\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bSr-fP-G7u\">\n                        <rect key=\"frame\" x=\"20\" y=\"20\" width=\"875\" height=\"524\"/>\n                        <clipView key=\"contentView\" drawsBackground=\"NO\" id=\"ca1-PV-x7f\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"875\" height=\"524\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textView wantsLayer=\"YES\" editable=\"NO\" importsGraphics=\"NO\" richText=\"NO\" verticallyResizable=\"YES\" allowsCharacterPickerTouchBarItem=\"NO\" textCompletion=\"NO\" id=\"HTA-3B-1DF\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"875\" height=\"524\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <size key=\"minSize\" width=\"875\" height=\"524\"/>\n                                    <size key=\"maxSize\" width=\"875\" height=\"10000000\"/>\n                                    <attributedString key=\"textStorage\">\n                                        <fragment content=\"asdffd\">\n                                            <attributes>\n                                                <color key=\"NSColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <font key=\"NSFont\" size=\"13\" name=\"CourierNewPSMT\"/>\n                                                <font key=\"NSOriginalFont\" size=\"12\" name=\"Helvetica\"/>\n                                                <paragraphStyle key=\"NSParagraphStyle\" alignment=\"natural\" lineBreakMode=\"wordWrapping\" baseWritingDirection=\"natural\" tighteningFactorForTruncation=\"0.0\"/>\n                                            </attributes>\n                                        </fragment>\n                                    </attributedString>\n                                    <color key=\"insertionPointColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textView>\n                            </subviews>\n                        </clipView>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"358\" id=\"3lx-YV-0rq\"/>\n                            <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"673\" id=\"ttd-79-b3Y\"/>\n                        </constraints>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"YH2-jc-few\">\n                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"240\" height=\"16\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"Nxp-18-SHh\">\n                            <rect key=\"frame\" x=\"859\" y=\"0.0\" width=\"16\" height=\"524\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"bSr-fP-G7u\" secondAttribute=\"bottom\" constant=\"20\" id=\"MQN-fC-UsZ\"/>\n                    <constraint firstItem=\"bSr-fP-G7u\" firstAttribute=\"top\" secondItem=\"ZbF-tC-vpZ\" secondAttribute=\"top\" constant=\"20\" id=\"WLh-Sx-3YW\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"bSr-fP-G7u\" secondAttribute=\"trailing\" constant=\"20\" id=\"swY-up-ZR5\"/>\n                    <constraint firstItem=\"bSr-fP-G7u\" firstAttribute=\"leading\" secondItem=\"ZbF-tC-vpZ\" secondAttribute=\"leading\" constant=\"20\" id=\"w0d-4V-3Nc\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"gvt-4q-n77\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"401.5\" y=\"387\"/>\n        </window>\n        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" id=\"dXE-Xt-nIV\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"90\" height=\"16\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"DiscoveryURL\" id=\"1hp-g2-T6a\">\n                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n            </textFieldCell>\n            <point key=\"canvasLocation\" x=\"49\" y=\"340\"/>\n        </textField>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/AboutWindowController.swift",
    "content": "//\n//  AboutWindowController.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\n\nclass AboutWindowController: NSWindowController {\n\n\n    @IBOutlet weak var aboutTextView:NSTextView!\n    @objc override var windowNibName: NSNib.Name {\n        return NSNib.Name(\"AboutWindow\")\n    }\n\n     override func awakeFromNib() {\n\n         let infoPlist = Bundle.main.infoDictionary\n         if let infoPlist = infoPlist {\n             let appVersion = Bundle.main.infoDictionary?[\"CFBundleShortVersionString\"] as? String\n\n             let build = infoPlist[\"CFBundleVersion\"] as? String\n\n//             let historyPath = Bundle.main.path(forResource: \"History\", ofType: \"md\")\n             let creditsPath = Bundle.main.path(forResource: \"Credits\", ofType: \"txt\")\n             if  let creditsPath = creditsPath ,let creditsString = try? String(contentsOfFile: creditsPath, encoding: .utf8), let build = build, let appVersion = appVersion  {\n\n                 aboutTextView.string=\"XCreds\\nCopyright Twocanoes Software, Inc.\\nVersion \\(appVersion) (\\(build))\\n\\n\"+creditsString\n\n             }\n         }\n\n    }\n\n}\n"
  },
  {
    "path": "XCreds/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Cocoa\nimport ArgumentParser\nimport CryptoKit\nimport CryptoTokenKit\n\n@main\n@available(macOS, deprecated: 11)\nstruct xcreds:ParsableCommand {\n\n    static var configuration = CommandConfiguration(\n        abstract: \"Command line interface for XCreds.\",\n        subcommands: [Status.self,ImportRFIDUsers.self, ShowTemplate.self,SetRFIDUser.self, ShowRFIDUser.self,ShowRFIDUsers.self, RemoveRFIDUser.self,SetAdminUser.self,ShowAdminUser.self, ClearAdminUser.self,ClearRFIDUsers.self, ListReaders.self,RFIDListener.self, RunApp.self],\n        defaultSubcommand: RunApp.self)\n\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct Status:ParsableCommand {\n        @Flag(help:\"JSON output\") var json:Bool = false\n        static var configuration = CommandConfiguration(abstract: \"Get status of XCreds\")\n        @Argument(parsing: .allUnrecognized)\n\n\n        var other: [String] = []\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            struct XCredsInfo:Codable {\n                var consoleRights:[String]?\n                var userInfo:[String:Dictionary<String,String>]?\n                var oidcUsers:[[String:String]]?\n                var xcredsVersion:String=\"\"\n                var xcredsBuild:String=\"\"\n\n                var xcredLicenseStatus:String=\"\"\n                var xcredsLicenseDaysRemaining:String=\"\"\n                init() {\n                    let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n                    if let bundle = bundle {\n                        let infoPlist = bundle.infoDictionary\n                        if let infoPlist = infoPlist, let buildFromInfoPlist = infoPlist[\"CFBundleVersion\"] as? String, let versionFromInfoPlist = infoPlist[\"CFBundleShortVersionString\"] as? String {\n                            xcredsBuild = buildFromInfoPlist\n                            xcredsVersion = versionFromInfoPlist\n                        }\n                    }\n\n                    let licenseState = LicenseChecker().currentLicenseState()\n\n                    switch licenseState {\n\n                    case .valid(let secRemaining):\n                        let daysRemaining = Int(secRemaining/(24*60*60))\n\n                        xcredLicenseStatus=\"Valid\"\n                        xcredsLicenseDaysRemaining=String(format:\"%i\",daysRemaining)\n                    case .invalid:\n                        xcredLicenseStatus=\"Invalid\"\n\n                    case .trial(_):\n                        xcredLicenseStatus=\"Trial\"\n\n                    case .trialExpired:\n                        xcredLicenseStatus=\"trialExpired\"\n\n                    case .expired:\n                        xcredLicenseStatus=\"expired\"\n\n                    }\n                }\n\n            }\n\n            enum UserKeys:String {\n                case realName=\"dsAttrTypeStandard:RealName\"\n                case homeDirectory=\"dsAttrTypeStandard:NFSHomeDirectory\"\n                case recordName=\"dsAttrTypeStandard:RecordName\"\n                case authenticationAuthority=\"dsAttrTypeStandard:AuthenticationAuthority\"\n                case oidcUsername=\"dsAttrTypeNative:_xcreds_oidc_username\"\n                case primaryGID=\"dsAttrTypeStandard:PrimaryGroupID\"\n                case shell=\"dsAttrTypeStandard:UserShell\"\n                case uid=\"dsAttrTypeStandard:UniqueID\"\n            }\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n\n            var info = XCredsInfo()\n\n            let rightsInfo =  AuthorizationDBManager().consoleRights()\n            var oidcUsers = [[String:String]]()\n            var usersResult=[String:Dictionary<String, String>]()\n\n\n\n            info.consoleRights = rightsInfo\n\n            if !json{\n\n\n                print(\"----- XCreds Info -----\")\n                print(\"     \" + \"XCreds Version:\" + info.xcredsVersion)\n                print(\"     \" + \"XCreds Build number:\" + info.xcredsBuild)\n                print(\"     \" + \"License Status:\" + info.xcredLicenseStatus)\n                if info.xcredLicenseStatus.isEmpty==false {\n                    print(\"     \" + \"Days Remaining:\" + info.xcredsLicenseDaysRemaining)\n\n                }\n                print(\"----- Last User Info -----\")\n\n                if let loginWindowAuditRecord = XCredsAudit().auditRecord(path: \"/var/db/securityagent/.xcredsaudit\") {\n\n                    let auditDict = XCredsAudit().auditRecordDictionary(loginWindowAuditRecord)\n                    for (k,v) in auditDict{\n                        if !json {\n                            print(\"     \" + k +  \": \" + v)\n                        }\n                    }\n\n                }\n\n\n                print(\"----- CONSOLE RIGHTS -----\")\n                for thisRight in rightsInfo {\n\n                    print(\"     \" + thisRight)\n                }\n            }\n            do {\n                let users = try PasswordUtils().getAllNonSystemUsers()\n                var userDetailsInfo = [String:String]()\n                if !json {\n                    print(\"----- OIDC User Info -----\")\n                }\n                for user in users {\n                    let userDetails = try? user.recordDetails(forAttributes: nil)\n                    if let userDetails = userDetails {\n                        if let homeDirArray = userDetails[\"dsAttrTypeStandard:NFSHomeDirectory\"] as? Array<String>, homeDirArray.count>0{\n                            let homeDir = homeDirArray[0]\n                            if let auditRecord = XCredsAudit().auditRecord(path: homeDir+\"/.xcredsaudit\") {\n\n                                let auditDict = XCredsAudit().auditRecordDictionary(auditRecord)\n                                for (k,v) in auditDict{\n                                    userDetailsInfo[k] = v\n                                    if !json {\n                                        print(\"          \" + k +  \": \" + v)\n\n\n                                    }\n                                }\n\n                            }\n\n                        }\n\n                        for userDetail in userDetails {\n\n                            if let key = userDetail.key as? String,let _ = UserKeys(rawValue: key), let values = userDetail.value as? [String]\n\n                                {\n                                let value = values.joined(separator: \"\")\n                                userDetailsInfo[key] = value\n                                if key == UserKeys.oidcUsername.rawValue {\n                                    oidcUsers.append([\"localUsername\":user.recordName,\"oidcUsername\":value])\n                                    if !json {\n                                        print(\"     \" + user.recordName)\n                                        print(\"          localUsername\" + \":\" + user.recordName)\n                                        print(\"          oidcUsername\" +  \": \" + value)\n                                    }\n                                }\n                            }\n\n                        }\n                    }\n                    usersResult[user.recordName] = userDetailsInfo\n\n                }\n                info.oidcUsers=oidcUsers\n                info.userInfo = usersResult\n                let encoder =  JSONEncoder()\n                encoder.outputFormatting = .prettyPrinted\n                let jsonOutput = try encoder.encode(info)\n                if json {\n                    print(String(data: jsonOutput, encoding: .utf8)!)\n                }\n            }\n            catch {\n                print(error)\n            }\n\n            return\n        }\n\n\n\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ListReaders:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"List currently plugged in RFID readers.\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            let slotNames = TKSmartCardSlotManager.default?.slotNames\n\n            guard let slotNames = slotNames, slotNames.count>0 else {\n                print(\"No readers found\")\n                return\n            }\n\n            for slot in slotNames {\n\n                print(slot)\n            }\n            return\n        }\n\n\n\n    }\n}\n\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct RFIDListener:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Listen and print the RFID of scanned cards.\")\n\n        @Option(help: \"reader name\")\n        var readerName:String\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            print(\"press control-c to exit\")\n\n            let watcher = TKTokenWatcher()\n            watcher.setInsertionHandler({ tokenID in\n                print(\"card inserted\")\n\n                watcher.addRemovalHandler({ tokenID in\n                    print(\"card removed\")\n                }, forTokenID: tokenID)\n\n                let slotNames = TKSmartCardSlotManager.default?.slotNames\n\n                guard let slotNames = slotNames, slotNames.count>0 else {\n                    return\n                }\n\n                if slotNames.contains(readerName) == false {\n\n                    print(\"reader \\(readerName) not found\")\n                    NSApplication.shared.terminate(self)\n\n                }\n\n\n\n                let slot = TKSmartCardSlotManager.default?.slotNamed(readerName)\n                guard let tkSmartCard = slot?.makeSmartCard() else {\n                    print(\"error finding smartcard in reader \\(readerName). Make sure the card was inserted into this reader.\")\n                    return\n                }\n\n                let builtInReader = CCIDCardReader(tkSmartCard: tkSmartCard)\n                let returnData = builtInReader.sendAPDU(cla: 0xFF, ins: 0xCA, p1: 0, p2: 0, data: nil)\n                if let returnData=returnData, returnData.count>2{\n                    DispatchQueue.main.async {\n                        let hex=returnData[0...returnData.count-3].hexEncodedString()\n                        print(hex)\n                    }\n                }\n\n            })\n\n            RunLoop.main.run()\n\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct RunApp:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Start app normally.\")\n            @Argument(parsing: .allUnrecognized)\n            var other: [String] = []\n\n        func run() throws {\n\n\n            //used to register ccid reader as root. no idea why\n            //this is needed.\n            if other.contains(\"-r\") {\n                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+5) {\n                    NSApplication.shared.terminate(self)\n                }\n            }\n\n            let app = NSApplication.shared\n\n            let appDelegate = AppDelegate()\n            app.delegate = appDelegate\n            _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)\n        }\n\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ShowAdminUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Show currently set admin user. Used for resetting keychain.\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n            if let adminUser = try userManager.adminCredentials(), !adminUser.username.isEmpty {\n                print(\"\\(adminUser.username)\")\n\n            }\n            else {\n                print(\"admin user not set\")\n            }\n\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ClearRFIDUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Clear rfid user.\")\n\n        @Option(help: \"Username to remove\")\n        var username:String\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n\n            do {\n                let res = try userManager.removeUIDUser(username: username)\n\n                if res == true {\n                    print(\"RFID user removed.\")\n\n                }\n                else {\n                    print(\"RFID User could not be removed. Please check the username and try again\")\n                }\n\n            }\n            catch {\n                print(error.localizedDescription)\n            }\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ClearRFIDUsers:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Clear all users. Does not clear the admin user.\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n            try userManager.clearUIDUsers()\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ClearAdminUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Clear the current admin user used for resetting keychain.\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n            try userManager.updateLocalAdminCredentials(user: SecretKeeperUser(fullName: \"\", username: \"\", password: \"\", uid: -1, rfidUID: Data(), pin: nil))\n\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct SetAdminUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Set the current admin user used for resetting keychain.\")\n\n        @Option(help: \"Update Admin username\")\n        var adminusername:String\n\n        @Option(help: \"Update Admin password\")\n        var adminpassword:String\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n            }\n\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n            try userManager.updateLocalAdminCredentials(user: SecretKeeperUser(fullName: \"\", username: adminusername, password: adminpassword, uid: NSNumber(value: -1), rfidUID: Data(), pin: nil))\n        }\n\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct SetRFIDUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Add an RFID user.\")\n        @Argument(parsing: .allUnrecognized)\n        var other: [String] = []\n\n        @Option(help: \"Update Fullname\")\n        var fullname:String\n\n        @Option(help: \"Update username\")\n        var username:String\n\n        @Option(help: \"Update Password\")\n        var password:String\n\n        @Option(help: \"Update UID\")\n        var uid:String = \"\"\n\n        @Option(help: \"Update RFID-uid\")\n        var rfiduid:String\n\n        @Option(help: \"PIN\")\n        var pin:String?\n\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n\n            do {\n                if !username.isEmpty && !password.isEmpty && !fullname.isEmpty && !rfiduid.isEmpty{\n\n\n                    let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n\n                    let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                    guard let rfidUIDData = Data(fromHexEncodedString: rfiduid) else {\n                        print(\"invalid rfid. Must be hex with no 0x prefix\")\n                        return\n\n                    }\n\n\n                    try userManager.setUIDUser(fullName: fullname, rfidUID: rfidUIDData, username: username, password: password, uid: NSNumber(value: Int(uid) ?? -1), pin: pin)\n                    print(\"user set. If this Mac system is at the XCreds login window, please restart (or log in and log out) to use the new user.\")\n                }\n            }\n            catch {\n                print(error.localizedDescription)\n\n            }\n        }\n\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ShowRFIDUsers:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Show RFID users.\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n            do {\n                let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n                let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                let users = try userManager.uidUsers()\n\n                print(\"Full Name:Username:UserID:Requires PIN\")\n\n                guard let rfidUsers = users.userDict else {\n                    return\n                }\n                for currKey in rfidUsers.keys{\n                    if let user = rfidUsers[currKey], let fullname = user.fullName,let _ = rfidUsers[currKey]?.password {\n                        print(\"\\(fullname):\\(user.username):\\(user.userUID):\\(user.requiresPIN==true ? \"Y\":\"N\")\")\n\n                    }\n                }\n            }\n            catch {\n                print(error.localizedDescription)\n            }\n        }\n    }\n}\n\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ShowRFIDUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Show RFID user.\")\n\n\n        @Option(help: \"RFID-uid in hex with no 0x in front.\")\n        var rfidUID:String\n\n        @Option(help: \"PIN\")\n        var pin:String?\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n            do {\n                let rfidUidData = Data(fromHexEncodedString: rfidUID)\n                guard let rfidUidData = rfidUidData else {\n                    print(\"bad RFID rfidUidData\")\n\n                    return\n                }\n\n                let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n                let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                guard let user = try userManager.uidUser(uid: rfidUidData) else {\n                    print(\"user not found\")\n                    return\n                }\n\n                if user.requiresPIN == true && pin == nil {\n\n                    print(\"you must enter a PIN for this user\")\n                    return\n                }\n                let password = try PasswordCryptor().passwordDecrypt(encryptedDataWithSalt: user.password, rfidUID: rfidUidData, pin:pin)\n\n                if password.count>0 {\n\n                    print(\"Fullname: \\(user.fullName ?? \"No full name\"), Username:\\(user.username), UID:\\(user.userUID)\")\n                }\n                else {\n                    print(\"no password set for user \\(user.username)\")\n                }\n\n            }\n            catch {\n                print(\"failed to find user, valid PIN, or both\")\n            }\n\n\n        }\n    }\n}\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct RemoveRFIDUser:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Remove RFID user by rfid-uid.\")\n\n\n        @Option(help: \"RFID-uid in hex with no 0x in front.\")\n        var rfidUID:String\n\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n            if geteuid() != 0  {\n                print(\"This operation requires root. Please run with sudo.\")\n                NSApplication.shared.terminate(self)\n\n            }\n            do {\n                let rfidUidData = Data(fromHexEncodedString: rfidUID)\n                guard let rfidUidData = rfidUidData else {\n                    print(\"bad RFID rfidUidData\")\n\n                    return\n                }\n\n                let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n                let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                guard let _ = try userManager.uidUser(uid: rfidUidData) else {\n                    print(\"user not found\")\n                    return\n                }\n                if try userManager.removeUIDUser(uid: rfidUidData) == false {\n                    print(\"user could not be removed\")\n                }\n                else {\n                    print(\"user removed. If this Mac system is at the XCreds login window, please restart (or log in and log out) to prevent the user from logging in.\")\n\n\n                }\n\n            }\n            catch {\n                print(error.localizedDescription)\n            }\n\n\n        }\n    }\n}\n\n\n\n\n@available(macOS, deprecated: 11)\nextension xcreds {\n    struct ImportRFIDUsers:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Import users from a CSV for RFID login. Format:Full Name,Username,Password,RFID-UID,PIN,UID. PIN and UID can be left blank. All imported user data is encrypted and stored in a file located in /usr/local/var/twocanoes. The file is only readable by root.\")\n\n\n        @Option(help: \"file\")\n        var file:String\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n\n            if !file.isEmpty {\n                if FileManager.default.fileExists(atPath: file)==false {\n                    print(\"\\(file) does not exist.\")\n                }\n                do {\n                    let contentsOfFile = try String(contentsOfFile: file, encoding: .windowsCP1250)\n\n                    _=RFIDUsers(rfidUsers: [:])\n                    let lineArray = contentsOfFile.components(separatedBy:\"\\n\")\n\n                    let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n\n                    let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                    var count = 0\n                    for line in lineArray {\n                        if line.count==0 {\n                            continue\n                        }\n                        let userInfo = line.components(separatedBy: \",\")\n                        if userInfo.count != 6 {\n                            print(\"invalid line. skipping. Line:\\\"\\(line)\\\"\")\n                            continue\n                        }\n                        let fullname = userInfo[0].trimmingCharacters(in: .whitespacesAndNewlines)\n                        if fullname == \"Full Name\" {\n                            print(\"skipping header\")\n                            continue\n                        }\n                        var pin:String?\n                        let username = userInfo[1].trimmingCharacters(in: .whitespacesAndNewlines)\n                        let password = userInfo[2].trimmingCharacters(in: .whitespacesAndNewlines)\n                        let rfidUid = userInfo[3].trimmingCharacters(in: .whitespacesAndNewlines)\n                        let pinString = userInfo[4].trimmingCharacters(in: .whitespacesAndNewlines)\n\n                        if pinString.isEmpty {\n                            pin=nil\n                        }\n                        else {\n                            pin = pinString\n                        }\n\n                        let uid = Int(userInfo[5].trimmingCharacters(in: .whitespacesAndNewlines)) ?? -1\n                        print(\"importing \\(rfidUid):\\(fullname):\\(username):\\(uid)\")\n\n\n                        guard let rfidUidData = rfidUid.data(using: .hexadecimal) else {\n\n                            print(\"invalid uid\")\n                            return\n                        }\n                        try userManager.setUIDUser(fullName: fullname, rfidUID: rfidUidData, username: username, password: password, uid: NSNumber(value: Int(uid)), pin: pin)\n\n                        count += 1\n                    }\n\n//                    try userManager.setUIDUsers(rfidUsers)\n                    print(\"\\(count) users imported. If this Mac system is at the XCreds login window, please restart (or log in and log out) to use the new users.\")\n                }\n                catch {\n                    print(\"\\(file) cannot be read. \\(error)\")\n\n                }\n            }\n\n        }\n\n    }\n    struct ShowTemplate:ParsableCommand {\n        static var configuration = CommandConfiguration(abstract: \"Template for importing RFID users. The header row is optional. PIN and UID can be left blank but must contain commas with empty values as show below. John Doe has all values, Sam Doe does not have a PIN, and Jane Doe does not have a PIN or a UID (UID will be automatically selected when the user account is created)\")\n\n        func run() throws {\n            TCSUnifiedLogger.shared().suppressDebug=true\n\n            print(\"Full Name,Username,Password,RFID-UID,PIN,UID\")\n            print(\"John Doe,jdoe,password%1!,00124565,000000,601\")\n            print(\"Sam Doe,sam,password@3^,DEADBEEF,,602\")\n            print(\"Jane Doe,jane,password@2^,08091A1B1C1D1E,,\")\n\n\n        }\n\n    }\n\n}\n\n@available(macOS, deprecated: 11)\nclass AppDelegate: NSObject, NSApplicationDelegate, DSQueryable {\n\n    @IBOutlet weak var loginPasswordWindow: NSWindow!\n    @IBOutlet var window: NSWindow!\n    var mainController:MainController?\n    var screenIsLocked=true\n    var isDisplayAsleep=true\n    var waitForScreenToWake=false\n    @IBOutlet var shareMounterMenu: ShareMounterMenu?\n    @IBOutlet weak var statusMenu: NSMenu!\n    var shareMenu:NSMenu?\n    var statusBarItem:NSStatusItem?\n    var watcher: TKTokenWatcher?\n\n    func updateShareMenu(adUser:ADUserRecord){\n        shareMounterMenu?.shareMounter?.adUserRecord = adUser\n        shareMounterMenu?.updateShares(connected: true)\n        shareMenu = shareMounterMenu?.buildMenu(connected: true)\n\n        if let sharesMenuItem = statusMenu.item(withTag: StatusMenuController.StatusMenuItemType.SharesMenuItem.rawValue) {\n\n            if shareMenu?.items.count==0{\n                sharesMenuItem.isHidden=true\n            }\n            else {\n                sharesMenuItem.isHidden=false\n                statusMenu.setSubmenu(shareMenu, for:sharesMenuItem )\n            }\n\n        }\n\n    }\n    func updateStatusMenuExpiration(_ expires:Date?) {\n\n        ///TODO: implement edge cases\n        return\n//        DispatchQueue.main.async {\n//\n//            TCSLogWithMark()\n//\n//            if let expires = expires {\n//                let daysToGo = Int(abs(expires.timeIntervalSinceNow)/86400)\n//\n//                self.statusBarItem?.button?.title=\"\\(daysToGo)d\"\n//                let dateFormatter = DateFormatter()\n//                dateFormatter.dateStyle = .medium\n//                dateFormatter.timeStyle = .short\n//\n//\n//                self.statusBarItem?.button?.toolTip = dateFormatter.string(from: expires as Date)\n//\n//            }\n//            else {\n//                self.statusBarItem?.button?.title=\"\"\n//                self.statusBarItem?.button?.toolTip = \"\"\n//            }\n//\n//\n//        }\n    }\n    func updateStatusMenuIcon(showDot:Bool){\n\n\n        DispatchQueue.main.async {\n\n            TCSLogWithMark()\n            if showDot==true {\n                TCSLogWithMark(\"showing with dot\")\n\n                if let iconData=DefaultsOverride.standardOverride.data(forKey: PrefKeys.menuItemIconCheckedData.rawValue), let image = NSImage(data: iconData) {\n                    image.size=NSMakeSize(16, 16)\n                    self.statusBarItem?.button?.image=image\n\n                }\n                else {\n                    self.statusBarItem?.button?.image=NSImage(named: \"xcreds menu icon check\")\n                }\n\n            }\n            else {\n                TCSLogWithMark(\"showing without dot\")\n                if let iconData=DefaultsOverride.standardOverride.data(forKey: PrefKeys.menuItemIconData.rawValue), let image = NSImage(data: iconData) {\n                    image.size=NSMakeSize(16, 16)\n\n                    self.statusBarItem?.button?.image=image\n\n                }\n                else {\n                    self.statusBarItem?.button?.image=NSImage(named: \"xcreds menu icon\")\n                }\n            }\n        }\n    }\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        NetworkMonitor.shared.startMonitoring()\n        \n        updatePrefsFromDS()\n        self.statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)\n        statusBarItem?.isVisible=true\n        statusBarItem?.menu = statusMenu\n\n\n\n        if let iconData=DefaultsOverride.standardOverride.data(forKey: PrefKeys.menuItemIconData.rawValue), let image = NSImage(data: iconData) {\n            image.size=NSMakeSize(16, 16)\n\n            self.statusBarItem?.button?.image=image\n        }\n        else {\n            self.statusBarItem?.button?.image=NSImage(named: \"xcreds menu icon\")\n        }\n        let shareMounter = ShareMounter()\n\n        shareMounterMenu = ShareMounterMenu()\n        shareMounterMenu?.shareMounter = shareMounter\n        shareMounterMenu?.updateShares(connected: true)\n        shareMenu = shareMounterMenu?.buildMenu(connected: true)\n//\n        let defaultsPath = Bundle.main.path(forResource: \"defaults\", ofType: \"plist\")\n\n        if let defaultsPath = defaultsPath {\n\n            let defaultsDict = NSDictionary(contentsOfFile: defaultsPath)\n            TCSLogWithMark()\n            DefaultsOverride.standardOverride.register(defaults: defaultsDict as! [String : Any])\n        }\n\n        VersionCheck.shared.reportLicenseUsage(event: .checkin) { isSuccess in\n            print(isSuccess)\n        }\n\n        let infoPlist = Bundle.main.infoDictionary\n\n        if let infoPlist = infoPlist, let build = infoPlist[\"CFBundleVersion\"] {\n            TCSLogWithMark(\"Build \\(build)\")\n\n        }\n        DistributedNotificationCenter.default().addObserver(self, selector: #selector(screenLocked(_:)), name:NSNotification.Name(\"com.apple.screenIsLocked\") , object: nil)\n\n        DistributedNotificationCenter.default().addObserver(self, selector: #selector(screenUnlocked(_:)), name:NSNotification.Name(\"com.apple.screenIsUnlocked\") , object: nil)\n\n        NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidSleep(_:)), name:NSWorkspace.screensDidSleepNotification , object: nil)\n\n        NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidWake(_:)), name:NSWorkspace.screensDidWakeNotification , object: nil)\n\n        DispatchQueue.global().async{\n\n            if var autofillAppPath = Bundle.main.path(forResource: \"XCreds Login Autofill\", ofType: \"app\"){\n                autofillAppPath = autofillAppPath + \"/Contents/MacOS/XCreds Login Autofill\"\n                if FileManager.default.fileExists(atPath: autofillAppPath){\n\n                    let _ = TCTaskHelper.shared().runCommand(autofillAppPath, withOptions:[\"-r\"] )\n                    TCSLogWithMark(\"autofill registered\")\n                }\n            }\n        }\n        if UserDefaults.standard.bool(forKey: \"checkForUpdates\")==true{\n            checkForUpdates()\n        }\n        mainController = MainController()\n        mainController?.setup()\n\n    }\n    func checkForUpdates() {\n        let thisAppVersion = Bundle.main.infoDictionary?[\"CFBundleShortVersionString\"] as? String\n        let thisAppBundleID = Bundle.main.bundleIdentifier\n\n        if let thisAppVersion = thisAppVersion, let thisAppBundleID = thisAppBundleID,\n           let thisAppVersionFloat = Float(thisAppVersion){\n\n            VersionCheck.shared.versionForIdentifier(identifier: thisAppBundleID, version: thisAppVersion) { isSuccess, version in\n\n                if let versionFloat = Float(version),!thisAppVersion.isEmpty, !version.isEmpty, thisAppVersionFloat < versionFloat {\n                    TCSLogErrorWithMark(\"New version available: \\(thisAppVersion) < \\(version)\")\n                }\n            }\n        }\n    }\n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n    }\n\n    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n        return true\n    }\n    @objc func screenUnlocked(_ sender:Any) {\n        TCSLogWithMark()\n        screenIsLocked=false\n\n    }\n    @objc func screenLocked(_ sender:Any) {\n        TCSLogWithMark()\n        screenIsLocked=true\n        if isDisplayAsleep==true{\n\n            waitForScreenToWake=true\n        }\n        else {\n            waitForScreenToWake=false\n            switchToLoginWindow()        }\n\n    }\n    @objc func screenDidSleep(_ sender:Any) {\n        TCSLogWithMark()\n        isDisplayAsleep=true\n    }\n    @objc func screenDidWake(_ sender:Any) {\n        TCSLogWithMark()\n        isDisplayAsleep=false\n\n        if waitForScreenToWake==true {\n            waitForScreenToWake=false\n            switchToLoginWindow()\n        }\n    }\n    func switchToLoginWindow()  {\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSwitchToLoginWindowWhenLocked.rawValue)==true{\n            TCSLoginWindowUtilities().switchToLoginWindow(self)\n        }\n\n    }\n\n    func updatePrefsFromDS(){\n        if let currentUser = PasswordUtils.getCurrentConsoleUserRecord() {\n\n            do {\n                let attributesArray = try currentUser.recordDetails(forAttributes: nil)\n                for currAttribute in attributesArray {\n                    if let key = currAttribute.key as? String, key.hasPrefix(\"dsAttrTypeNative:_xcreds\"), let value = currAttribute.value as? Array<String>, let lastValue = value.last {\n                        let components = key.components(separatedBy: \":\")\n                        if let strippedKey = components.last{\n                            UserDefaults.standard.set(lastValue, forKey:strippedKey)\n                        }\n                    }\n                }\n            }\n            catch {\n                TCSLogWithMark(\"could not get attributes from user\")\n            }\n        }\n\n    }\n}\n\n"
  },
  {
    "path": "XCreds/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"icon_16x16.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_16x16@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_32x32.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_32x32@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_128x128.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_128x128@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_256x256.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_256x256@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_512x512.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"filename\" : \"icon_512x512@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds/Assets.xcassets/refresh symbol.imageset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"images\" : [\n    {\n      \"filename\" : \"refresh symbol~universal@1x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"refresh symbol~universal@2x.png\",\n      \"scale\" : \"2x\",\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"scale\" : \"3x\",\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refresh symbol~universal@3x.png\"\n    }\n  ]\n}"
  },
  {
    "path": "XCreds/Assets.xcassets/wifi.imageset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"images\" : [\n    {\n      \"filename\" : \"wifi~universal@1x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"wifi~universal@2x.png\",\n      \"scale\" : \"2x\",\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"scale\" : \"3x\",\n      \"filename\" : \"wifi~universal@3x.png\",\n      \"idiom\" : \"universal\"\n    }\n  ]\n}"
  },
  {
    "path": "XCreds/Assets.xcassets/xcreds menu icon check.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"scale\" : \"1x\",\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xcreds menu icon check~universal@1x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"xcreds menu icon check~universal@2x.png\"\n    },\n    {\n      \"filename\" : \"xcreds menu icon check~universal@3x.png\",\n      \"scale\" : \"3x\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}"
  },
  {
    "path": "XCreds/Assets.xcassets/xcreds menu icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"scale\" : \"1x\",\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xcreds menu icon~universal@1x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xcreds menu icon~universal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"filename\" : \"xcreds menu icon~universal@3x.png\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}"
  },
  {
    "path": "XCreds/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"24412\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"24412\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"statusMenu\" destination=\"6OK-7Y-Yf9\" id=\"ESM-bD-ycD\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"XCreds\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"XCreds\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About XCreds\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide XCreds\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit XCreds\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                        <items>\n                            <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                <connections>\n                                    <action selector=\"newDocument:\" target=\"-1\" id=\"4Si-XN-c54\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                <connections>\n                                    <action selector=\"openDocument:\" target=\"-1\" id=\"bVn-NM-KNZ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                    <items>\n                                        <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"clearRecentDocuments:\" target=\"-1\" id=\"Daa-9d-B3U\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                            <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                <connections>\n                                    <action selector=\"performClose:\" target=\"-1\" id=\"HmO-Ls-i7Q\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                <connections>\n                                    <action selector=\"saveDocument:\" target=\"-1\" id=\"teZ-XB-qJY\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                <connections>\n                                    <action selector=\"saveDocumentAs:\" target=\"-1\" id=\"mDf-zr-I0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                <connections>\n                                    <action selector=\"revertDocumentToSaved:\" target=\"-1\" id=\"iJ3-Pv-kwq\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                            <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"runPageLayout:\" target=\"-1\" id=\"Din-rz-gC5\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                <connections>\n                                    <action selector=\"print:\" target=\"-1\" id=\"qaZ-4w-aoO\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" keyEquivalent=\"s\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" keyEquivalent=\"s\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                        <items>\n                            <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                    <items>\n                                        <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                            <connections>\n                                                <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                            <connections>\n                                                <action selector=\"underline:\" target=\"-1\" id=\"FYS-2b-JAY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                        <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                        <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardKerning:\" target=\"-1\" id=\"6dk-9l-Ckg\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffKerning:\" target=\"-1\" id=\"U8a-gz-Maa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"tightenKerning:\" target=\"-1\" id=\"hr7-Nz-8ro\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"loosenKerning:\" target=\"-1\" id=\"8i4-f9-FKE\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardLigatures:\" target=\"-1\" id=\"7uR-wd-Dx6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffLigatures:\" target=\"-1\" id=\"iX2-gA-Ilz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useAllLigatures:\" target=\"-1\" id=\"KcB-kA-TuK\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"unscript:\" target=\"-1\" id=\"0vZ-95-Ywn\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"superscript:\" target=\"-1\" id=\"3qV-fo-wpU\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"subscript:\" target=\"-1\" id=\"Q6W-4W-IGz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"raiseBaseline:\" target=\"-1\" id=\"4sk-31-7Q9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowerBaseline:\" target=\"-1\" id=\"OF1-bc-KW4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                        <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                            <connections>\n                                                <action selector=\"orderFrontColorPanel:\" target=\"-1\" id=\"mSX-Xz-DV3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                        <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyFont:\" target=\"-1\" id=\"GJO-xA-L4q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteFont:\" target=\"-1\" id=\"JfD-CL-leO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                    <items>\n                                        <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                            <connections>\n                                                <action selector=\"alignLeft:\" target=\"-1\" id=\"zUv-R1-uAa\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                            <connections>\n                                                <action selector=\"alignCenter:\" target=\"-1\" id=\"spX-mk-kcS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"alignJustified:\" target=\"-1\" id=\"ljL-7U-jND\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                            <connections>\n                                                <action selector=\"alignRight:\" target=\"-1\" id=\"r48-bG-YeY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                        <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                <items>\n                                                    <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"YGs-j5-SAR\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionNatural:\" target=\"-1\" id=\"qtV-5e-UBP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"Lbh-J2-qVU\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"-1\" id=\"S0X-9S-QSf\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"jFq-tB-4Kx\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"-1\" id=\"5fk-qB-AqJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                    <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"Nop-cj-93Q\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionNatural:\" target=\"-1\" id=\"lPI-Se-ZHp\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"BgM-ve-c93\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"-1\" id=\"caW-Bv-w94\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"RB4-Sm-HuC\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"-1\" id=\"EXD-6r-ZUu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                        <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleRuler:\" target=\"-1\" id=\"FOx-HJ-KwY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyRuler:\" target=\"-1\" id=\"71i-fW-3W2\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteRuler:\" target=\"-1\" id=\"cSh-wd-qM2\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleToolbarShown:\" target=\"-1\" id=\"BXY-wc-z0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"runToolbarCustomizationPalette:\" target=\"-1\" id=\"pQI-g3-MTW\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                            <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleSidebar:\" target=\"-1\" id=\"iwa-gc-5KM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" keyEquivalent=\"=\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                        <items>\n                            <menuItem title=\"xcreds Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                <connections>\n                                    <action selector=\"showHelp:\" target=\"-1\" id=\"y7X-2Q-9no\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"200\" y=\"121\"/>\n        </menu>\n        <menu id=\"6OK-7Y-Yf9\">\n            <items>\n                <menuItem title=\"About XCreds (x.x.x)\" tag=\"1\" id=\"E49-8d-Cmr\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"aboutMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"r1J-8r-Iax\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"Uvh-o1-mcs\"/>\n                <menuItem title=\"OIDC Username\" tag=\"2\" enabled=\"NO\" id=\"7wW-bt-MeR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"nextPasswordCheckTimeMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"Gny-X3-1ZT\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"AD Username\" tag=\"3\" enabled=\"NO\" id=\"YN2-wy-F8O\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"nextPasswordCheckTimeMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"WgI-co-0gy\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"ftq-kh-g8g\"/>\n                <menuItem title=\"Next OIDC Password Check: Time\" tag=\"5\" enabled=\"NO\" id=\"kLW-ig-l4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"nextPasswordCheckTimeMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"k5b-Z3-3WJ\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Next AD Password Check: Time\" tag=\"4\" enabled=\"NO\" id=\"fDN-bq-7LZ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"nextPasswordCheckTimeMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"NMe-oq-fDO\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"FileVault AutoLogin Enabled\" tag=\"16\" enabled=\"NO\" id=\"ft0-tf-SGP\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"fileVaultAutoLoginEnabledMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"bGN-fT-F4J\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"Ura-vC-UQe\"/>\n                <menuItem title=\"OIDC Credential Status: None\" tag=\"15\" enabled=\"NO\" id=\"nNc-GI-Rm2\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"credentialStatusMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"lTc-PJ-7R2\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Active Directory Credential Status: None\" tag=\"6\" enabled=\"NO\" id=\"YLv-mh-piZ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"credentialStatusMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"VVt-Zd-Ui7\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"H0r-h6-WLk\"/>\n                <menuItem title=\"OIDC Password Expires: \" tag=\"7\" enabled=\"NO\" id=\"vin-yR-IbW\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"credentialStatusMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"l6Y-88-b28\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"AD Password Expires: \" tag=\"8\" enabled=\"NO\" id=\"pb3-CP-R5l\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"credentialStatusMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"n1c-gu-1iO\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"mwR-f8-XvQ\"/>\n                <menuItem title=\"Show Sign In Window\" tag=\"9\" id=\"FH2-NT-oeX\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"signInMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"Mra-OX-Nqy\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Change Password\" tag=\"10\" id=\"F1e-WL-4b2\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"changePasswordMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"dfP-8J-fS8\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Shares\" tag=\"11\" hidden=\"YES\" id=\"qRq-yn-8sT\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"op6-Hq-2li\"/>\n                <menuItem title=\"Quit\" tag=\"12\" id=\"OM5-mb-fFV\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"quitMenuItemSelected:\" target=\"1OV-ou-Ss5\" id=\"yL8-dQ-nRK\"/>\n                    </connections>\n                </menuItem>\n            </items>\n            <connections>\n                <outlet property=\"delegate\" destination=\"1OV-ou-Ss5\" id=\"eEG-jn-a2m\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-284.5\" y=\"-157.5\"/>\n        </menu>\n        <customObject id=\"1OV-ou-Ss5\" customClass=\"StatusMenuController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"aboutMenuItem\" destination=\"E49-8d-Cmr\" id=\"Uoc-2g-XI9\"/>\n                <outlet property=\"aboutMenuItemSeparator\" destination=\"Uvh-o1-mcs\" id=\"FhI-xC-w67\"/>\n                <outlet property=\"changePasswordMenuItem\" destination=\"F1e-WL-4b2\" id=\"5ah-PL-qxX\"/>\n                <outlet property=\"credentialStatusMenuItem\" destination=\"YLv-mh-piZ\" id=\"zOP-7p-XcI\"/>\n                <outlet property=\"filevaultLoginEnabledMenuItem\" destination=\"ft0-tf-SGP\" id=\"SG9-7I-stn\"/>\n                <outlet property=\"nextPasswordCheckMenuItem\" destination=\"7wW-bt-MeR\" id=\"mLr-Dz-KFF\"/>\n                <outlet property=\"quitMenuItem\" destination=\"OM5-mb-fFV\" id=\"M6F-cZ-LFl\"/>\n                <outlet property=\"quitMenuItemSeparator\" destination=\"op6-Hq-2li\" id=\"zC1-TH-cF8\"/>\n                <outlet property=\"sharesMenuItem\" destination=\"qRq-yn-8sT\" id=\"sMU-09-qGu\"/>\n                <outlet property=\"signinMenuItem\" destination=\"FH2-NT-oeX\" id=\"een-3k-67g\"/>\n                <outlet property=\"statusMenu\" destination=\"6OK-7Y-Yf9\" id=\"WfZ-uc-xzV\"/>\n            </connections>\n        </customObject>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/Credits.txt",
    "content": "--------------------------------------------------------------------------------------------------------\n\nSpecial thanks to North Carolina State University and Everette Allen for supporting this project.\n\nOIDCLite is Copyright (c) 2022 Joel Rennich (https://gitlab.com/Mactroll/OIDCLite) under MIT License.\n\nXCreds is licensed under BSD Open Source License.\n\nhttps://twocanoes.com\n\n--------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "XCreds/DefaultsHelper.swift",
    "content": "//\n//  DefaultsHelper.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 5/13/23.\n//\n\nimport Cocoa\n\nclass DefaultsHelper: NSObject {\n\n    static func backgroundImage() -> NSImage? {\n        let coreServicesDefaultImagePathUrl: String = \"file:///System/Library/CoreServices/DefaultDesktop.heic\"\n        TCSLogWithMark()\n        if let imagePathURL = DefaultsOverride.standardOverride.string(forKey: PrefKeys.loginWindowBackgroundImageURL.rawValue), let image = NSImage.imageFromPathOrURL(pathURLString: imagePathURL){\n            return image\n        }\n        // Try to use default desktop\n        if let coreServicesDefaultImage = NSImage.imageFromPathOrURL(pathURLString: coreServicesDefaultImagePathUrl) {\n            TCSLogWithMark(\"Using CoreServices Default Desktop image\")\n            return coreServicesDefaultImage\n        }\n       \n        return nil\n    }\n\n    static func secondaryBackgroundImage(includeDefault:Bool=true) -> NSImage? {\n        TCSLogWithMark()\n\n        if let imagePathURL = DefaultsOverride.standardOverride.string(forKey: PrefKeys.loginWindowSecondaryMonitorsBackgroundImageURL.rawValue), let image = NSImage.imageFromPathOrURL(pathURLString: imagePathURL){\n            return image\n        }\n        return backgroundImage()\n\n    }\n\n    static func desktopPasswordWindowBackgroundImage(includeDefault:Bool=true) -> NSImage? {\n        TCSLogWithMark()\n        if let imagePathURL = DefaultsOverride.standardOverride.string(forKey: PrefKeys.menuItemWindowBackgroundImageURL.rawValue), let image = NSImage.imageFromPathOrURL(pathURLString: imagePathURL){\n            return image\n        }\n        else {\n\n            let image = NSImage(named: NSImage.Name(\"xcredsmenuItemWindowBackgroundImage\"))\n            return image\n\n\n\n        }\n    }\n}\n"
  },
  {
    "path": "XCreds/DesktopLoginWindowController.swift",
    "content": "//\n//  DesktopLoginWindow.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 12/11/23.\n//\n\nimport Cocoa\n@available(macOS, deprecated: 11)\nclass DesktopLoginWindowController: NSWindowController {\n    @IBOutlet var webViewController: WebViewController!\n    @IBOutlet var backgroundImageView:NSImageView!\n\n    override class func awakeFromNib() {\n        \n    }\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n\n        let backgroundImage = DefaultsHelper.desktopPasswordWindowBackgroundImage(includeDefault: false)\n\n        if let backgroundImage = backgroundImage   {\n            backgroundImageView.image = backgroundImage\n            backgroundImageView.alphaValue = CGFloat(DefaultsOverride.standardOverride.float(forKey: PrefKeys.menuItemWindowBackgroundImageAlpha.rawValue))\n            backgroundImageView.image=backgroundImage\n            backgroundImageView.imageScaling = .scaleNone\n        }\n\n        \n\n    }\n\n}\n"
  },
  {
    "path": "XCreds/DesktopLoginWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <plugIn identifier=\"com.apple.WebKit2IBPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"DesktopLoginWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"backgroundImageView\" destination=\"JM0-W1-BrH\" id=\"5T5-H1-QAl\"/>\n                <outlet property=\"webViewController\" destination=\"L0G-9E-ng8\" id=\"o4U-Ou-7uU\"/>\n                <outlet property=\"window\" destination=\"KxT-zM-Vnn\" id=\"iFX-Nl-XcT\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"XCreds Password Update\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"KxT-zM-Vnn\" customClass=\"LoginWindow\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"453\" y=\"250\" width=\"628\" height=\"613\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"2LH-tE-efn\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"628\" height=\"613\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JM0-W1-BrH\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"628\" height=\"613\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" id=\"OlB-3q-3c1\"/>\n                    </imageView>\n                    <wkWebView wantsLayer=\"YES\" allowsLinkPreview=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"p1x-1L-05D\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"628\" height=\"613\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"613\" id=\"G12-aL-wfj\"/>\n                            <constraint firstAttribute=\"width\" constant=\"628\" id=\"jpw-kL-IRv\"/>\n                        </constraints>\n                        <wkWebViewConfiguration key=\"configuration\" allowsAirPlayForMediaPlayback=\"NO\" suppressesIncrementalRendering=\"YES\">\n                            <audiovisualMediaTypes key=\"mediaTypesRequiringUserActionForPlayback\" none=\"YES\"/>\n                            <wkPreferences key=\"preferences\" javaScriptCanOpenWindowsAutomatically=\"NO\"/>\n                        </wkWebViewConfiguration>\n                    </wkWebView>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YnV-QC-aTR\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"562\" width=\"628\" height=\"50\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"JzN-tR-KJo\"/>\n                            <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"628\" id=\"zPs-Yp-tRg\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" alignment=\"center\" drawsBackground=\"YES\" id=\"DzZ-yz-JFo\">\n                            <font key=\"font\" metaFont=\"system\" size=\"21\"/>\n                            <string key=\"title\">Log in to verify your cloud credentials. After verification, your local user account password will be set to your cloud password.</string>\n                            <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                            <color key=\"backgroundColor\" white=\"0.0062473695290000001\" alpha=\"0.30882734634551495\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"JM0-W1-BrH\" firstAttribute=\"top\" secondItem=\"2LH-tE-efn\" secondAttribute=\"top\" id=\"2r2-pY-UKT\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"p1x-1L-05D\" secondAttribute=\"trailing\" id=\"3Xb-lz-75r\"/>\n                    <constraint firstItem=\"p1x-1L-05D\" firstAttribute=\"top\" secondItem=\"2LH-tE-efn\" secondAttribute=\"top\" id=\"4mY-sf-GcF\"/>\n                    <constraint firstItem=\"YnV-QC-aTR\" firstAttribute=\"leading\" secondItem=\"2LH-tE-efn\" secondAttribute=\"leading\" id=\"HXK-IK-ZHa\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"JM0-W1-BrH\" secondAttribute=\"bottom\" id=\"JTI-sR-i8N\"/>\n                    <constraint firstItem=\"JM0-W1-BrH\" firstAttribute=\"leading\" secondItem=\"2LH-tE-efn\" secondAttribute=\"leading\" id=\"Pm8-pN-bIU\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"JM0-W1-BrH\" secondAttribute=\"trailing\" id=\"amC-yF-CwG\"/>\n                    <constraint firstItem=\"p1x-1L-05D\" firstAttribute=\"leading\" secondItem=\"2LH-tE-efn\" secondAttribute=\"leading\" id=\"ejy-F7-Axt\"/>\n                    <constraint firstItem=\"YnV-QC-aTR\" firstAttribute=\"top\" secondItem=\"2LH-tE-efn\" secondAttribute=\"top\" constant=\"1\" id=\"hLH-fg-Sn6\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"YnV-QC-aTR\" secondAttribute=\"trailing\" id=\"jgi-7V-Zhw\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"p1x-1L-05D\" secondAttribute=\"bottom\" id=\"vCP-fw-q3U\"/>\n                </constraints>\n            </view>\n            <point key=\"canvasLocation\" x=\"250\" y=\"297.5\"/>\n        </window>\n        <viewController id=\"L0G-9E-ng8\" customClass=\"WebViewController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"refreshTitleTextField\" destination=\"YnV-QC-aTR\" id=\"llX-y9-ZSG\"/>\n                <outlet property=\"view\" destination=\"2LH-tE-efn\" id=\"wro-LJ-uq7\"/>\n                <outlet property=\"webView\" destination=\"p1x-1L-05D\" id=\"d7f-o6-H5S\"/>\n            </connections>\n        </viewController>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/FileVaultLogin.swift",
    "content": "//\n//  FileVaultLogin.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 10/10/25.\n//\n\nimport ServiceManagement\n\n\nclass FileVaultLoginHelper {\n    \n    static let shared = FileVaultLoginHelper()\n\n    \n    func skipFileVaultAuthAtNextReboot(completion:@escaping(_ result:Bool, _ error:String?)->Void)   {\n        let helperToolManager = HelperToolManager()\n\n        switch  helperToolManager.manageHelperTool(action: .install) {\n            \n        case .notRegistered:\n            TCSLogWithMark()\n            \n            completion(false, \"Service is not registered\")\n            \n            return\n        case .enabled:\n            TCSLogWithMark()\n            \n            break\n        case .requiresApproval:\n            TCSLogWithMark(\"Service requires approval. Please select Allow in the notification or open System Preferences->Login Items and allow the service\")\n            \n            completion(false, \"Service requires approval. Please select Allow in the notification or open System Preferences->Login Items and allow the service\")\n\n        case .notFound:\n            TCSLogWithMark(\"Service Not Found\")\n            completion(false, \"Service Not Found\")\n\n        @unknown default:\n            TCSLogWithMark(\"Unknown Error\")\n            completion(false, \"Unknown Error\")\n        }\n        \n        TCSLogWithMark()\n        \n        let username = getConsoleUser()\n        let cred = KeychainUtil().findPassword(serviceName: PrefKeys.password.rawValue, accountName: PrefKeys.password.rawValue)\n        TCSLogWithMark()\n        \n        guard let cred = cred else {\n            \n            TCSLogWithMark(\"no valid password found\")\n            completion(false, \"no valid password found\")\n            return\n        }\n        helperToolManager.runCommand(username:username, password:cred.password) { success in\n            if success==true{\n                TCSLogWithMark(\"runCommand success\")\n                TCSLogWithMark()\n                completion(true, \"\")\n\n            }\n            else {\n                TCSLogWithMark()\n//                NSAlert.showAlert(title:\"Error\",message:\"Cannot set filevault login\")\n                TCSLogWithMark()\n                completion(false, \"Cannot set filevault login\")\n            }\n\n        }\n\n    }\n    func skipFileVaultAuthAtNextRebootWithAdmin( completion:@escaping(_ result:Bool, _ error:String?)->Void)   {\n        let helperToolManager = HelperToolManager()\n\n        switch  helperToolManager.manageHelperTool(action: .install) {\n            \n        case .notRegistered:\n            TCSLogWithMark()\n            \n            completion(false, \"Service is not registered\")\n            \n            return\n        case .enabled:\n            TCSLogWithMark()\n            \n            break\n        case .requiresApproval:\n            TCSLogWithMark(\"Service requires approval. Please select Allow in the notification or open System Preferences->Login Items and allow the service\")\n            \n            completion(false, \"Service requires approval. Please select Allow in the notification or open System Preferences->Login Items and allow the service\")\n\n        case .notFound:\n            TCSLogWithMark(\"Service Not Found\")\n            completion(false, \"Service Not Found\")\n\n        @unknown default:\n            TCSLogWithMark(\"Unknown Error\")\n            completion(false, \"Unknown Error\")\n        }\n        \n        TCSLogWithMark()\n        do {\n            \n                helperToolManager.authFVAsAdmin() { success in\n                    if success==true{\n                        TCSLogWithMark(\"runCommand success\")\n                    }\n                    else {\n                        TCSLogWithMark(\"Cannot set filevault login as admin\")\n//                        NSAlert.showAlert(title:\"Error\",message:\"Cannot set filevault login as admin\")\n                    }\n                    TCSLogWithMark()\n                    completion(success, \"\")\n                }\n               \n\n//            }\n//            else {\n//                \n//                TCSLogWithMark(\"no valid credentials for admin filevault unlock\")\n//                completion(false, \"no valid credentials for admin filevaulit unlock\")\n//\n//            }\n            \n        }\n        catch {\n            TCSLogWithMark(\"error setting filevault login as admin\")\n            completion(false, \"error setting filevault login as admin\")\n\n        }\n\n      \n    }\n    \n}\n"
  },
  {
    "path": "XCreds/HelperToolManager.swift",
    "content": "//\n//  HelperToolManager.swift\n//  HelperToolApp\n////\nimport ServiceManagement\n\n@objc(HelperToolProtocol)\npublic protocol HelperToolProtocol {\n    func authFV(username:String, password:String, withReply reply: @escaping (Bool) -> Void)\n\n    func authFVAsAdmin(withReply reply: @escaping (Bool) -> Void)\n\n    \n}\n\nenum HelperToolAction {\n    case none      // Only check status\n    case install   // Install the helper tool\n    case uninstall // Uninstall the helper tool\n}\n\n\nclass HelperToolManager: ObservableObject {\n    private var helperConnection: NSXPCConnection?\n    let helperToolIdentifier = \"com.twocanoes.FileVaultLoginHelper\"\n     var isHelperToolInstalled: Bool = false\n    @Published var message: String = \"Checking...\"\n    var status: String {\n        return isHelperToolInstalled ? \"Registered\" : \"Not Registered\"\n    }\n\n//    init() {\n//            manageHelperTool()\n//        \n//    }\n\n    // Function to manage the helper tool installation/uninstallation\n    func manageHelperTool(action: HelperToolAction = .none) -> SMAppService.Status {\n        let plistName = \"\\(helperToolIdentifier).plist\"\n        let service = SMAppService.daemon(plistName: plistName)\n        var occurredError: NSError?\n\n        // Perform install/uninstall actions if specified\n        switch action {\n        case .install:\n            // Pre-check before registering\n            switch service.status {\n            case .requiresApproval:\n                message = \"Registered but requires enabling in System Settings > Login Items.\"\n                SMAppService.openSystemSettingsLoginItems()\n            case .enabled:\n                message = \"Service is already enabled.\"\n            default:\n                do {\n                    try service.register()\n                    if service.status == .requiresApproval {\n                        SMAppService.openSystemSettingsLoginItems()\n                    }\n                } catch let nsError as NSError {\n                    occurredError = nsError\n                    if nsError.code == 1 { // Operation not permitted\n                        message = \"Permission required. Enable in System Settings > Login Items.\"\n                        SMAppService.openSystemSettingsLoginItems()\n                    } else {\n                        message = \"Installation failed: \\(nsError.localizedDescription)\"\n                        print(\"Failed to register helper: \\(nsError.localizedDescription)\")\n                    }\n\n                }\n            }\n\n        case .uninstall:\n            do {\n                try service.unregister()\n                // Close any existing connection\n                helperConnection?.invalidate()\n                helperConnection = nil\n            } catch let nsError as NSError {\n                occurredError = nsError\n                print(\"Failed to unregister helper: \\(nsError.localizedDescription)\")\n            }\n\n        case .none:\n            break\n        }\n\n        updateStatusMessages(with: service, occurredError: occurredError)\n        isHelperToolInstalled = (service.status == .enabled)\n        return service.status\n    }\n\n    // Function to open Settings > Login Items\n    func openSMSettings() {\n        SMAppService.openSystemSettingsLoginItems()\n    }\n\n    func authFVAsAdmin(withReply completion: @escaping (Bool) -> Void){\n        if !isHelperToolInstalled {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        guard let connection = getConnection() else {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        guard let proxy = connection.remoteObjectProxyWithErrorHandler({ error in\n            DispatchQueue.main.async {\n                TCSLogWithMark()\n                completion(false)\n            }\n        }) as? HelperToolProtocol else {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        proxy.authFVAsAdmin() { success in\n            DispatchQueue.main.async {\n                TCSLogWithMark()\n                completion(success)\n            }\n        }\n    }\n\n    // Function to run privileged commands\n    func runCommand(username:String, password:String, withReply completion: @escaping (Bool) -> Void){\n        if !isHelperToolInstalled {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        guard let connection = getConnection() else {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        guard let proxy = connection.remoteObjectProxyWithErrorHandler({ error in\n            DispatchQueue.main.async {\n                TCSLogWithMark()\n                completion(false)\n            }\n        }) as? HelperToolProtocol else {\n            TCSLogWithMark()\n            completion(false)\n            return\n        }\n\n        proxy.authFV(username:username, password:password) { success in\n            DispatchQueue.main.async {\n                TCSLogWithMark()\n                completion(success)\n            }\n        }\n    }\n\n\n    // Create/reuse XPC connection\n    private func getConnection() -> NSXPCConnection? {\n        TCSLogWithMark()\n        if let connection = helperConnection {\n            TCSLogWithMark()\n            return connection\n        }\n        let connection = NSXPCConnection(machServiceName: helperToolIdentifier, options: .privileged)\n        connection.remoteObjectInterface = NSXPCInterface(with: HelperToolProtocol.self)\n        connection.invalidationHandler = { [weak self] in\n            self?.helperConnection = nil\n        }\n        TCSLogWithMark()\n        connection.resume()\n        helperConnection = connection\n        return connection\n    }\n\n\n\n    // Helper to update helper status messages\n    func updateStatusMessages(with service: SMAppService, occurredError: NSError?) {\n        if let nsError = occurredError {\n            switch nsError.code {\n            case kSMErrorAlreadyRegistered:\n                message = \"Service is already registered and enabled.\"\n            case kSMErrorLaunchDeniedByUser:\n                message = \"User denied permission. Enable in System Settings > Login Items.\"\n            case kSMErrorInvalidSignature:\n                message = \"Invalid signature, ensure proper signing on the application and helper tool.\"\n            case 1:\n                message = \"Authorization required in Settings > Login Items.\"\n            default:\n                message = \"Operation failed: \\(nsError.localizedDescription)\"\n            }\n        } else {\n            switch service.status {\n            case .notRegistered:\n                message = \"Service hasn’t been registered. You may register it now.\"\n            case .enabled:\n                message = \"Service successfully registered and eligible to run.\"\n            case .requiresApproval:\n                message = \"Service registered but requires user approval in Settings > Login Items.\"\n            case .notFound:\n                message = \"Service is not installed.\"\n            @unknown default:\n                message = \"Unknown service status (\\(service.status)).\"\n            }\n        }\n    }\n\n\n\n}\n"
  },
  {
    "path": "XCreds/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LogFileName</key>\n\t<string>xcreds.log</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds/KeychainUtil.swift",
    "content": "//\n//  KeychainUtil.swift\n//  NoMAD\n//\n//  Created by Joel Rennich on 8/7/16.\n//  Copyright © 2016 Trusource Labs. All rights reserved.\n//\n\n// class to manage all keychain interaction\n\nenum KeychainError: Error {\n    case notConnected\n    case notLoggedIn\n    case noPasswordExpirationTime\n    case ldapServerLookup\n    case ldapNamingContext\n    case ldapServerPasswordExpiration\n    case ldapConnectionError\n    case userPasswordSetDate\n    case userHome\n    case noStoredPassword\n    case storedPasswordWrong\n}\n\n\nimport OSLog\nimport Foundation\nimport Security\n\nstruct certDates {\n    var serial : String\n    var expireDate : Date\n}\nstruct PasswordItem{\n    \n    var username: String\n    var password: String\n    var keychainItem: SecKeychainItem\n    \n}\nclass KeychainUtil {\n\n//    var myErr: OSStatus\n//    let serviceName = \"xcreds\"\n\n//    var myKeychainItem: SecKeychainItem?\n\n//    init() {\n//        myErr = 0\n//    }\n\n  \n\n    // find if there is an existing account password and return it or throw\n    @available(macOS, deprecated: 10.10)\n    func findPassword(serviceName:String, accountName:String?,keychain:SecKeychain?=nil) -> PasswordItem? {\n\n        var passLength: UInt32 = 0\n        var passPtr: UnsafeMutableRawPointer? = nil\n        var keychainItem: SecKeychainItem?\n        TCSLogWithMark(\"Finding \\(serviceName) in keychain\")\n        \n        var keychainToUse:SecKeychain?\n        var userKeychain:SecKeychain?\n        \n        TCSLogWithMark(\"find password for account:\\(String(describing: accountName)) service:(serviceName)\")\n\n        \n        if let keychain = keychain {\n            os_log(\"using provided keychain\")\n            keychainToUse=keychain\n        }\n        else {\n            os_log(\"using user keychain\")\n\n            if SecKeychainCopyDomainDefault(SecPreferencesDomain.user, &userKeychain) != errSecSuccess {\n                os_log(\"error getting user keychain\")\n                return nil\n            }\n\n            if let userKeychain = userKeychain {\n                keychainToUse = userKeychain\n            }\n            else {\n                os_log(\"keychain is nil. returning.\")\n                return nil\n            }\n        }\n        \n        let myErr = SecKeychainFindGenericPassword(keychainToUse, UInt32(serviceName.count), serviceName, UInt32((accountName ?? \"\").count), accountName, &passLength, &passPtr, &keychainItem)\n\n\n        if myErr == OSStatus(errSecSuccess) {\n            let password = NSString(bytes: passPtr!, length: Int(passLength), encoding: String.Encoding.utf8.rawValue)\n            guard let password = password, (password as String).isEmpty == false else {\n                return nil\n            }\n            TCSLogWithMark(\"\\(serviceName) found in keychain\")\n\n\n            var account=\"\"\n            if let keychainItem=keychainItem {\n                var attributeTags = [SecItemAttr.accountItemAttr.rawValue]\n                var formatConstants = [UInt32(CSSM_DB_ATTRIBUTE_FORMAT_STRING)]\n                \n                var attributeInfo = SecKeychainAttributeInfo(count: 1, tag: &attributeTags, format: &formatConstants)\n                \n                var attrList: UnsafeMutablePointer<SecKeychainAttributeList>? = nil\n                \n                let res = SecKeychainItemCopyAttributesAndData(keychainItem, &attributeInfo, nil, &attrList,nil,nil);\n                \n                let accountAttribute = attrList?.pointee.attr?.pointee\n                \n                if let data=accountAttribute?.data {\n                    account = String(bytesNoCopy: data, length: Int((accountAttribute?.length)!),\n                                     encoding: String.Encoding.utf8, freeWhenDone: false)!\n                }\n                \n                \n                \n                TCSLogWithMark()\n                \n                \n                return PasswordItem(username: account, password: password as String, keychainItem: keychainItem)\n            }\n            return nil\n        } else {\n            TCSLogErrorWithMark(\"\\(serviceName) not found in keychain\")\n            return nil\n        }\n    }\n\n    func trustedApps() -> [SecTrustedApplication] {\n        var trust : SecTrustedApplication? = nil\n        var secApps = [ SecTrustedApplication ]()\n\n        if FileManager.default.fileExists(atPath: \"/Applications/XCreds.app\", isDirectory: nil) {\n            let status = SecTrustedApplicationCreateFromPath(\"/Applications/XCreds.app\", &trust)\n            if status == 0 {\n                secApps.append(trust!)\n            }\n            else {\n                TCSLogWithMark(\"error appending trust for XCreds.app\")\n\n            }\n        }\n       \n        \n        if FileManager.default.fileExists(atPath: \"/Applications/XCreds.app/Contents/Resources/XCreds Login Autofill.app/Contents/PlugIns/XCreds Login Password.appex\", isDirectory: nil) {\n            let res = SecTrustedApplicationCreateFromPath(\"/Applications/XCreds.app/Contents/Resources/XCreds Login Autofill.app/Contents/PlugIns/XCreds Login Password.appex\", &trust)\n            if res == 0 {\n                secApps.append(trust!)\n            }\n            else {\n                TCSLogWithMark(\"error appending trust for autofill\")\n\n            }\n        }\n        if FileManager.default.fileExists(atPath: \"/System/Library/Frameworks/Security.framework/Versions/A/MachServices/authorizationhost.bundle/Contents/XPCServices/authorizationhosthelper.x86_64.xpc\", isDirectory: nil) {\n            let res = SecTrustedApplicationCreateFromPath(\"/System/Library/Frameworks/Security.framework/Versions/A/MachServices/authorizationhost.bundle/Contents/XPCServices/authorizationhosthelper.x86_64.xpc\", &trust)\n            if res == 0 {\n                secApps.append(trust!)\n            }\n            else {\n                TCSLogWithMark(\"error appending trust for authorizationhost\")\n                \n            }\n        }\n        if FileManager.default.fileExists(atPath: \"/System/Library/Frameworks/Security.framework/Versions/A/MachServices/authorizationhost.bundle/Contents/XPCServices/authorizationhosthelper.arm64.xpc\", isDirectory: nil) {\n            let res = SecTrustedApplicationCreateFromPath(\"/System/Library/Frameworks/Security.framework/Versions/A/MachServices/authorizationhost.bundle/Contents/XPCServices/authorizationhosthelper.arm64.xpc\", &trust)\n            if res == 0 {\n                secApps.append(trust!)\n            }\n            else {\n                TCSLogWithMark(\"error appending trust for authorizationhost\")\n                \n            }\n\n        }\n        return secApps\n    }\n\n    // set the password\n\n    func setPassword(serviceName:String, accountName: String, pass: String, keychainPassword:String, keychain:SecKeychain?=nil) -> SecKeychainItem? {\n        \n        \n        let account = accountName\n        let passwordData = pass.data(using: String.Encoding.utf8)!\n        var secAccess:SecAccess?\n        var keychainItem:CFTypeRef?\n        var prompt = SecKeychainPromptSelector()\n        var aclArray : CFArray? = nil\n        var appList: CFArray? = nil\n        var desc: CFString? = nil\n        \n        var keychainToUse:SecKeychain\n        var userKeychain:SecKeychain?\n        \n        TCSLogWithMark(\"Setting password for account:\\(accountName) service:(serviceName)\")\n\n        \n        if let keychain = keychain {\n            os_log(\"using provided keychain\")\n            keychainToUse=keychain\n        }\n        else {\n            os_log(\"using user keychain\")\n\n            if SecKeychainCopyDomainDefault(SecPreferencesDomain.user, &userKeychain) != errSecSuccess {\n                os_log(\"error getting user keychain\")\n                return nil\n            }\n\n            if let userKeychain = userKeychain {\n\n                keychainToUse = userKeychain\n            }\n            else {\n                os_log(\"keychain is nil. returning.\")\n                return nil\n            }\n        }\n\n\n        TCSLogWithMark(\"Creating ACL\")\n        //create the default ACLs as SecAccess so we can modify them\n        SecAccessCreate(accountName as CFString, nil, &secAccess)\n        \n        guard let secAccess = secAccess else {\n            TCSLogWithMark(\"Error setting ACL\")\n            return nil\n        \n        }\n        \n        //In order to not get prompted, the app that are allowed to use the\n        // ACLAuthorizationDecrypt operation\n        //must be included when the ACLs are created.\n        //convert the ACLs to a list and then go through them\n        //and modify ACLAuthorizationDecrypt. ACLAuthorizationDecrypt is the right\n        //that is needed to give apps access to a password\n        //adding the app path is not enough; the team id needs to\n        //be added to the partition ACL, but we can't create that ACL.\n        //We have create the ACLs and then the partition ACL gets added.\n        //We then loop over, find it, and modify it.\n        \n        //convert opaque secAccess to an array\n        SecAccessCopyACLList(secAccess, &aclArray)\n        //get a list of the trusted apps to share the password\n        let secApps = trustedApps()\n         \n        //loop over them looking for ACLAuthorizationDecrypt\n        for acl in aclArray as! Array<SecACL> {\n            SecACLCopyContents(acl, &appList, &desc, &prompt)\n            let authArray = SecACLCopyAuthorizations(acl)\n            \n            //set the apps that are allowed to have access to the password item\n            if (authArray as! [String]).contains(\"ACLAuthorizationDecrypt\") {\n                \n                TCSLogWithMark(\"Found ACLAuthorizationDecrypt.\")\n                SecACLSetContents(acl, secApps as CFArray, \"\" as CFString, prompt)\n                continue\n            }\n        }\n                \n        let attributes: [String: Any] = [kSecClass as String: kSecClassGenericPassword,\n                                    kSecAttrAccount as String: account,\n                                    kSecAttrService as String: serviceName,\n                                    kSecValueData as String: passwordData,\n                                    kSecAttrAccess as String: secAccess as SecAccess,\n                                     kSecUseKeychain as String:keychainToUse as Any,\n                                    kSecReturnRef as String: true\n        ]\n        \n        TCSLogWithMark(\"Calling SecItemAdd, returning new keychain item (generic password)\")\n        let res = SecItemAdd(attributes as CFDictionary, &keychainItem)\n        if  res != OSStatus(errSecSuccess)  {\n            TCSLogWithMark(\"Error SecItemAdd: \\(res) \")\n            return nil\n        }\n        \n        let secKeychainItem = keychainItem as! SecKeychainItem\n        var accessControlList: SecAccess? = nil\n\n        \n        var err = SecKeychainItemCopyAccess(secKeychainItem, &accessControlList)\n        \n        guard let accessControlList = accessControlList else {\n            \n            TCSLogWithMark(\"invalid accessControlList: \\(err)\")\n            return nil\n\n        }\n        //turn the opaque accessControlList to an array of secACLs\n        //so we can iterate over them\n        SecAccessCopyACLList(accessControlList, &aclArray)\n\n        //iterate over the acls in the array\n        //when the acl in the array changes, it changes the items\n        //in the accessControlList but doesn't change the\n        //access control list in the secKeychainItem until\n        //SecKeychainItemSetAccessWithPassword is called\n        \n        for acl in aclArray as! Array<SecACL> {\n            \n            //each ACL has one or more auth operations\n            //a list of apps that have access to those operations\n            //and a prompt selector. the prompt selector is the default\n            //since macOS seems to want to prompt on everything regardless\n            \n            SecACLCopyContents(acl, &appList, &desc, &prompt)\n            \n            //For this ACL, get the operations that it covers\n            \n            let authArray = SecACLCopyAuthorizations(acl)\n            \n            //see if it is ACLAuthorizationPartitionID, which is the\n            //ACL that allows access by team id.\n            if (authArray as! [String]).contains(\"ACLAuthorizationPartitionID\") {\n                TCSLogWithMark(\"Found ACLAuthorizationPartitionID.\")\n                \n                // pull in the description that is a plist\n                let rawData = Data.init(fromHexEncodedString: desc! as String)\n                var format: PropertyListSerialization.PropertyListFormat = .xml\n                \n                var propertyListObject = [ String: [String]]()\n                \n                do {\n                    propertyListObject = try PropertyListSerialization.propertyList(from: rawData!, options: [], format: &format) as! [ String: [String]]\n                } catch {\n                    TCSLogWithMark(\"No teamid in ACLAuthorizationPartitionID.\")\n                }\n                let teamIds = [ \"apple:\", \"teamid:UXP6YEHSPW\" ]\n                \n                propertyListObject[\"Partitions\"] = teamIds\n                \n                // now serialize it back into a plist\n                \n                let xmlObject = try? PropertyListSerialization.data(fromPropertyList: propertyListObject as Any, format: format, options: 0)\n                \n                // now that all ACLs has been adjusted, we can update the item\n                \n                err = SecACLSetContents(acl, secApps as CFArray, xmlObject!.hexEncodedString() as CFString, prompt)\n                \n                if err == 0 {\n                    TCSLogWithMark(\"SecACLSetContents success\")\n                }\n                else {\n                    TCSLogWithMark(\"error SecACLSetContents\")\n                }\n                \n\n            }\n            \n        }\n        \n        \n        //we really should be using SecKeychainItemSetAccess but it always errors if you change\n        //the partition ID.\n        \n        err = SecKeychainItemSetAccessWithPassword(secKeychainItem, accessControlList, UInt32(strlen(keychainPassword.cString(using: .utf8) ?? [])), keychainPassword.cString(using: .utf8) ?? [] )\n\n        if err == 0 {\n            TCSLogWithMark(\"SecKeychainItemSetAccessWithPassword success\")\n        }\n        else {\n            TCSLogWithMark(\"error SecKeychainItemSetAccessWithPassword: \\(err)\")\n        }\n\n        return secKeychainItem\n\n\n    }\n\n    func updatePassword(serviceName:String, accountName: String, pass: String, keychainPassword:String, keychain:SecKeychain?=nil) -> Bool {\n        let passwordItem = findPassword(serviceName: serviceName, accountName: accountName, keychain: keychain)\n        if let passwordItem = passwordItem {\n            let _ = deletePassword(keychainItem: passwordItem.keychainItem)\n        }\n        TCSLogWithMark(\"setting new password for \\(accountName) \\(serviceName)\")\n\n        let secKeychainItem = setPassword(serviceName: serviceName, accountName: accountName, pass: pass, keychainPassword: keychainPassword,keychain: keychain)\n        if secKeychainItem == nil {\n            TCSLogErrorWithMark(\"setting new password FAILURE: accountname:\\(accountName)\")\n            return false\n        }\n        TCSLogWithMark(\"setting new password success\")\n        return true\n    }\n\n    // delete the password from the keychain\n    @available(macOS, deprecated: 11)\n    func deletePassword(keychainItem:SecKeychainItem) -> OSStatus {\n        return SecKeychainItemDelete(keychainItem)\n\n    }\n\n    @available(macOS, deprecated: 10.10)\n    func clearPasswords(serviceName:String,keychain:SecKeychain?=nil) -> Bool {\n        findAndDelete(serviceName: serviceName, accountName: nil, keychain: keychain)\n    }\n    // convience functions\n    @available(macOS, deprecated: 11)\n    func findAndDelete(serviceName: String, accountName: String?, keychain:SecKeychain?=nil) -> Bool {\n        \n        while true {\n            guard let passwordItem = findPassword(serviceName: serviceName, accountName:accountName,keychain: keychain) else {\n                break\n            }\n            let res = deletePassword(keychainItem: passwordItem.keychainItem)\n            if res != 0  {\n                return false\n            }\n                      \n\n        }\n        return true //on password found so don't delete and return true\n    }\n}\n"
  },
  {
    "path": "XCreds/LicenseChecker.swift",
    "content": "//\n//  LicenseChecker.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 3/28/23.\n//\n\nimport Cocoa\n\nclass LicenseChecker: NSObject {\n    enum LicenseState {\n        case valid(Int)\n        case invalid\n        case trial(Int)\n        case trialExpired\n        case expired\n\n    }\n\n    func currentLicenseState() -> LicenseState {\n        let trialDays = 14\n\n        if UserDefaults.standard.value(forKey: \"tts\") == nil {\n            UserDefaults.standard.setValue(Date(), forKey: \"tts\")\n        }\n        let firstLaunchDate = UserDefaults.standard.value(forKey: \"tts\") as? Date\n\n        var trialState = LicenseState.trialExpired\n        if let firstLaunchDate = firstLaunchDate {\n            let secondsPassed = Date().timeIntervalSince(firstLaunchDate)\n            let trialDaysLeft=trialDays-(Int(secondsPassed)/(24*60*60));\n\n            if secondsPassed<Double(24*60*60*trialDays) {\n                trialState = .trial(trialDaysLeft)\n            }\n\n        }\n        else {\n            TCSLogErrorWithMark(\"did not get first launch date\")\n        }\n        let check = TCSLicenseCheck()\n        let status = check.checkLicenseStatus(\"com.twocanoes.xcreds\", withExtension: \"\")\n        let dateFormatter = ISO8601DateFormatter()\n        dateFormatter.formatOptions = [.withFractionalSeconds, .withFullDate]\n\n        switch status {\n\n        case .valid:\n            if let dateExpiredString = check.license.dateExpired,let dateExpires = dateFormatter.date(from:dateExpiredString ){\n\n                return .valid(Int(dateExpires.timeIntervalSinceNow))\n            }\n\n            return .valid(0)\n        case .expired:\n            return trialState\n\n        case .invalid:\n            return LicenseState.invalid\n        case .unset:\n            return trialState\n        default:\n            return trialState\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "XCreds/LoggerHelper.swift",
    "content": "//\n//  Logger.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 7/5/22.\n//\n\n\nimport Foundation\npublic func TCSLogWithMark(_ message: String = \"\",\n             file: String = #file, line: Int = #line, function: String = #function ) {\n\n\n    let comp = file.components(separatedBy: \"/\")\n    if let lastPart = comp.last{\n        if message.isEmpty{\n            TCSLog(\"\\(lastPart):\\(line) \\(function) \\(message)\")\n\n        }\n        else {\n            TCSLog(\"      \\(lastPart):\\(line) \\(function) \\(message)\")\n        }\n\n    }\n\n}\nfunc TCSLogInfoWithMark(_ message: String = \"\",\n             file: String = #file, line: Int = #line, function: String = #function ) {\n\n\n    let comp = file.components(separatedBy: \"/\")\n    if let lastPart = comp.last{\n        if message.isEmpty{\n            TCSLogInfo(\"\\(lastPart):\\(line) \\(function) \\(message)\")\n\n        }\n        else {\n            TCSLogInfo(\"      \\(lastPart):\\(line) \\(function) \\(message)\")\n        }\n\n    }\n\n}\nfunc TCSLogErrorWithMark(_ message: String = \"\",\n             file: String = #file, line: Int = #line, function: String = #function ) {\n\n\n    let comp = file.components(separatedBy: \"/\")\n    if let lastPart = comp.last{\n        if message.isEmpty{\n            TCSLogError(\"\\(lastPart):\\(line) \\(function) \\(message)\")\n\n        }\n        else {\n            TCSLogError(\"      \\(lastPart):\\(line) \\(function) \\(message)\")\n        }\n\n    }\n\n}\n\n//\n//func Mark(\n//             file: String = #file, line: Int = #line, function: String = #function ) {\n//\n//    let date = Date()\n//\n//    let comp = file.components(separatedBy: \"/\")\n//    if let lastPart = comp.last{\n//        TCSLog(\"\\(date) FILE:\\(lastPart) LINE:\\(line) FUNCTION:\\(function)\")\n//\n//    }\n//\n//}\n"
  },
  {
    "path": "XCreds/LoginWebViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <plugIn identifier=\"com.apple.WebKit2IBPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"LoginWebViewController\" customModule=\"XCredsLoginPlugin\">\n            <connections>\n                <outlet property=\"view\" destination=\"2LH-tE-efn\" id=\"ZJD-dq-nuj\"/>\n                <outlet property=\"webView\" destination=\"IVa-Nc-Vs1\" id=\"d8m-Bi-lYF\"/>\n                <outlet property=\"window\" destination=\"KxT-zM-Vnn\" id=\"v4i-bY-4eE\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Sign In\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" titleVisibility=\"hidden\" id=\"KxT-zM-Vnn\" customClass=\"LoginWindow\" customModule=\"XCredsLoginPlugin\">\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"453\" y=\"250\" width=\"1002\" height=\"883\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1728\" height=\"1079\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"2LH-tE-efn\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1002\" height=\"883\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <wkWebView wantsLayer=\"YES\" allowsLinkPreview=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"IVa-Nc-Vs1\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1002\" height=\"883\"/>\n                        <wkWebViewConfiguration key=\"configuration\" allowsAirPlayForMediaPlayback=\"NO\" suppressesIncrementalRendering=\"YES\">\n                            <audiovisualMediaTypes key=\"mediaTypesRequiringUserActionForPlayback\" none=\"YES\"/>\n                            <wkPreferences key=\"preferences\" javaScriptCanOpenWindowsAutomatically=\"NO\"/>\n                        </wkWebViewConfiguration>\n                        <connections>\n                            <outlet property=\"UIDelegate\" destination=\"-2\" id=\"OMR-Ui-nRn\"/>\n                        </connections>\n                    </wkWebView>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"IVa-Nc-Vs1\" secondAttribute=\"trailing\" id=\"OcE-FD-9VC\"/>\n                    <constraint firstItem=\"IVa-Nc-Vs1\" firstAttribute=\"top\" secondItem=\"2LH-tE-efn\" secondAttribute=\"top\" id=\"YBv-2B-OZ5\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"IVa-Nc-Vs1\" secondAttribute=\"bottom\" id=\"byG-kT-3XZ\"/>\n                    <constraint firstItem=\"IVa-Nc-Vs1\" firstAttribute=\"leading\" secondItem=\"2LH-tE-efn\" secondAttribute=\"leading\" id=\"pSj-sh-ecG\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"WYj-G7-iZU\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-5\" y=\"427.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/MainController.swift",
    "content": "//\n//  MainController.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\nimport Cocoa\nimport OIDCLite\n@available(macOS, deprecated: 11)\nclass MainController: NSObject, UpdateCredentialsFeedbackProtocol {\n\n    \n\n    enum LoginWindowType {\n        case cloud\n        case usernamePassword\n    }\n\n    let standardFilevaultAutologinText = \"FileVault AutoLogin Enabled\"\n    var fileVaultMenuItemText = \"FileVault AutoLogin Enabled\"\n\n    var shouldShowFilevaultBypassMenuItem = false\n    var passwordCheckTimer:Timer?\n    var feedbackDelegate:TokenManagerFeedbackDelegate?\n    let scheduleManager = ScheduleManager()\n    var adPasswordExpires:String?\n    var cloudPasswordExpires:String?\n    var nextPasswordTokenCheck:String {\n        var dateString:String = \"\"\n        if scheduleManager.nextTokenCheckTime < Date () {\n            dateString = \"When Available\"\n        }\n        else {\n\n            let dateFormatter = DateFormatter()\n\n            dateFormatter.locale = Locale.current\n            dateFormatter.dateStyle = .medium\n            dateFormatter.timeStyle = .short\n\n            dateString = dateFormatter.string(from: scheduleManager.nextTokenCheckTime)\n        }\n        return dateString\n\n    }\n\n    var nextPasswordADCheck:String {\n\n        var dateString:String = \"\"\n        if scheduleManager.nextADCheckTime < Date () {\n            dateString = \"When Available\"\n        }\n        else {\n            let dateFormatter = DateFormatter()\n\n            dateFormatter.locale = Locale.current\n            dateFormatter.dateStyle = .medium\n            dateFormatter.timeStyle = .short\n\n            dateString = dateFormatter.string(from: scheduleManager.nextADCheckTime)\n        }\n        return dateString\n\n    }\n\n    var tokenCredentialStatus:String?\n    var kerberosCredentialStatus:String?\n    var hasCredential:Bool?\n    var hasKerberosTicket:Bool?\n    \n    let windowController =  DesktopLoginWindowController(windowNibName: \"DesktopLoginWindowController\")\n    lazy var signInViewController:SignInViewController? = {\n        let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n        if let bundle = bundle{\n            TCSLogWithMark(\"Creating signInViewController\")\n            let controller = SignInViewController(nibName: \"LocalUsersViewController\", bundle:bundle)\n            controller.isInUserSpace = true\n            controller.updateCredentialsFeedbackDelegate=self\n\n\n\n            return controller;\n        }\n        return nil\n    }()\n\n    init(passwordCheckTimer: Timer? = nil, feedbackDelegate: TokenManagerFeedbackDelegate? = nil, cloudPasswordExpires: String? = nil, adPasswordExpires: String? = nil,nextPasswordCheck: String? = nil, credentialStatus: String? = nil, hasCredential: Bool? = nil, signInViewController: SignInViewController? = nil) {\n        self.passwordCheckTimer = passwordCheckTimer\n        self.feedbackDelegate = feedbackDelegate\n        self.adPasswordExpires = adPasswordExpires\n        self.cloudPasswordExpires = cloudPasswordExpires\n\n        self.tokenCredentialStatus = credentialStatus\n        self.hasCredential = hasCredential\n        super.init()\n        scheduleManager.feedbackDelegate=self\n        updateFileVaultSkip()\n        let shouldShowMenuBarSignInWithoutLoginWindowSignin = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowMenuBarSignInWithoutLoginWindowSignin.rawValue)\n\n        if isLocalOnlyAccount() == false || shouldShowMenuBarSignInWithoutLoginWindowSignin==true {\n            let accountAndPassword = localAccountAndPassword()\n            if let password = accountAndPassword.1 {\n                scheduleManager.kerberosPassword = password\n            }\n            self.scheduleManager.startCredentialCheck()\n        }\n\n\n    }\n\n    func isLocalOnlyAccount() -> Bool {\n\n        let user = getConsoleUser()\n        guard let dsRecord =  try? PasswordUtils.getLocalRecord(user) else {\n            return false\n        }\n        let kerbPrinc = try? dsRecord.values(forAttribute:\"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\" )\n\n        let kerbPrincPrefs = UserDefaults.standard.string(forKey:\"_xcreds_activedirectory_kerberosPrincipal\" )\n\n        let oidcUsername = try? dsRecord.values(forAttribute:\"dsAttrTypeNative:_xcreds_oidc_username\" )\n\n        let oidcUsernamePrefs = UserDefaults.standard.string(forKey:\"_xcreds_oidc_username\" )\n\n\n        if kerbPrinc == nil && oidcUsername == nil && kerbPrincPrefs == nil && oidcUsernamePrefs == nil {\n            TCSLogWithMark(\"no kerberos principal and no oidc username in local DS console user/prefs, so skipping showing window\")\n            return true\n\n        }\n        return false\n\n    }\n    func showSignInWindow(force:Bool=false, forceLoginWindowType:LoginWindowType?=nil, hadPasswordFailure:Bool=false )  {\n\n        TCSLogWithMark()\n\n        if isLocalOnlyAccount()==true && force==false{\n            TCSLogWithMark()\n            return\n        }\n\n        //put the timers off some we don't get multiple other prompts when user is putting in credentials\n        scheduleManager.setNextCheckTime(timer: .ADTimer )\n        scheduleManager.setNextCheckTime(timer: .TokenTimer)\n\n        var forceUsernamePassword = false\n\n        if let forceLoginWindowType = forceLoginWindowType {\n            TCSLogWithMark()\n            if forceLoginWindowType == .usernamePassword {\n                TCSLogWithMark()\n                forceUsernamePassword = true\n            }\n        }\n        if forceUsernamePassword == false,\n           DefaultsOverride.standardOverride.value(forKey: PrefKeys.discoveryURL.rawValue) != nil,\n            DefaultsOverride.standardOverride.value(forKey: PrefKeys.clientID.rawValue) != nil ,\n            DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForMenuLogin.rawValue) == false  {\n            TCSLogWithMark()\n\n            Task{ @MainActor in\n                do{\n                    let tokenManager = TokenManager()\n                    try await tokenManager.oidc().getEndpoints()\n                    guard  let window = windowController.window else {\n                        return\n                    }\n                    window.makeKeyAndOrderFront(self)\n\n                    if  let webViewController = windowController.webViewController{\n                        webViewController.webView.isHidden=false\n                        TCSLogWithMark()\n                        windowController.webViewController.updateCredentialsFeedbackDelegate=self\n                        windowController.webViewController?.loadPage()\n                    }\n                    NSApp.activate(ignoringOtherApps: true)\n                }\n\n            }\n\n\n        }\n\n        else if (DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForMenuLogin.rawValue) == true || DefaultsOverride.standardOverride.value(forKey: PrefKeys.aDDomain.rawValue) != nil )\n        {\n            if let webView = windowController.webViewController?.webView {\n                webView.isHidden=true\n                TCSLogWithMark()\n            }\n            guard let window = self.windowController.window,\n                  let signInViewController = self.signInViewController else {\n                TCSLogWithMark(\"No window or signInViewController\")\n                return\n            }\n\n            signInViewController.hadPasswordFailure = hadPasswordFailure\n            DispatchQueue.main.async {\n                TCSLogWithMark(\"Creating signInViewController\")\n\n                TCSLogWithMark()\n\n                if let contentView = window.contentView {\n                    TCSLogWithMark()\n                    self.windowController.webViewController.webView.isHidden=true\n                    signInViewController.view.wantsLayer=true\n\n                    if let contentView = window.contentView{\n                        if contentView.subviews.contains(signInViewController.view)==false {\n\n                            contentView.addSubview(signInViewController.view)\n                        }\n                    }\n                    signInViewController.setupLoginAppearance()\n\n                    var x = NSMidX(contentView.frame)\n                    var y = NSMidY(contentView.frame)\n\n                    x = x - signInViewController.view.frame.size.width/2\n                    y = y - signInViewController.view.frame.size.height/2\n                    let lowerLeftCorner = NSPoint(x: x, y: y)\n                    signInViewController.localOnlyCheckBox.isHidden = true\n                    signInViewController.localOnlyCheckBox.isHidden = true\n\n                    signInViewController.view.setFrameOrigin(lowerLeftCorner)\n                }\n\n                window.makeKeyAndOrderFront(self)\n                NSApp.activate(ignoringOtherApps: true)\n            }\n        }\n\n    }\n\n    func checkAndMountShares() {\n\n        let tickets = KlistUtil().returnTickets()\n        if tickets.count>0{\n            let appDelegate = NSApp.delegate as? AppDelegate\n\n            appDelegate?.shareMounterMenu?.updateShares(connected: true, tickets: true)\n        }\n\n    }\n    func setup() {\n        if let cloudPasswordExpiresDate = OIDCPasswordExpiryDate(){\n\n            if OIDCPasswordExpiryDate()?.timeIntervalSinceNow ?? 0<0 {\n                self.cloudPasswordExpires = \"Password Expired!\"\n                return\n            }\n            if #available(macOS 12.0, *) {\n                self.cloudPasswordExpires=cloudPasswordExpiresDate.formatted(date: .abbreviated, time: .shortened)\n            } else {\n                self.cloudPasswordExpires=cloudPasswordExpiresDate.debugDescription\n            }\n        }\n        NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didUnmountNotification, object: nil, queue: nil) { notification in\n                self.scheduleManager.checkKerberosTicket()\n                self.checkAndMountShares()\n\n        }\n\n        NotificationCenter.default.addObserver(forName: .connectivityStatus, object: nil, queue: nil) { notification in\n            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+10) {\n                self.scheduleManager.checkKerberosTicket()\n                self.checkAndMountShares()\n            }\n        }\n        self.checkAndMountShares()\n        TCSLogWithMark()\n\n        // make sure we have the local password, else prompt. we don't need to save it\n        // just make sure we prompt if not in the keychain. if the user cancels, then it will\n        // prompt when using OAuth.\n        // don't need to save it. just need to prompt and it gets saved\n        // in the keychain\n\n//\n//            scheduleManager.checkADPasswordExpire(password: password)\n//            passwordCheckTimer = Timer.scheduledTimer(withTimeInterval: 3*60*60, repeats: true, block: { _ in\n//                self.scheduleManager.checkADPasswordExpire(password: password)\n//            })\n//\n//        }\n        let discoveryURL = DefaultsOverride.standardOverride.string(forKey: PrefKeys.discoveryURL.rawValue)\n\n        if discoveryURL == nil {\n            return\n        }\n        let shouldShowMenuBarSignInWithoutLoginWindowSignin = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowMenuBarSignInWithoutLoginWindowSignin.rawValue)\n\n        if shouldShowMenuBarSignInWithoutLoginWindowSignin == true && isLocalOnlyAccount() == true {\n            showSignInWindow(force:true,forceLoginWindowType: .cloud)\n        }\n\n\n    }\n\n    //get local password either from keychain or prompt. If prompt, then it will save in keychain for next time. if keychain, get keychain and test to make sure it is valid.\n    func localAccountAndPassword() -> (String?,String?) {\n\n        \n        let keychainUtil = KeychainUtil()\n        var accountName=\"\"\n        let passwordItem = keychainUtil.findPassword(serviceName: PrefKeys.password.rawValue,accountName: nil)\n\n\n        if let passwordItem=passwordItem {\n            accountName=passwordItem.username\n            let password = passwordItem.password\n            \n\n            if case .success = PasswordUtils.isLocalPasswordValid(userName: PasswordUtils.currentConsoleUserName, userPass: password){\n                TCSLogWithMark(\"account name and password found: \\(accountName)\")\n                return (accountName,password)\n            }\n        }\n        else {\n            TCSLogWithMark(\"invalid password item\")\n        \n        }\n        TCSLogWithMark()\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSuppressLocalPasswordPrompt.rawValue)==true {\n            TCSLogWithMark(\"Suppressing local password prompt\")\n            return (nil,nil)\n\n        }\n\n        let promptPasswordWindowController = VerifyLocalPasswordWindowController()\n\n        \n        promptPasswordWindowController.showResetText=false\n        promptPasswordWindowController.showResetButton=false\n\n        switch  promptPasswordWindowController.promptForLocalAccountAndChangePassword(username: PasswordUtils.currentConsoleUserName, newPassword: nil, shouldUpdatePassword: false) {\n\n        case .success(let localUsernamePassword):\n            guard let localPassword = localUsernamePassword?.password, let localUsername = localUsernamePassword?.username else {\n                TCSLogWithMark( \"No password returned\")\n                return (nil,nil)\n\n            }\n            let err = keychainUtil.updatePassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue, pass:localPassword, keychainPassword: localPassword)\n            if err == false {\n                TCSLogWithMark(\"Failed to store password in keychain\")\n                return (nil,nil)\n            }\n            return (accountName,localPassword)\n\n        case .accountResetRequested(_):\n            return (nil,nil)\n\n        case .userCancelled:\n            return (nil,nil)\n        case .error(_):\n            return (nil,nil)\n\n        }\n\n    }\n    func passwordExpiryUpdate(_ passwordExpire: Date) {\n        let dateFormatter = DateFormatter()\n\n        dateFormatter.locale = Locale.current\n        dateFormatter.dateStyle = .medium\n        dateFormatter.timeStyle = .short\n        let dateString = dateFormatter.string(from: passwordExpire)\n\n\n        if passwordExpire.timeIntervalSinceNow>10*365*24*60*60{\n            self.adPasswordExpires=\"Never\"\n        }\n        else {\n            self.adPasswordExpires=dateString\n\n        }\n\n\n        let appDelegate = NSApp.delegate as? AppDelegate\n        appDelegate?.updateStatusMenuExpiration(passwordExpire)\n\n\n    }\n\n\n    func credentialsUpdated(_ credentials:Creds) {\n        \n        // this gets called with an empty Creds if ROPG is used and we get back a\n        // code that says auth was successfull but we have not tokens so\n        // we proceed\n        DispatchQueue.main.async {\n            UserDefaults.standard.removeObject(forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue)\n\n            self.hasCredential=true\n            self.tokenCredentialStatus=\"Valid Tokens\"\n            (NSApp.delegate as? AppDelegate)?.updateStatusMenuIcon(showDot:true)\n            let tokenManager = TokenManager()\n\n            if  let idTokenInfo = try? tokenManager.tokenInfo(fromCredentials: credentials){\n                let userInfoResult = tokenManager.setupUserAccountInfo(idTokenInfo: idTokenInfo)\n\n                switch userInfoResult {\n\n                case .success(let retUserAccountInfo):\n                    let userInfo = retUserAccountInfo\n\n                    if let username = userInfo.username, let fullUsername = userInfo.fullUsername {\n                        UserDefaults.standard.set(username, forKey:\"_xcreds_oidc_username\")\n                        UserDefaults.standard.set(fullUsername, forKey:\"_xcreds_oidc_full_username\")\n\n                        //if user oidc username doesn't exist in DS, write to a file in ~/L/AS for login window to migrate\n                        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n                        if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_username\") as? [String], userNames.count>0, let username = userNames.first {\n                            TCSLogWithMark(\"Found existing username \\(username) in DS\")\n\n                        }\n                        else {\n                            TCSLogWithMark(\"No _xcreds_oidc_username found in DS so setting migrate file\");\n                            let appSupportFolder = NSHomeDirectory() + \"/Library/Application Support/XCreds\"\n                            let plistPath = appSupportFolder + \"/ds_info.plist\"\n\n                            do {\n                                //check to see if appSupportFolder exists and if not, create\n                                if !FileManager.default.fileExists(atPath: appSupportFolder) {\n                                    TCSLogWithMark(\"Creating appSupport folder\")\n                                    try FileManager.default.createDirectory(atPath: appSupportFolder, withIntermediateDirectories: true, attributes: nil)\n                                }\n                                if FileManager.default.fileExists(atPath: plistPath) {\n                                    TCSLogWithMark(\"plist already exists so remove it so we get the freshes value\")\n                                    try FileManager.default.removeItem(at: URL(filePath: plistPath))\n                                }\n                                if let subValue = idTokenInfo[\"sub\"] as? String, let issuerValue = idTokenInfo[\"iss\"] as? String{\n                                    var dictToWrite = [\"_xcreds_oidc_username\":username,\n                                                       \"_xcreds_oidc_full_username\":fullUsername,\n                                                       \"subValue\":subValue,\n                                                       \"issuerValue\":issuerValue,\n                                                       \"localuser\":PasswordUtils.currentConsoleUserName]\n\n                                    if let kerberosPrincipalName = userInfo.kerberosPrincipalName {\n                                        dictToWrite[\"_xcreds_activedirectory_kerberosPrincipal\"] = kerberosPrincipalName\n                                    }\n                                    //write dictToWrite to file as plist\n                                    TCSLog(\"writing plist file: \\(plistPath)\")\n                                    try PropertyListEncoder().encode(dictToWrite).write(to: URL(fileURLWithPath: plistPath))\n                                }\n                            }\n                            catch {\n                                TCSLogWithMark(\"Error saving migrate file: \\(error)\")\n                            }\n\n                        }\n                        if let kerberosPrincipalName = userInfo.kerberosPrincipalName {\n                            UserDefaults.standard.set(kerberosPrincipalName, forKey:\"_xcreds_activedirectory_kerberosPrincipal\")\n                        }\n                    }\n                case .error(let message):\n                    TCSLogWithMark(\"Error getting infoResult: \\(message)\")\n                }\n\n            }\n            else {\n                TCSLogWithMark(\"no idTokenInfo because using LDAP, ROPG or issue with OIDC.\")\n            \n            }\n\n            self.windowController.window?.close()\n            \n            let localAccountAndPassword = self.localAccountAndPassword()\n            \n            TCSLogWithMark(\"local account: \\(localAccountAndPassword.0 ?? \"\")\")\n            if credentials.password != nil, let localPassword=localAccountAndPassword.1, localPassword.count>0{\n                if localPassword != credentials.password{\n                    TCSLogWithMark(\"localPassword and credentials.password do not match\")\n\n                    var updatePassword = true\n                    if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.verifyPassword.rawValue)==true {\n                        let verifyOIDPassword = VerifyOIDCPasswordWindowController.init(windowNibName: NSNib.Name(\"VerifyOIDCPassword\"))\n                        NSApp.activate(ignoringOtherApps: true)\n\n                        while true {\n                            let response = NSApp.runModal(for: verifyOIDPassword.window!)\n                            if response == .cancel {\n\n                                let alert = NSAlert()\n                                alert.addButton(withTitle: \"Skip Updating Password\")\n                                alert.addButton(withTitle: \"Cancel\")\n                                alert.messageText=\"Are you sure you want to skip updating the local password and keychain? Your local password and keychain will be out of sync with your cloud password. \"\n                                let resp = alert.runModal()\n                                if resp == .alertFirstButtonReturn {\n                                    NSApp.stopModal(withCode: .cancel)\n                                    verifyOIDPassword.window?.close()\n                                    updatePassword=false\n                                    break\n\n                                }\n                            }\n                            let verifyCloudPassword = verifyOIDPassword.password\n                            if verifyCloudPassword == credentials.password {\n\n                                updatePassword=true\n\n                                verifyOIDPassword.window?.close()\n                                break;\n                            }\n                            else {\n                                verifyOIDPassword.window?.shake(self)\n                            }\n\n                        }\n                    }\n                    if updatePassword {\n                        if let cloudPassword = credentials.password {\n                            try? PasswordUtils.changeLocalUserAndKeychainPassword(localPassword, newPassword: cloudPassword)\n                            self.updateFileVaultSkip()\n\n                        }\n                    }\n                }\n                \n            }\n            var localPassword = credentials.password\n            if localPassword==nil {\n                localPassword = localAccountAndPassword.1\n            }\n            if let localPassword = localPassword, TokenManager.saveTokensToKeychain(creds: credentials, keychainPassword:localPassword ) == false {\n                TCSLogErrorWithMark(\"error saving tokens to keychain\")\n            }\n\n            self.scheduleManager.startCredentialCheck()\n\n        }\n\n        //delay startup to give network time to settle.\n        Timer.scheduledTimer(withTimeInterval: 15, repeats: false) { timer in\n            self.scheduleManager.startCredentialCheck()\n        }\n\n    }\n    func invalidCredentials() {\n        TCSLogWithMark()\n        hasCredential=false\n        tokenCredentialStatus=\"Invalid Token Credentials\"\n        DispatchQueue.main.async {\n\n\n            let appDelegate = NSApp.delegate as? AppDelegate\n\n            appDelegate?.updateStatusMenuIcon(showDot:false)\n\n            self.showSignInWindow(forceLoginWindowType: .cloud)\n        }\n\n\n\n    }\n    func credentialsCheckFailed() {\n        DispatchQueue.main.async {\n\n            TCSLogWithMark()\n            self.hasCredential=false\n            self.tokenCredentialStatus=\"Credentials Check Failed\"\n\n            let appDelegate = NSApp.delegate as? AppDelegate\n            appDelegate?.updateStatusMenuIcon(showDot:false)\n            self.showSignInWindow(forceLoginWindowType: .cloud)\n        }\n\n    }\n    func updateFileVaultSkip() {\n        \n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSkipFileVaultLogin.rawValue) == true{\n            self.shouldShowFilevaultBypassMenuItem=true\n\n            TCSLogWithMark(\"Setting filevault to unlock with user\")\n            FileVaultLoginHelper.shared.skipFileVaultAuthAtNextReboot { result, error in\n                if result == false {\n                    TCSLogWithMark(error ?? \"Unknown error\")\n                    self.fileVaultMenuItemText = self.standardFilevaultAutologinText+\" (error. check log)\"\n                }\n                else {\n                    self.fileVaultMenuItemText = self.standardFilevaultAutologinText\n                }\n                \n            }\n        }\n        \n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSkipFileVaultLoginAdmin.rawValue) == true{\n            TCSLogWithMark(\"Setting filevault to unlock with admin\")\n            self.shouldShowFilevaultBypassMenuItem=true\n\n            FileVaultLoginHelper.shared.skipFileVaultAuthAtNextRebootWithAdmin { result, error in\n                if result == false {\n                    self.fileVaultMenuItemText = self.standardFilevaultAutologinText+\" (error. check log)\"\n                    TCSLogWithMark(error ?? \"Unknown error\")\n                    \n                }\n                else {\n                    self.fileVaultMenuItemText = self.standardFilevaultAutologinText\n\n                }\n            }\n            \n        }\n        \n    }\n    func kerberosTicketUpdated() {\n        TCSLogWithMark()\n        hasKerberosTicket=true\n        (NSApp.delegate as? AppDelegate)?.updateStatusMenuIcon(showDot:true)\n\n        kerberosCredentialStatus=\"Valid kerberos tickets\"\n        updateFileVaultSkip()\n    }\n    func kerberosTicketCheckFailed(_ error: NoMADSessionError) {\n\n        TCSLogWithMark()\n        hasKerberosTicket=false\n        (NSApp.delegate as? AppDelegate)?.updateStatusMenuIcon(showDot:false)\n\n        kerberosCredentialStatus=\"Kerberos Tickets Failed\"\n        switch error{\n\n        case .OffDomain:\n            TCSLogWithMark(\"Off domain so not prompting\")\n\n        case .UnknownPrincipal:\n            TCSLogWithMark(\"UnknownPrincipal so not prompting\")\n\n        default:\n            if signInViewController?.view.window?.isVisible==true {\n                TCSLogWithMark(\"Already showing sign in window\")\n            }\n            else{\n                showSignInWindow(forceLoginWindowType: .usernamePassword, hadPasswordFailure: true)\n            }\n\n        }\n    }\n    func adUserUpdated(_ adUser: ADUserRecord) {\n\n        (NSApp.delegate as? AppDelegate)?.updateShareMenu(adUser: adUser)\n\n    }\n    func OIDCPasswordExpiryDate() -> Date?{\n\n        let keychainUtil = KeychainUtil()\n\n        guard let passwordItem = keychainUtil.findPassword(serviceName: \"xcreds idToken\", accountName: \"idToken\")?.password else {\n            TCSLogWithMark(\"cannot find ID token\")\n\n            return nil\n        }\n\n        let idTokenInfo = jwtDecode(value: passwordItem)  //dictionary for mapping\n\n        guard let idTokenInfo = idTokenInfo else {\n            TCSLogWithMark(\"idTokenInfo invalid\")\n            return nil\n        }\n\n        guard let expiryKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapPasswordExpiry.rawValue)  as? String,\n              expiryKey.count>0,\n              let expiryString = idTokenInfo[expiryKey] as? String,\n              let expiryNumber = Int(expiryString) else {\n            TCSLogWithMark(\"mapPasswordExpiry invalid\")\n\n            return nil\n        }\n\n        guard let iatInt = idTokenInfo[\"iat\"] as? Int\n              else {\n            TCSLogWithMark(\"iatInt invalid\")\n\n            return nil\n        }\n        TCSLogWithMark(\"iatInt: \\(iatInt)\")\n        TCSLogWithMark(\"expiryNumber: \\(expiryNumber)\")\n\n        let expirySecondsFromEpoch = expiryNumber + iatInt\n        TCSLogWithMark(\"expirySecondsFromEpoch: \\(expirySecondsFromEpoch)\")\n\n        let expiryDate = Date(timeIntervalSince1970: TimeInterval(expirySecondsFromEpoch))\n\n        TCSLogWithMark(\"expiryDate: \\(expiryDate)\")\n\n        return expiryDate\n\n    }\n\n\n}\n\n"
  },
  {
    "path": "XCreds/MainLoginWindowController.swift",
    "content": "//\n//  MainLoginWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 12/7/23.\n//\n\nimport Cocoa\n@available(macOS, deprecated: 11)\nclass MainLoginWindowController: NSWindowController,NSWindowDelegate {\n    var controlsViewController: ControlsViewController?\n    var setupDone=false\n    @IBOutlet weak var backgroundImageView: NSImageView!\n//    var resolutionObserver:Any?\n    var networkChangeObserver:Any?\n    var centerView:NSView?\n    var mechanism:XCredsMechanismProtocol?\n    var timer:Timer?\n    var windowArray:Array<NSWindow>=[]\n    override func windowDidLoad() {\n        TCSLogWithMark()\n        super.windowDidLoad()\n        window?.canBecomeVisibleWithoutLogin=true\n        let screenRect = NSScreen.screens[0].frame\n        window?.setFrame(screenRect, display: true, animate: false)\n        window?.alphaValue=0.95\n\n        timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true, block: { timer in\n            //added this because https://github.com/twocanoes/xcreds/issues/272\n\n            if let path = DefaultsOverride.standardOverride.string(forKey: PrefKeys.hideIfPathExists.rawValue), FileManager.default.fileExists(atPath:path ) {\n\n                if self.window?.isVisible==true {\n                    TCSLogWithMark(\"window is visible and hide path has item at it so hiding window\")\n                    self.window?.orderOut(self)\n                }\n            }\n            else { //\n                if self.window?.isVisible==false {\n                    TCSLogWithMark(\"window is not visible and default does exist so moving to front\")\n\n                    self.window?.makeKeyAndOrderFront(self)\n                }\n                self.window?.forceToFrontAndFocus(self)\n            }\n        })\n    }\n\n    override func awakeFromNib() {\n        TCSLogWithMark()\n\n        //awakeFromNib gets called multiple times. guard against that.\n        if setupDone == false {\n//            updateLoginWindowInfo()\n            setupDone=true\n            setupLoginWindowAppearance()\n\n//            os_log(\"Finishing loading loginwindow\", log: uiLog, type: .debug)\n\n            // Disabling due to it causing screen resizing during EULA\n            let notificationCenter = NotificationCenter.default\n            notificationCenter.addObserver(self,\n                                           selector: #selector(updateWindow),\n                                           name: NSApplication.didChangeScreenParametersNotification,\n                                           object: nil)\n        }\n\n\n    }\n    @objc func updateWindow() {\n        TCSLogWithMark()\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1){\n            if self.window?.isVisible ?? true {\n                let screenRect = NSScreen.screens[0].frame\n                let screenWidth = screenRect.width\n                let screenHeight = screenRect.height\n\n                TCSLogWithMark(\"screenRect: \\(screenRect)\")\n                self.window?.setFrame(NSMakeRect(0,0 , screenWidth, screenHeight), display: true)\n\n                if let height = self.controlsViewController?.view.frame.size.height {\n                    let rect = NSMakeRect(0, 0, screenWidth,height)\n\n                    self.controlsViewController?.view.frame=rect\n                }\n                self.recenterCenterView()\n                self.updateBackground()\n\n            }\n        }\n    }\n    func setupLoginWindowAppearance() {\n\n        TCSLogWithMark(\"setting up window...\")\n\n        self.window?.backgroundColor = NSColor.black\n        self.window?.titlebarAppearsTransparent = true\n\n        self.window?.isMovable = false\n        self.window?.canBecomeVisibleWithoutLogin = true\n        self.window?.level = .normal\n\n        let screenRect = NSScreen.screens[0].frame\n\n        self.window?.setFrame(screenRect, display: true, animate: false)\n        let rect = NSMakeRect(0, 0, self.window?.contentView?.frame.size.width ?? 100,117)\n\n        self.controlsViewController?.view.frame=rect\n\n        TCSLogWithMark()\n\n        if self.controlsViewController==nil {\n            self.controlsViewController = ControlsViewController.initFromPlugin()\n        }\n        else {\n            self.controlsViewController!.view.removeFromSuperview()\n        }\n\n        guard let controlsViewController = self.controlsViewController else {\n            return\n        }\n        self.controlsViewController?.delegate=mechanism\n\n        TCSLogWithMark()\n        self.window?.contentView?.addSubview(controlsViewController.view)\n        \n        if let width = self.window?.frame.size.width {\n            let rect2 = NSMakeRect(0, 0, width,controlsViewController.view.frame.size.height)\n            controlsViewController.view.frame=rect2\n\n        }\n        TCSLogWithMark(\"create background windows\")\n        self.updateBackground()\n\n        TCSLogWithMark()\n        controlsViewController.showPopoverIfNeeded()\n         \n    }\n\n    func loginTransition( completion:@escaping ()->Void) {\n        DispatchQueue.main.async {\n\n\n            if let timer = self.timer, timer.isValid==true {\n                TCSLogWithMark(\"invalidating timer\")\n                timer.invalidate()\n\n            }\n            TCSLogWithMark()\n            let screenRect = NSScreen.screens[0].frame\n\n            let progressIndicator=NSProgressIndicator.init(frame: NSMakeRect(0, screenRect.height-3, screenRect.width,3))\n            progressIndicator.style = .bar\n\n            progressIndicator.startAnimation(self)\n            self.window?.contentView?.addSubview(progressIndicator)\n\n\n            self.window?.canBecomeVisibleWithoutLogin=true\n\n\n\n            NotificationCenter.default.removeObserver(self)\n\n            if let networkChangeObserver = self.networkChangeObserver {\n                NotificationCenter.default.removeObserver(networkChangeObserver)\n            }\n            self.controlsViewController?.allowPopoverClose=true\n            if self.controlsViewController?.systemInfoPopover.isShown==true {\n                self.controlsViewController?.systemInfoPopover.performClose(self)\n\n            }\n            NSAnimationContext.runAnimationGroup({ (context) in\n                context.duration = 1.0\n                context.allowsImplicitAnimation = true\n                self.centerView?.animator().alphaValue = 0.0\n                let origin = self.controlsViewController?.view.frame.origin\n                let size = self.controlsViewController?.view.frame.size\n\n                if let origin = origin, let size = size {\n                    self.controlsViewController?.view.animator().setFrameOrigin(NSMakePoint(origin.x, origin.y-(2*size.height)))\n                }\n            }, completionHandler: {\n                self.centerView?.alphaValue = 0.0\n                self.controlsViewController?.view.animator().alphaValue=0.0\n\n                self.centerView?.removeFromSuperview()\n                self.controlsViewController?.view.removeFromSuperview()\n//                self.window?.orderOut(self)\n                TCSLogWithMark(\"completion\")\n                completion()\n            })\n        }\n\n    }\n\n    fileprivate func updateBackground() {\n        TCSLogWithMark()\n        if windowArray.count>1{\n            for i in 1..<windowArray.count{\n\n                windowArray[i].contentView?.removeFromSuperview()\n\n            }\n        }\n        windowArray.removeAll()\n        if let window = window {\n            windowArray.append(window)\n        }\n\n        var i=0\n        var currWindow:NSWindow\n        for screen in NSScreen.screens{\n            if i>0{\n                let newWindow = NSWindow(contentRect: .init(origin: .zero,\n                                                            size: .init(width: screen.frame.width,\n                                                                        height: screen.frame.height)),\n                                         styleMask: [],\n                                         backing: .buffered,\n                                         defer: false,\n                                         screen: screen)\n                newWindow.backgroundColor = NSColor.black\n                newWindow.titlebarAppearsTransparent = true\n\n                newWindow.isMovable = false\n                newWindow.canBecomeVisibleWithoutLogin = true\n                newWindow.level = .normal\n\n                windowArray.append(newWindow)\n            }\n\n            currWindow = windowArray[i]\n            let backgroundImage = DefaultsHelper.backgroundImage()\n\n            let screenRect = screen.frame\n            var newHeight = screenRect.height\n            var newWidth = screenRect.width\n\n            if let backgroundImage = backgroundImage{\n                if i == 0 {\n\n                    if UserDefaults.standard.bool(forKey: PrefKeys.shouldLoginWindowBackgroundImageFillScreen.rawValue) == false {\n                        TCSLogWithMark(\"MainLoginWindowController: Not resizing background image to fill screen\")\n\n                        let ratio = backgroundImage.size.width/backgroundImage.size.height\n                        newHeight = screenRect.size.height\n                        newWidth = screenRect.size.height * ratio\n\n                        if newWidth > screenRect.size.width {\n                            newWidth = screenRect.size.width\n                            newHeight = screenRect.size.width / ratio\n                        }\n                    }\n                    else {\n                        TCSLogWithMark(\"MainLoginWindowController: resizing background image to fill screen\")\n\n                        backgroundImage.size.height = newHeight\n                        backgroundImage.size.width = newWidth\n\n                        backgroundImageView.imageScaling = .scaleAxesIndependently\n\n                        backgroundImageView.frame=NSMakeRect(screenRect.origin.x, screenRect.origin.y, screenRect.size.width, screenRect.size.height-100)\n\n                    }\n                    //main screen\n                    backgroundImageView.imageScaling = .scaleAxesIndependently\n                    backgroundImage.size.height = newHeight\n                    backgroundImage.size.width = newWidth\n                    TCSLogWithMark(\"Setting background size to width:\\(newWidth) height:\\(newHeight)\")\n                    backgroundImageView.frame=NSMakeRect((screenRect.size.width-newWidth)/2, (screenRect.size.height-newHeight)/2, newWidth, newHeight)\n                    backgroundImageView.image=backgroundImage\n                    backgroundImageView.alphaValue = CGFloat(DefaultsOverride.standardOverride.float(forKey: PrefKeys.loginWindowBackgroundImageAlpha.rawValue))\n\n                }\n                else {\n                    let newBackgroundImageView = NSImageView()\n\n                    if let secondardBackgroundImage = DefaultsHelper.secondaryBackgroundImage(){\n\n                        if UserDefaults.standard.bool(forKey: PrefKeys.shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen.rawValue) == false {\n                            TCSLogWithMark(\"secondaryBackgroundImage: Not resizing secondary background image to fill screen\")\n\n                            let ratio = secondardBackgroundImage.size.width/secondardBackgroundImage.size.height\n                            newHeight = screenRect.size.height\n                            newWidth = screenRect.size.height * ratio\n\n                            if newWidth > screenRect.size.width {\n                                newWidth = screenRect.size.width\n                                newHeight = screenRect.size.width / ratio\n                            }\n\n                        }\n                        else {\n                            TCSLogWithMark(\"secondaryBackgroundImage: resizing secondary background image to fill screen\")\n\n                            secondardBackgroundImage.size.height = newHeight\n                            secondardBackgroundImage.size.width = newWidth\n\n                            newBackgroundImageView.frame=NSMakeRect(screenRect.origin.x, screenRect.origin.y, screenRect.size.width, screenRect.size.height-100)\n\n                        }\n                        newBackgroundImageView.imageScaling = .scaleAxesIndependently\n                        secondardBackgroundImage.size.height = newHeight\n                        secondardBackgroundImage.size.width = newWidth\n\n                        //secondary screens\n                        newBackgroundImageView.image=secondardBackgroundImage\n                        newBackgroundImageView.alphaValue = CGFloat(DefaultsOverride.standardOverride.float(forKey: PrefKeys.loginWindowSecondaryMonitorsBackgroundAlpha.rawValue))\n\n                        newBackgroundImageView.imageScaling = .scaleAxesIndependently\n                        newBackgroundImageView.frame=NSMakeRect((screenRect.size.width-newWidth)/2, (screenRect.size.height-newHeight)/2, newWidth, newHeight)\n\n                        currWindow.contentView?.addSubview(newBackgroundImageView)\n                        currWindow.makeKeyAndOrderFront(self)\n\n                    }\n                }\n\n            }\n            i += 1\n        }\n\n    }\n    func recenterCenterView()  {\n         TCSLogWithMark()\n        if let contentView = self.window?.contentView, let centerView = self.centerView {\n            TCSLogWithMark()\n\n            var x = NSMidX(contentView.frame)\n            var y = NSMidY(contentView.frame)\n            TCSLogWithMark(\"x:\\(x) y:\\(y) center width: \\(centerView.frame.size.width), centerview height: \\(centerView.frame.size.height)\")\n            x = x - centerView.frame.size.width/2\n            y = y - centerView.frame.size.height/2\n            let lowerLeftCorner = NSPoint(x: x, y: y)\n\n            centerView.setFrameOrigin(lowerLeftCorner)\n            TCSLogWithMark(\"\\(x):\\(y)\")\n\n        }\n        else {\n            TCSLogWithMark(\"invalid contentView or center view\")\n        }\n        if let controlsView = controlsViewController?.view {\n            controlsView.removeFromSuperview()\n            self.window?.contentView?.addSubview(controlsView)\n\n        }\n    }\n    func addCenterView(_ centerView:NSView){\n        TCSLogWithMark(\"re-centering\")\n        if self.centerView != nil {\n            self.centerView?.removeFromSuperview()\n        }\n        self.centerView=centerView\n        self.window?.contentView?.addSubview(centerView)\n        recenterCenterView()\n    }\n\n\n\n\n}\n"
  },
  {
    "path": "XCreds/NotifyManager.swift",
    "content": "//\n//  NotifyManager.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\nimport Cocoa\nimport UserNotifications\n\nclass NotifyManager {\n\n    static let shared = NotifyManager()\n\n\n    init() {\n        let center = UNUserNotificationCenter.current()\n\n        center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in\n        }\n\n    }\n    func sendMessage(message:String)  {\n        let content = UNMutableNotificationContent()\n        content.title = message\n\n        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)\n\n        // choose a random identifier\n        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)\n\n        // add our notification request\n        UNUserNotificationCenter.current().add(request)\n\n    }\n}\n"
  },
  {
    "path": "XCreds/PasswordUtils.swift",
    "content": "//\n//  PasswordUtils.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\nimport Cocoa\nimport SystemConfiguration\nimport SecurityFoundation\nimport OpenDirectory\n\n//enum DSQueryableErrors: Error {\n//    case notLocalUser\n//    case multipleUsersFound\n//}\n\nenum PasswordError: Error, CustomStringConvertible {\n    case itemNotFound(String)\n    case invalidParamater(String)\n    case invalidResult(String)\n    case unknownError(String)\n\n    var description: String {\n        switch self {\n        case .itemNotFound(let message): return message\n        case .invalidParamater(let message): return message\n        case .invalidResult(let message): return message\n        case .unknownError(let message): return message\n        }\n    }\n}\nenum PasswordVerificationResult {\n    case success\n    case incorrectPassword\n    case accountDoesNotExist\n    case accountLocked\n    case other(String)\n}\n\n\nstruct SecureTokenCredential {\n\n    var username:String\n    var password:String\n}\nclass PasswordUtils: NSObject {\n\n    static let currentConsoleUserName: String = NSUserName()\n    static let uid: String = String(getuid())\n\n    class func getCurrentConsoleUserRecord() -> ODRecord? {\n        // Get ODRecords where record name is equal to the Current Console User's username\n        let session = ODSession.default()\n        var records = [ODRecord]()\n        do {\n            //let node = try ODNode.init(session: session, type: UInt32(kODNodeTypeAuthentication))\n            let node = try ODNode.init(session: session, type: UInt32(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: UInt32(kODMatchEqualTo), queryValues: currentConsoleUserName, returnAttributes: kODAttributeTypeNativeOnly, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n\n        }\n\n        // We may have gotten multiple ODRecords that match username,\n        // So make sure it also matches the UID.\n\n        for case let record in records {\n            let attribute = \"dsAttrTypeStandard:UniqueID\"\n            if let odUid = try? String(describing: record.values(forAttribute: attribute)[0]) {\n                if ( odUid == uid) {\n                    return record\n                }\n            }\n        }\n\n        return nil\n    }\n   \n    \n//    class func verifyUser(name: String, auth: String) -> Bool {\n//        os_log(\"Finding user record\", log: noLoMechlog, type: .debug)\n//        TCSLogWithMark(\"searching for user \\(name) and password with count \\(auth.count)\")\n//        var records = [ODRecord]()\n//        let odsession = ODSession.default()\n//        var isValid = false\n//        do {\n//            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n//            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n//            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n//            let result = isLocalPasswordValid(userName: name, userPass: auth)\n//            isValid = ((try records.first?.verifyPassword(auth)) != nil)\n//        } catch {\n//            let errorText = error.localizedDescription\n//            TCSLogErrorWithMark(\"ODError while trying to check for local user: \\(errorText)\")\n//            return false\n//        }\n//        return isValid\n//    }\n\n//    class func verifyPassword(password:String) -> Bool {\n//        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n//        do {\n//            try currentUser?.verifyPassword(password)\n//        }\n//        catch {\n//            return false\n//\n//        }\n//        return true\n//    }\n//\n//    class func verifyCurrentUserPassword(password:String) -> Bool {\n//        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n//        do {\n//            try currentUser?.verifyPassword(password)\n//        }\n//        catch {\n//            return false\n//\n//        }\n//        return true\n//    }\n    @available(macOS, deprecated: 11)\n    class func verifyKeychainPassword(password: String) throws -> Bool  {\n        var getDefaultKeychain: OSStatus\n        var myDefaultKeychain: SecKeychain?\n        var err: OSStatus\n\n        // get the user's default keychain. (Typically login.keychain)\n        getDefaultKeychain = SecKeychainCopyDefault(&myDefaultKeychain)\n        if ( getDefaultKeychain == errSecNoDefaultKeychain ) {\n            throw PasswordError.itemNotFound(\"Could not find Default Keychain\")\n        }\n\n        err = SecKeychainUnlock(myDefaultKeychain, UInt32(strlen(password.cString(using: .utf8) ?? [])), password.cString(using: .utf8) ?? [], true)\n        if err != noErr {\n            return false\n        }\n        return true\n    }\n    @available(macOS, deprecated: 11)\n    static func changeLocalUserAndKeychainPassword(_ oldPassword: String, newPassword: String) throws {\n\n\n        TCSLogWithMark()\n        var getDefaultKeychain: OSStatus\n        var myDefaultKeychain: SecKeychain?\n        var err: OSStatus\n\n        // get the user's default keychain. (Typically login.keychain)\n        getDefaultKeychain = SecKeychainCopyDefault(&myDefaultKeychain)\n        if ( getDefaultKeychain == errSecNoDefaultKeychain ) {\n            throw PasswordError.itemNotFound(\"Could not find Default Keychain\")\n        }\n\n        // Test if the keychain password is correct by trying to unlock it.\n\n\n        err = SecKeychainUnlock(myDefaultKeychain, UInt32(strlen(oldPassword.cString(using: .utf8) ?? [])), oldPassword.cString(using: .utf8) ?? [], true)\n\n        if err != noErr {\n            throw PasswordError.invalidResult(\"Error unlocking default keychain.\")\n        }\n\n        do {\n            try getCurrentConsoleUserRecord()?.changePassword(oldPassword, toPassword: newPassword)\n        } catch  {\n            throw PasswordError.unknownError(\"error changing password: \\(error)\")\n\n        }\n\n\n        err = SecKeychainChangePassword(myDefaultKeychain, UInt32(strlen(oldPassword.cString(using: .utf8) ?? [] )), oldPassword.cString(using: .utf8) ?? [], UInt32(strlen(newPassword.cString(using: .utf8) ?? [] )), newPassword.cString(using: .utf8) ?? [])\n\n        if (err == noErr) {\n            return\n        } else if ( err == errSecAuthFailed ) {\n            return\n        } else {\n            // If we got any other error, we don't know if the password is good or not because we probably couldn't find the keychain.\n            throw PasswordError.unknownError(\"Unknown error: \" + err.description)\n        }\n    }\n    /// `ODNode` to DSLocal for queries and account manipulation.\n    public class var localNode: ODNode? {\n        do {\n            return try ODNode.init(session: ODSession.default(), type: ODNodeType(kODNodeTypeLocalNodes))\n        } catch {\n            TCSLogWithMark(\"ODError creating local node.\")\n            return nil\n        }\n    }\n\n    /// Conviennce function to discover if a shortname has an existing local account.\n    ///\n    /// - Parameter shortName: The name of the user to search for as a `String`.\n    /// - Returns: `true` if the user exists in DSLocal, `false` if not.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error or the user is not local.\n    public class func isUserLocal(_ shortName: String) throws -> Bool {\n        do {\n            _ = try getLocalRecord(shortName)\n        } catch DSQueryableErrors.notLocalUser {\n            return false\n        } catch {\n            throw error\n        }\n        return true\n    }\n    public class func doesUserHomeExist(_ name: String) throws -> Bool {\n        // first get the user record\n\n        os_log(\"Checking for existing home directory\", log: noLoMechlog, type: .debug)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return true\n        }\n\n        os_log(\"Record search returned\", log: noLoMechlog, type: .info)\n\n        if records.isEmpty {\n            os_log(\"No user found to delete, success!\", log: noLoMechlog, type: .debug)\n            return true\n        } else if records.count > 1 {\n            os_log(\"Multiple users found, failing local user removal\", log: noLoMechlog, type: .info)\n            return false\n        }\n\n        if let homePaths = records.first?.value(forKey: kODAttributeTypeNFSHomeDirectory) as? [String] {\n\n            os_log(\"Home path found\", log: noLoMechlog, type: .info)\n\n            let fm = FileManager.default\n\n            if let homePath = homePaths.first {\n                if fm.fileExists(atPath: homePath) {\n                    os_log(\"Home is: %{public}@\", log: noLoMechlog, type: .info, homePath)\n                    return true\n\n                } else {\n                    return false\n                }\n            }\n        }\n        return false\n    }\n\n\n    /// Checks a local username and password to see if they are valid.\n    ///\n    /// - Parameters:\n    ///   - userName: The name of the user to search for as a `String`.\n    ///   - userPass: The password for the user being tested as a `String`.\n    /// - Returns: `true` if the name and password combo are valid locally. `false` if the validation fails.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error.\n    public class func isLocalPasswordValid(userName: String, userPass: String) -> PasswordVerificationResult {\n        do {\n            TCSLogWithMark(\"getting local record\")\n            let userRecord = try PasswordUtils.getLocalRecord(userName)\n//            TCSLogWithMark(\"Checking if password is allowed\")\n//            try userRecord.passwordChangeAllowed(userPass)\n            TCSLogWithMark(\"checking password\")\n            try userRecord.verifyPassword(userPass)\n            TCSLogWithMark(\"checking password done, returning success\")\n            return .success\n\n        } catch {\n            let castError = error as NSError\n            switch castError.code {\n            case Int(kODErrorCredentialsInvalid.rawValue):\n                TCSLogWithMark(\"Tested password for user account: \\(userName) is not valid.\")\n                return .incorrectPassword\n            case Int(kODErrorCredentialsAccountNotFound.rawValue):\n                TCSLogWithMark(\"No local account for user: \\(userName) is not valid.\")\n                return .accountDoesNotExist\n            case Int(kODErrorCredentialsAccountLocked.rawValue):\n                TCSLogWithMark(\"No Account for user: \\(userName) is not locked.\")\n                return .accountLocked\n\n            case Int(kODErrorCredentialsAccountTemporarilyLocked.rawValue):\n                TCSLogWithMark(\"No local account for user: \\(userName) is not valid. Local account temporarily locked. Please wait a bit and try again.\")\n                return .accountLocked\n\n            case Int(kODErrorCredentialsAccountDisabled.rawValue):\n                TCSLogWithMark(\"No local account for user: \\(userName) is not valid. Local account disabled. Please wait a bit and try again.\")\n                return .accountLocked\n\n\n            case Int(kODErrorCredentialsMethodNotSupported.rawValue):\n                TCSLogWithMark(\"credential type not supported: \\(userName).\")\n                return .other(\"credential type not supported\")\n\n\n            default:\n                TCSLogWithMark(\"throw error:\\(error.localizedDescription):\\(castError.code)\")\n                return .accountDoesNotExist\n            }\n        }\n\n    }\n\n    func kerberosPrincipalFromCurrentLoggedInUser() -> String?  {\n        guard let user = try? PasswordUtils.getLocalRecord(getConsoleUser()),\n              let kerbPrincArray = user.value(forKey: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? Array <String>,\n              let kerbPrinc = kerbPrincArray.first else\n        {\n            return nil\n        }\n        return kerbPrinc\n    }\n\n    public class func resolveName(_ name:String) throws -> String{\n\n        var record:ODRecord\n        do{\n\n            record = try getLocalRecord(name)\n\n        }\n        catch {\n            record = try getLocalRecord(fullName: name)\n\n        }\n        return record.recordName\n\n    }\n    public class func getLocalRecord(fullName: String) throws -> ODRecord {\n        do {\n            TCSLogWithMark(\"Building OD query for name \\(fullName)\")\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeFullName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: fullName,\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 0)\n            let records = try query.resultsAllowingPartial(false) as! [ODRecord]\n\n            if records.count > 1 {\n                TCSLogErrorWithMark(\"More than one local user found for name.\")\n                throw DSQueryableErrors.multipleUsersFound\n            }\n            guard let record = records.first else {\n                TCSLogInfoWithMark(\"No local user found. Passing on demobilizing allow login.\")\n                throw DSQueryableErrors.notLocalUser\n            }\n            TCSLogWithMark(\"Found local user: \\(record)\")\n            return record\n        } catch {\n            TCSLogErrorWithMark(\"ODError while trying to check for local user: \\(error.localizedDescription)\")\n            throw error\n        }\n    }\n\n    \n    /// Searches DSLocal for an account short name and returns the `ODRecord` for the user if found.\n    ///\n    /// - Parameter shortName: The name of the user to search for as a `String`.\n    /// - Returns: The `ODRecord` of the user if one is found in DSLocal.\n    /// - Throws: Either an `ODFrameworkErrors` or a `DSQueryableErrors` if there is an error or the user is not local.\n    public class func getLocalRecord(_ shortName: String) throws -> ODRecord {\n        do {\n            TCSLogWithMark(\"Building OD query for name \\(shortName)\")\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: shortName,\n                                         returnAttributes: kODAttributeTypeNativeOnly,\n                                         maximumResults: 0)\n            let records = try query.resultsAllowingPartial(false) as! [ODRecord]\n\n            if records.count > 1 {\n                TCSLogErrorWithMark(\"More than one local user found for name.\")\n                throw DSQueryableErrors.multipleUsersFound\n            }\n            guard let record = records.first else {\n                TCSLogInfoWithMark(\"No local user found. Passing on demobilizing allow login.\")\n                throw DSQueryableErrors.notLocalUser\n            }\n            TCSLogWithMark(\"Found local user: \\(record)\")\n            return record\n        } catch {\n            TCSLogErrorWithMark(\"ODError while trying to check for local user: \\(error.localizedDescription)\")\n            throw error\n        }\n    }\n\n    /// Finds all local user records on the Mac.\n    ///\n    /// - Returns: A `Array` that contains the `ODRecord` for every account in DSLocal.\n    /// - Throws: An error from `ODFrameworkErrors` if something fails.\n    public class func getAllLocalUserRecords() throws -> [ODRecord] {\n        do {\n            let query = try ODQuery.init(node: localNode,\n                                         forRecordTypes: kODRecordTypeUsers,\n                                         attribute: kODAttributeTypeRecordName,\n                                         matchType: ODMatchType(kODMatchEqualTo),\n                                         queryValues: kODMatchAny,\n                                         returnAttributes: kODAttributeTypeAllAttributes,\n                                         maximumResults: 0)\n            return try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            TCSLogWithMark(\"ODError while finding local users.\")\n            throw error\n        }\n    }\n\n    /// Returns all the non-system users on a system above UID 500.\n    ///\n    /// - Returns: A `Array` that contains the `ODRecord` of all the non-system user accounts in DSLocal.\n    /// - Throws: An error from `ODFrameworkErrors` if something fails.\n    public func getAllNonSystemUsers() throws -> [ODRecord] {\n        do {\n            let allRecords = try PasswordUtils.getAllLocalUserRecords()\n            let nonSystem = try allRecords.filter { (record) -> Bool in\n                guard let uid = try record.values(forAttribute: kODAttributeTypeUniqueID) as? [String] else {\n                    return false\n                }\n                return Int(uid.first ?? \"\") ?? 0 > 500 && record.recordName.first != \"_\"\n            }\n            return nonSystem\n        } catch {\n            TCSLogWithMark(\"ODError while finding local users.\")\n            throw error\n        }\n    }\n}\n"
  },
  {
    "path": "XCreds/PrefKeys.swift",
    "content": "//\n//  PrefKeys.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport OSLog\nenum PrefKeys: String {\n    case clientID, clientSecret, ropgResponseValue, resource, password=\"xcreds local password\",discoveryURL, redirectURI, scopes, accessToken, idToken, refreshToken, tokenEndpoint, expirationDate, invalidToken, refreshRateHours,refreshRateMinutes, showDebug, verifyPassword, shouldShowQuitMenu, shouldShowPreferencesOnStart, shouldSetGoogleAccessTypeToOffline, shouldSetGoogleHDParam,passwordChangeURL, shouldUseADNativePasswordChangeMenuItem, shouldShowAboutMenu, username, idpHostName, passwordElementID, shouldFindPasswordElement, shouldShowSupportStatus,shouldShowConfigureWifiButton,shouldShowMacLoginButton, loginWindowBackgroundImageURL, loginWindowSecondaryMonitorsBackgroundImageURL, loginWindowBackgroundImageAlpha, loginWindowSecondaryMonitorsBackgroundAlpha, shouldShowCloudLoginByDefault, shouldPreferLocalLoginInsteadOfCloudLogin, idpHostNames,autoRefreshLoginTimer, loginWindowWidth, loginWindowHeight, shouldShowRefreshBanner, shouldSwitchToLoginWindowWhenLocked,accounts = \"Accounts\",\n         windowSignIn = \"WindowSignIn\", settingsOverrideScriptPath, localAdminUserName, localAdminPassword, usernamePlaceholder, passwordPlaceholder, shouldShowLocalOnlyCheckbox, shouldShowTokenUpdateStatus, shouldDetectNetworkToDetermineLoginWindow, showLoginWindowDelaySeconds, shouldPromptForMigration, shouldAllowKeyComboForMacLoginWindow, aliasName,claimsToAddToLocalUserAccount, loadPageTitle, loadPageInfo,shouldPromptForADPasswordChange, hideIfPathExists, allowedUsersArray, allowUsersClaim, mapKerberosPrincipalName, shouldUpdateKerberosUserPrincipalADDomain, mapFirstName = \"map_firstname\",mapFullName = \"map_fullname\", mapUserName = \"map_username\", mapLastName = \"map_lastname\",menuItemWindowBackgroundImageURL, menuItemWindowBackgroundImageAlpha, menuItems, shareMenuItemName, shouldShowSignInMenuItem, shouldLoginWindowBackgroundImageFillScreen,\n    shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen,resetPasswordDialogTitle, systemInfoButtonTitle, shouldShowShutdownButton, shouldShowRestartButton, shouldShowSystemInfoButton, shouldShowMenuBarSignInWithoutLoginWindowSignin, refreshBannerText,adUserAttributesToAddToLocalUserAccount, mapUID = \"map_uid\", allowLoginIfMemberOfGroup, keyCodeForLoginWindowChange, mapPasswordExpiry = \"map_password_expiry\", menuItemIconData, menuItemIconCheckedData, mapFullUserName = \"map_fullusername\", ccidSlotName, shouldSuppressLocalPasswordPrompt,shouldUseKillWhenLoginWindowSwitching, upnSuffixToDomainMappings,shouldAllowLoginCardSetup,accountLockedPasswordDialogTitle,accountLockedPasswordDialogText, OIDCLastLoginTimestamp, lastOIDCLoginFailTimestamp,loginWindowLogoPath, shouldHideLoginWindowLogo, shouldRemoveMenuItemAutoLaunch,primaryGroupID, skipUserSetupBuddy, shouldSkipFileVaultLogin, shouldSkipFileVaultLoginAdmin\n    case shouldUseROPGForPasswordChangeChecking\n    case shouldUseLDAPForPasswordChangeChecking\n    case shouldUseROPGForMenuLogin\n    case shouldUseBasicAuthWithROPG\n    case shouldUseROPGForLoginWindowLogin\n    case shouldActivateSystemInfoButton\n    case actionItemOnly = \"ActionItemOnly\"\n    case systemInfoAdditionsArray\n    case aDDomain = \"ADDomain\"\n    case aDSite = \"ADSite\"\n    case additionalADDomainList = \"AdditionalADDomains\"\n    case aDDomainController = \"ADDomainController\"\n    case allowEAPOL = \"AllowEAPOL\"\n    case allUserInformation = \"AllUserInformation\"\n    case autoAddAccounts = \"AutoAddAccounts\"\n    case autoConfigure = \"AutoConfigure\"\n    case autoRenewCert = \"AutoRenewCert\"\n    case changePasswordCommand = \"ChangePasswordCommand\"\n    case changePasswordType = \"ChangePasswordType\"\n    case changePasswordOptions = \"ChangePasswordOptions\"\n    case caribouTime = \"CaribouTime\"\n    case cleanCerts = \"CleanCerts\"\n    case configureChrome = \"ConfigureChrome\"\n    case configureChromeDomain = \"ConfigureChromeDomain\"\n    case customLDAPAttributes = \"CustomLDAPAttributes\"\n    case customLDAPAttributesResults = \"CustomLDAPAttributesResults\"\n    case deadLDAPKillTickets = \"DeadLDAPKillTickets\"\n//    case displayName = \"DisplayName\"\n    case dontMatchKerbPrefs = \"DontMatchKerbPrefs\"\n    case dontShowWelcome = \"DontShowWelcome\"\n    case dontShowWelcomeDefaultOn = \"DontShowWelcomeDefaultOn\"\n    case exportableKey = \"ExportableKey\"\n    case firstRunDone = \"FirstRunDone\"\n    case getCertAutomatically = \"GetCertificateAutomatically\"\n    case getHelpType = \"GetHelpType\"\n    case getHelpOptions = \"GetHelpOptions\"\n    case groups = \"Groups\"\n    case hicFix = \"HicFix\"\n    case hideAbout = \"HideAbout\"\n    case hideAccounts = \"HideAccounts\"\n    case hideExpiration = \"HideExpiration\"\n    case hideExpirationMessage = \"HideExpirationMessage\"\n    case hideCertificateNumber = \"HideCertificateNumber\"\n    case hideHelp = \"HideHelp\"\n    case hideGetSoftware = \"HideGetSoftware\"\n    case hideLastUser = \"HideLastUser\"\n    case hideLockScreen = \"HideLockScreen\"\n    case hideRenew = \"HideRenew\"\n    case hidePrefs = \"HidePrefs\"\n    case hideSignIn = \"HideSignIn\"\n    case hideTickets = \"HideTickets\"\n    case hideQuit = \"HideQuit\"\n    case hideSignOut = \"HideSignOut\"\n    case homeAppendDomain = \"HomeAppendDomain\"\n    case iconOff = \"IconOff\"\n    case iconOffDark = \"IconOffDark\"\n    case iconOn = \"IconOn\"\n    case iconOnDark = \"IconOnDark\"\n    case kerberosRealm = \"KerberosRealm\"\n    case keychainItems = \"KeychainItems\"\n    case keychainItemsInternet = \"KeychainItemsInternet\"\n    case keychainItemsCreateSerial = \"KeychainItemsCreateSerial\"\n    case keychainItemsDebug = \"KeychainItemsDebug\"\n    case keychainMinderWindowTitle = \"KeychainMinderWindowTitle\"\n    case keychainMinderWindowMessage = \"KeychainMinderWindowMessage\"\n    case keychainMinderShowReset = \"KeychainMinderShowReset\"\n    case keychainPasswordMatch = \"KeychainPasswordMatch\"\n    case lastCertificateExpiration = \"LastCertificateExpiration\"\n    case lightsOutIKnowWhatImDoing = \"LightsOutIKnowWhatImDoing\"\n    case loginComamnd = \"LoginComamnd\"\n    case loginItem = \"LoginItem\"\n    case ldapAnonymous = \"LDAPAnonymous\"\n    case lDAPSchema = \"LDAPSchema\"\n    case lDAPServerList = \"LDAPServerList\"\n    case lDAPServerListDeny = \"LDAPServerListDeny\"\n    case lDAPoverSSL = \"LDAPOverSSL\"\n    case lDAPOnly = \"LDAPOnly\"\n    case lDAPType = \"LDAPType\"\n    case localPasswordSync = \"LocalPasswordSync\"\n    case localPasswordSyncDontSyncLocalUsers = \"LocalPasswordSyncDontSyncLocalUsers\"\n    case localPasswordSyncDontSyncNetworkUsers = \"LocalPasswordSyncDontSyncNetworkUsers\"\n    case localPasswordSyncOnMatchOnly = \"LocalPasswordSyncOnMatchOnly\"\n    case lockedKeychainCheck = \"LockedKeychainCheck\"\n    case lastUser = \"LastUser\"\n    case lastPasswordWarning = \"LastPasswordWarning\"\n    case lastPasswordExpireDate = \"LastPasswordExpireDate\"\n    case loginLogo = \"LoginLogo\"\n    case menuAbout = \"MenuAbout\"\n    case menuAccounts = \"MenuAccounts\"\n    case menuActions = \"MenuActions\"\n    case menuChangePassword = \"MenuChangePassword\"\n    case menuHomeDirectory = \"MenuHomeDirectory\"\n    case menuGetCertificate = \"MenuGetCertificate\"\n    case menuGetHelp = \"MenuGetHelp\"\n    case menuGetSoftware = \"MenuGetSoftware\"\n    case menuFileServers = \"MenuFileServers\"\n    case menuPasswordExpires = \"MenuPasswordExpires\"\n    case menuPreferences = \"MenuPreferences\"\n    case menuRenewTickets = \"MenuRenewTickets\"\n    case menuSignIn = \"MenuSignIn\"\n    case menuSignOut = \"MenuSignOut\"\n    case menuTickets = \"MenuTickets\"\n    case menuUserName = \"MenuUserName\"\n    case menuWelcome = \"MenuWelcome\"\n    case menuQuit = \"MenuQuit\"\n    case menuIconColor = \"MenuIconColor\"\n    case menuIconColorDark = \"MenuIconColorDark\"\n    case messageLocalSync = \"MessageLocalSync\"\n    case messageNotConnected = \"MessageNotConnected\"\n    case messageUPCAlert = \"MessageUPCAlert\"\n    case messagePasswordChangePolicy = \"MessagePasswordChangePolicy\"\n    case mountSharesWithFinder = \"MountSharesWithFinder\"\n    case passwordExpirationDays = \"PasswordExpirationDays\"\n    case passwordExpireAlertTime = \"PasswordExpireAlertTime\"\n    case passwordExpireCustomAlert = \"PasswordExpireCustomAlert\"\n    case passwordExpireCustomWarnTime = \"PasswordExpireCustomWarnTime\"\n    case passwordExpireCustomAlertTime = \"PasswordExpireCustomAlertTime\"\n    case passwordPolicy = \"PasswordPolicy\"\n    case persistExpiration = \"PersistExpiration\"\n    case profileDone = \"ProfileDone\"\n    case profileWait = \"ProfileWait\"\n    case recursiveGroupLookup = \"RecursiveGroupLookup\"\n    case renewTickets = \"RenewTickets\"\n    case showHome = \"ShowHome\"\n    case secondsToRenew = \"SecondsToRenew\"\n    case selfServicePath = \"SelfServicePath\"\n    case shareReset = \"ShareReset\"        // clean listing of shares between runs\n    case signInCommand = \"SignInCommand\"\n    case signInWindowAlert = \"SignInWindowAlert\"\n    case signInWindowAlertTime = \"SignInWindowAlertTime\"\n    case signInWindowOnLaunch = \"SignInWindowOnLaunch\"\n    case signInWindowOnLaunchExclusions = \"SignInWindowOnLaunchExclusions\"\n    case signedIn = \"SignedIn\"\n    case signOutCommand = \"SignOutCommand\"\n    case singleUserMode = \"SingleUserMode\"\n    case siteIgnore = \"SiteIgnore\"\n    case siteForce = \"SiteForce\"\n    case slowMount = \"SlowMount\"\n    case slowMountDelay = \"SlowMountDelay\"\n    case stateChangeAction = \"StateChangeAction\"\n    case switchKerberosUser = \"SwitchKerberosUser\"\n    case template = \"Template\"\n    case titleSignIn = \"TitleSignIn\"\n    case uPCAlert = \"UPCAlert\"\n    case uPCAlertAction = \"UPCAlertAction\"\n    case userCN = \"UserCN\"\n    case userGroups = \"UserGroups\"\n    case userPrincipal = \"UserPrincipal\"\n    case userHome = \"UserHome\"\n    case userPasswordExpireDate = \"UserPasswordExpireDate\"\n    case userCommandTask1 = \"UserCommandTask1\"\n    case userCommandName1 = \"UserCommandName1\"\n    case userCommandHotKey1 = \"UserCommandHotKey1\"\n    case userPasswordSetDate = \"UserPasswordSetDate\"\n    case useKeychain = \"UseKeychain\"\n    case useKeychainPrompt = \"UseKeychainPrompt\"\n    case userAging = \"UserAging\"\n    case userAttributes = \"UserAttributes\"\n    case userEmail = \"UserEmail\"\n    case userFirstName = \"UserFirstName\"\n    case userFullName = \"UserFullName\"\n    case userLastName = \"UserLastName\"\n    case userLastChecked = \"UserLastChecked\"\n    case userShortName = \"UserShortName\"\n    case userSwitch = \"UserSwitch\"\n    case userUPN = \"UserUPN\"\n    case verbose = \"Verbose\"\n    case wifiNetworks = \"WifiNetworks\"\n    case x509CA = \"X509CA\"\n    case x509Name = \"X509Name\"\n\n}\nfunc getManagedPreference(key: Preferences) -> Any? {\n\n\n    if let preference = DefaultsOverride.standardOverride.value(forKey: key.rawValue)  {\n        os_log(\"Found managed preference: %{public}@\", type: .debug, key.rawValue)\n        return preference\n    }\n\n\n    return nil\n}\n\n\nenum Preferences: String {\n\n    /// The desired AD domain as a `String`.\n    case ADDomain\n    /// Allows appending of other domains at the loginwindow. Set as a `Bool` to allow any, or as an Array of Strings to whitelist\n    case AdditionalADDomains\n    /// list of domains to show in the domain pull down\n    case AdditionalADDomainList\n    /// add user's NT domain name as an alias to newly created accounts\n    case AliasNTName\n    /// add user's UPN as an alias to newly created accounts\n    case AliasUPN\n    /// Allow network select button on login window\n    case AllowNetworkSelection\n    /// Allow network text\n    case AllowNetworkText\n    /// A filesystem path to a background image as a `String`.\n    case BackgroundImage\n    /// An image to display as the background image as a Base64 encoded `String`.\n    case BackgroundImageData\n    /// The alpha value of the background image as an `Int`.\n    case BackgroundImageAlpha\n    /// Should new users be created as local administrators? Set as a `Bool`.\n    case CreateAdminUser\n    /// List of groups that should have its members created as local administrators. Set as an Array of Strings of the group name.\n    case CreateAdminIfGroupMember\n    /// Should existing mobile accounts be converted into plain local accounts? Set as a `Bool`.\n    case CustomNoMADLocation\n    /// If defined it specifies the custom location of the application to be given access to the keychain item. Set as a `String`\n    ///\n    case CustomLDAPAttributes\n    case DemobilizeUsers\n    /// Should we always have a password already set up before demobilizing\n    case DemobilizeForcePasswordCheck\n    /// Should we preserve the AltSecurityIdentities OD attribute during demobilization\n    case DemobilizeSaveAltSecurityIdentities\n    /// Dissallow local auth, and always do network authentication\n    case DenyLocal\n    /// Users to allow locally when DenyLocal is on\n    case DenyLocalExcluded\n    /// List of groups that should have it's members allowed to sign in. Set as an Array of Strings of the group name\n    case DenyLoginUnlessGroupMember\n    /// Defines which system inforation should be showed by default. Set as `String`.\n    case DefaultSystemInformation\n    /// Should FDE be enabled at first login on APFS disks? Set as a `Bool`.\n    case EnableFDE\n    /// Should the PRK be saved to disk for the MDM Escrow Service to collect? Set as a `Bool`.\n    case EnableFDERecoveryKey\n    // Specify a custom path for the recovery key\n    case EnableFDERecoveryKeyPath\n    // Should we rotate the PRK\n    case EnableFDERekey\n    /// Path for where the EULA acceptance info goes\n    case EULAPath\n    /// Text for EULA as a `String`.\n    case EULAText\n    /// Headline for EULA as a `String`.\n    case EULATitle\n    /// Subhead for EULA as a `String`.\n    case EULASubTitle\n    /// Allow for guest accounts\n    case GuestUser\n    /// the accounts to allow as an array of strings\n    case GuestUserAccounts\n    /// where to put the guest user password\n    case GuestUserAccountPasswordPath\n    /// First name for the guest user\n    case GuestUserFirst\n    /// Last name for  the guest user\n    case GuestUserLast\n    /// Ignore sites in AD. This is a compatibility measure for AD installs that have issues with sites. Set as a `Bool`.\n    case IgnoreSites\n    /// Adds a NoMAD entry into the keychain. `Bool` value.\n    case KeychainAddNoMAD\n    /// Should NoLo create a Keychain if it doesn't exist. `Bool` value.\n    case KeychainCreate\n    /// Should NoLo reset the Keychain if the login pass doesn't match. `Bool` value.\n    case KeychainReset\n    /// Force LDAP lookups to use SSL connections. Requires certificate trust be established. Set as a `Bool`.\n    case LDAPOverSSL\n    /// Force specific LDAP servers instead of finding them via DNS\n    case LDAPServers\n    /// Fallback to local auth if the network is not available\n    case LocalFallback\n    /// A filesystem path to an image to display on the login screen as a `String`.\n    case LoginLogo\n    /// Alpha value for the login logo\n    case LoginLogoAlpha\n    /// A Base64 encoded string of an image to display on the login screen.\n    case LoginLogoData\n    /// Should NoLo display a macOS-style login screen instead of a window? Set as a `Bool`,\n    case LoginScreen\n    /// If the create User mech should manage the SecureTokens with a service account\n    case ManageSecureTokens\n    /// If Notify should add additional logging\n    case NotifyLogStyle\n    /// NT Domain to AD domain mappings\n    case NTtoADDomainMappings\n    /// should we migrate users?\n    case Migrate\n    /// should we hide users when we migrate?\n    case MigrateUsersHide\n    /// If the powercontrol options should be disabled in the SignIn UI\n    case PowerControlDisabled\n    /// should we recursively looku groups at login\n    case RecursiveGroupLookup\n    /// Path to script to run, currently only one script path can be used, if you want to run this multiple times, keep the logic in your script\n    case ScriptPath\n    /// Arguments for the script, if any\n    case ScriptArgs\n    /// Should NoMAD Login enable all users that login with with a secure token as a `Bool`\n    case SecureTokenManagementEnableOnlyAdminUsers\n    /// Path of the icon to be used for the Secure Token management user as `String`\n    case SecureTokenManagementIconPath\n    /// Should NoMAD Login only enable the first admin user that login with with a secure token as a `Bool`\n    case SecureTokenManagementOnlyEnableFirstUser\n    /// Full Name of the Secure Token Management user as a `String`\n    case SecureTokenManagementFullName\n    /// The UID to use for the Management Account as a `Int` or `String`\n    case SecureTokenManagementUID\n    /// The location to save and read the Secure Token management password as a `String`\n    case SecureTokenManagementPasswordLocation\n    /// Length fo the SecureToken Management User's password as an `Int`\n    case SecureTokenManagementPasswordLength\n    /// Username to use to for the securetoken management account as a `String`\n    case SecureTokenManagementUsername\n    /// Tool to use for UID numbers\n    case UIDTool\n    /// Use the CN from AD as the full name\n    case UseCNForFullName\n    /// A string to show as the placeholder in the Username textfield\n    case UseCNForFullNameFallback\n    /// Uses the CN as the fullname on the account when the givenName and sn fields are blank\n    case UserProfileImage\n\n    case NormalWindowLevel\n    //UserInput bits\n\n    case UserInputOutputPath\n    case UserInputUI\n    case UserInputLogo\n    case UserInputTitle\n    case UserInputMainText\n\n    //Messages\n\n    case MessagePasswordSync // what to show when the password needs to sync\n\n    //Password update keys\n\n    case PasswordOverwriteSilent // will silently update user password to new one\n    case PasswordOverwriteOptional // allow the user to stomp on the password if interested\n\n}\n\n"
  },
  {
    "path": "XCreds/PreferencesWindow.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"PreferencesWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"window\" destination=\"e3r-XM-xJP\" id=\"3Kl-qd-Sux\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"5Ar-2a-lNk\"/>\n        <window title=\"Settings\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"e3r-XM-xJP\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"560\" y=\"551\" width=\"494\" height=\"173\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1728\" height=\"1079\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"ZbF-tC-vpZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"494\" height=\"173\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"h4y-Ta-Cvg\">\n                        <rect key=\"frame\" x=\"23\" y=\"150\" width=\"90\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"DiscoveryURL\" id=\"lS2-NV-sCW\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"B0L-lU-7n3\">\n                        <rect key=\"frame\" x=\"57\" y=\"123\" width=\"56\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Client ID\" id=\"JyJ-Id-S9x\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cBA-rI-7yf\">\n                        <rect key=\"frame\" x=\"119\" y=\"147\" width=\"355\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"9Si-gZ-wo5\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                        <connections>\n                            <binding destination=\"5Ar-2a-lNk\" name=\"value\" keyPath=\"values.discoveryURL\" id=\"6Ds-MA-qon\">\n                                <dictionary key=\"options\">\n                                    <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                </dictionary>\n                            </binding>\n                        </connections>\n                    </textField>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ie3-c5-0dg\">\n                        <rect key=\"frame\" x=\"119\" y=\"123\" width=\"355\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"pgf-ba-xBF\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                        <connections>\n                            <binding destination=\"5Ar-2a-lNk\" name=\"value\" keyPath=\"values.clientID\" id=\"Qd7-Zh-x2k\">\n                                <dictionary key=\"options\">\n                                    <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                </dictionary>\n                            </binding>\n                        </connections>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w8t-7e-YPb\">\n                        <rect key=\"frame\" x=\"183\" y=\"13\" width=\"114\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Clear Tokens\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"858-M5-Ev6\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"clearTokensClicked:\" target=\"-2\" id=\"G8D-at-l6q\"/>\n                        </connections>\n                    </button>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6cE-Yr-0bd\">\n                        <rect key=\"frame\" x=\"23\" y=\"96\" width=\"210\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Check for password change every\" id=\"bZ8-Xb-oG5\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"exK-od-VQg\">\n                        <rect key=\"frame\" x=\"239\" y=\"93\" width=\"51\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"oP1-XG-OoD\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                        <connections>\n                            <binding destination=\"5Ar-2a-lNk\" name=\"value\" keyPath=\"values.refreshRateHours\" id=\"cW0-SZ-EbD\">\n                                <dictionary key=\"options\">\n                                    <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                </dictionary>\n                            </binding>\n                        </connections>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Yzp-d3-Q7K\">\n                        <rect key=\"frame\" x=\"296\" y=\"96\" width=\"39\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"hours\" id=\"R3c-k5-x0H\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VNl-22-uJH\">\n                        <rect key=\"frame\" x=\"23\" y=\"71\" width=\"217\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Show Debug Push Notifications\" bezelStyle=\"regularSquare\" imagePosition=\"left\" enabled=\"NO\" state=\"on\" inset=\"2\" id=\"dRK-Of-hFQ\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <binding destination=\"5Ar-2a-lNk\" name=\"value\" keyPath=\"values.showDebug\" id=\"iii-t8-C2h\">\n                                <dictionary key=\"options\">\n                                    <bool key=\"NSConditionallySetsEnabled\" value=\"NO\"/>\n                                </dictionary>\n                            </binding>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SZG-WX-diX\">\n                        <rect key=\"frame\" x=\"23\" y=\"49\" width=\"451\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Require Cloud Password Confirmation before changing local password\" bezelStyle=\"regularSquare\" imagePosition=\"left\" enabled=\"NO\" state=\"on\" inset=\"2\" id=\"369-w0-EY8\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <binding destination=\"5Ar-2a-lNk\" name=\"value\" keyPath=\"values.verifyPassword\" id=\"P6X-Nx-bJM\">\n                                <dictionary key=\"options\">\n                                    <bool key=\"NSConditionallySetsEnabled\" value=\"NO\"/>\n                                </dictionary>\n                            </binding>\n                        </connections>\n                    </button>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"gvt-4q-n77\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"191\" y=\"192\"/>\n        </window>\n        <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" id=\"dXE-Xt-nIV\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"90\" height=\"16\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"DiscoveryURL\" id=\"1hp-g2-T6a\">\n                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n            </textFieldCell>\n            <point key=\"canvasLocation\" x=\"49\" y=\"340\"/>\n        </textField>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/PreferencesWindowController.swift",
    "content": "//\n//  PreferencesWindowController.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\n\nclass PreferencesWindowController: NSWindowController {\n\n    @IBOutlet weak var clearTokenButton: NSButton!\n\n    @objc override var windowNibName: NSNib.Name {\n        return NSNib.Name(\"PreferencesWindow\")\n    }\n    @available(macOS, deprecated: 11)\n    @IBAction func clearTokensClicked(_ sender: Any) {\n        let keychainUtil = KeychainUtil()\n        let _ = keychainUtil.findAndDelete(serviceName:\"xcreds\",accountName:PrefKeys.accessToken.rawValue)\n        let _ = keychainUtil.findAndDelete(serviceName:\"xcreds\",accountName:PrefKeys.idToken.rawValue)\n        let _ = keychainUtil.findAndDelete(serviceName:\"xcreds\",accountName:PrefKeys.refreshToken.rawValue)\n\n\n//        sharedMainMenu.signedIn=false\n//        sharedMainMenu.buildMenu()\n    }\n\n}\n"
  },
  {
    "path": "XCreds/ScheduleManager.swift",
    "content": "//\n//  ScheduleManager.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\nimport Cocoa\nimport OIDCLite\n@available(macOS, deprecated: 11)\nclass ScheduleManager:NoMADUserSessionDelegate {\n\n    func invalidCredentials() {\n        feedbackDelegate?.invalidCredentials()\n\n    }\n\n    func credentialsUpdated(_ credentials: Creds) {\n        feedbackDelegate?.credentialsUpdated(credentials)\n    }\n\n\n    func tokenError(_ err: String) {\n        TCSLogErrorWithMark(\"authFailure: \\(err)\")\n        feedbackDelegate?.credentialsCheckFailed()\n        XCredsAudit().auditError(err)\n//        //        NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[:])\n//        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.showDebug.rawValue) == true {\n//\n//            NotifyManager.shared.sendMessage(message: \"Password changed or not set\")\n//        }\n//        DispatchQueue.main.async {\n//\n////            sharedMainMenu.signInMenuItem.showSigninWindow()\n//        }\n\n    }\n\n    var session:NoMADSession?\n\n    var feedbackDelegate:UpdateCredentialsFeedbackProtocol?\n//    static let shared=ScheduleManager()\n    var tokenManager=TokenManager()\n    var nextADCheckTime = Date()\n    var nextTokenCheckTime = Date()\n\n    var timer:Timer?\n    var kerberosPassword:String?\n\n    enum CheckTimer {\n        case ADTimer\n        case TokenTimer\n    }\n//    var feedbackDelegate:TokenManagerFeedbackDelegate?\n    func setNextCheckTime(timer:CheckTimer) {\n        var rate = DefaultsOverride.standardOverride.double(forKey: PrefKeys.refreshRateHours.rawValue)\n        var minutesRate = DefaultsOverride.standardOverride.double(forKey: PrefKeys.refreshRateMinutes.rawValue)\n\n        if minutesRate < 0 {\n            minutesRate=0\n        }\n\n        else if minutesRate > 60 {\n            minutesRate=60\n        }\n        if rate < 0 {\n            rate = 0\n        }\n        else if rate > 168 {\n            rate = 168\n        }\n        if rate == 0 && minutesRate == 0 {\n\n            rate=3\n        }\n        switch timer {\n\n        case .ADTimer:\n            nextADCheckTime = Date(timeIntervalSinceNow: (rate*60+minutesRate)*60)\n\n        case .TokenTimer:\n            nextTokenCheckTime = Date(timeIntervalSinceNow: (rate*60+minutesRate)*60)\n\n        }\n\n    }\n    func checkADPasswordExpire(password:String) {\n        TCSLogWithMark()\n\n        let adDomainFromPrefs = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue)\n        var allDomainsFromPrefs = DefaultsOverride.standardOverride.array(forKey: PrefKeys.additionalADDomainList.rawValue)  as? [String] ?? []\n\n        if let adDomainFromPrefs=adDomainFromPrefs  {\n            allDomainsFromPrefs.append(adDomainFromPrefs)\n        }\n        allDomainsFromPrefs = allDomainsFromPrefs.map { currVal in\n            currVal.uppercased()\n        }\n\n        guard let user = try? PasswordUtils.getLocalRecord(getConsoleUser()),\n              let kerbPrincArray = user.value(forKey: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? Array <String>,\n              var kerbPrinc = kerbPrincArray.first else\n        {\n            return\n        }\n        if kerbPrinc.contains(\"@\") == false, let adDomainFromPrefs = adDomainFromPrefs {\n            kerbPrinc = kerbPrinc + \"@\" + adDomainFromPrefs.stripped\n        }\n\n        if allDomainsFromPrefs.count>0,\n           let shortName = kerbPrinc.components(separatedBy: \"@\").first,\n            let specifiedDomain = kerbPrinc.components(separatedBy: \"@\").last,\n            specifiedDomain.isEmpty==false,\n            shortName.isEmpty==false,\n           allDomainsFromPrefs.contains(specifiedDomain.uppercased())==true\n        {\n            session = NoMADSession.init(domain: specifiedDomain, user: shortName)\n            TCSLogWithMark(\"NoMAD Login User: \\(shortName), Domain: \\(specifiedDomain)\")\n            guard let session = session else {\n                TCSLogErrorWithMark(\"Could not create NoMADSession from SignIn window\")\n                return\n            }\n\n            session.useSSL = getManagedPreference(key: .LDAPOverSSL) as? Bool ?? false\n            session.userPass = password\n            session.delegate = self\n            session.recursiveGroupLookup = getManagedPreference(key: .RecursiveGroupLookup) as? Bool ?? false\n\n            if let ignoreSites = getManagedPreference(key: .IgnoreSites) as? Bool {\n\n                session.siteIgnore = ignoreSites\n            }\n\n            if let ldapServers = getManagedPreference(key: .LDAPServers) as? [String] {\n                TCSLogWithMark(\"Adding custom LDAP servers\")\n\n                session.ldapServers = ldapServers\n            }\n\n            TCSLogWithMark(\"Attempt to authenticate user\")\n            session.authenticate()\n        }\n\n\n    }\n    func startCredentialCheck()  {\n        TCSLogWithMark()\n\n        //                NotificationCenter.default.post(name: NSNotification.Name(\"KerberosPasswordChanged\"), object: [\"updatedPassword\":newPassword])\n\n\n        NotificationCenter.default.addObserver(forName: NSNotification.Name(\"KerberosPasswordChanged\"), object: nil, queue: .main, using: { notification in\n            if let newPassword = notification.object as? [String:String],\n                let newPassword = newPassword[\"updatedPassword\"] {\n                TCSLogWithMark(\"new kerb password received:\")\n                self.kerberosPassword=newPassword\n            }\n        })\n\n        if let timer = timer, timer.isValid==true {\n            return\n        }\n\n        nextADCheckTime=Date()\n        nextTokenCheckTime=Date()\n\n        timer=Timer.scheduledTimer(withTimeInterval: 30, repeats: true, block: { timer in //check every 30 seconds\n            self.checkToken()\n        })\n        self.checkToken()\n    }\n    func stopCredentialCheck()  {\n        if let timer = timer, timer.isValid==true {\n            timer.invalidate()\n\n        }\n    }\n    func checkKerberosTicket(){\n        let domainName = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue)\n\n\n        if let _ = domainName, let kerberosPassword = kerberosPassword {\n            TCSLogWithMark(\"checking for kerberos ticket\")\n            checkADPasswordExpire(password: kerberosPassword)\n        }\n        else {\n            TCSLogWithMark(\"not checking for kerberos ticket\")\n        }\n\n    }\n    func checkToken()  {\n        TCSLogWithMark(\"checking token if needed\")\n        if nextADCheckTime>Date()  && nextTokenCheckTime > Date() {\n            TCSLogWithMark(\"Not time to check yet. AD Token will be checked at \\(nextADCheckTime) and OIDC token will be checked at \\(nextTokenCheckTime)\")\n            return\n        }\n        if nextADCheckTime<Date(){\n            setNextCheckTime(timer:.ADTimer)\n            checkKerberosTicket()\n        }\n\n        if  nextTokenCheckTime<Date(){\n            setNextCheckTime(timer:.TokenTimer)\n\n            TCSLogWithMark(\"checking for oidc tokens if we have a refresh token and oidc is configured.\")\n\n            let keychainUtil = KeychainUtil()\n\n            let passwordItem =  keychainUtil.findPassword(serviceName: \"xcreds \".appending(PrefKeys.refreshToken.rawValue),accountName:PrefKeys.refreshToken.rawValue)\n            var hasValidRefreshToken = false\n\n            if  let _ = DefaultsOverride.standardOverride.string(forKey: PrefKeys.discoveryURL.rawValue),\n                let refreshAccountAndToken = passwordItem,\n                let refreshToken = passwordItem?.password,\n                    refreshToken != \"\"  {\n                hasValidRefreshToken = true\n            }\n            if hasValidRefreshToken ||\n                DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForPasswordChangeChecking.rawValue) ||\n                DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseLDAPForPasswordChangeChecking.rawValue)\n            {\n\n                TCSLogWithMark(\"We have a refresh token or are using ROPG/LDAP for menu login.\")\n\n                //check to make sure we are not in an error state\n                let dateFormatter = ISO8601DateFormatter()\n                dateFormatter.formatOptions = [.withFullDate,.withFullTime]\n\n\n                var isLoginInFailedState = false\n                let ud = UserDefaults.standard\n                //\n                if let _ = ud.string(forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue){\n                    isLoginInFailedState=true\n                    TCSLogWithMark(\"We have a prior failed login attempt.\")\n                }\n                TCSLogWithMark(\"Checking to see if the login window was successful after the last failed attempt. If so, we can go ahead and try to authenticate.\")\n\n                if let lastOIDCLoginFailTimestampString = ud.string(forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue),\n                   let lastOIDCLoginFailTimestampDate = try? Date.ISO8601FormatStyle().parseStrategy.parse(lastOIDCLoginFailTimestampString ) {\n\n\n                        //last login failed. We can proceed only if there was a successful login at the login window.\n                        if let user = try? PasswordUtils.getLocalRecord(getConsoleUser()),\n                           let oidcLastLoginTimestampStringFromDSArray = user.value(forKey: \"dsAttrTypeNative:_xcreds_oidc_lastLoginTimestamp\") as? [String],\n                           let oidcLastLoginTimestampStringFromDS = oidcLastLoginTimestampStringFromDSArray.first,\n                           let oidcLastLoginTimestameDateFromLoginWindow = try? Date.ISO8601FormatStyle().parseStrategy.parse(oidcLastLoginTimestampStringFromDS),\n                           oidcLastLoginTimestameDateFromLoginWindow > lastOIDCLoginFailTimestampDate {\n\n                            TCSLogWithMark(\"Login success at login window so we can go ahead and try to authenticate.\")\n\n\n                            isLoginInFailedState=false\n\n                        }\n                    }\n                    if isLoginInFailedState==true {\n                        TCSLogWithMark(\"***** Invalid credentials from prior attempts. Prompting user ******\")\n\n                        feedbackDelegate?.invalidCredentials()\n                        return\n                    }\n\n                Task{\n                    if hasValidRefreshToken || DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForPasswordChangeChecking.rawValue) == true {\n                    do{\n                        try await tokenManager.oidc().getEndpoints()\n                        TCSLogWithMark(\"requesting new access token\")\n                        let tokenResponse = try await tokenManager.getNewAccessToken()\n                        TCSLogWithMark(\"success. Setting new token.\")\n                        ud.removeObject(forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue)\n\n                        feedbackDelegate?.credentialsUpdated(Creds(accessToken: tokenResponse?.accessToken, idToken: tokenResponse?.idToken, refreshToken: tokenResponse?.refreshToken, password:tokenResponse?.password, jsonDict: [:]))\n                    }\n                        catch let error  {\n                            \n                            TCSLogWithMark(\"Error\")\n                            switch error {\n                                \n                            case OIDCLiteError.authFailure(let mesg):\n                                TCSLogWithMark(\"invalid credentials: \\(mesg)\")\n                                TCSLogWithMark(\"Setting last failed login timestamp to now.\")\n                                \n                                ud.setValue(ISO8601DateFormatter().string(from: Date()), forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue)\n                                feedbackDelegate?.invalidCredentials()\n                                \n                            default:\n                                TCSLogWithMark(\"Delaying check for oidc tokens because endpoints are not available yet. Error: \\(error)\")\n                                nextTokenCheckTime=Date.distantPast\n                                \n                            }\n                        }\n                    }\n                    else if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseLDAPForPasswordChangeChecking.rawValue) == true {\n                        let localCredFromKeychain =  keychainUtil.findPassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue)\n\n                    \n                        guard let username = tokenManager.currOidcUsername(), let password  = localCredFromKeychain?.password else {\n                            TCSLogWithMark(\"no oidc username or password found so punting on checking via LDAP\")\n                            return\n                        }\n                        TCSLogWithMark(\"Checking password via Google LDAP\")\n\n                        switch GoogleLDAP().verifyPasswordGoogleLDAP(username: username, password: password) {\n                            \n                        \n                        case .PasswordValid:\n                            TCSLogWithMark(\"Password Valid\")\n\n                            feedbackDelegate?.credentialsUpdated(Creds(accessToken: nil, idToken: nil, refreshToken: nil, password:password, jsonDict: [:]))\n\n                        case .PasswordInvalid:\n                            TCSLogWithMark(\"invalid credentials via ldap\")\n                            TCSLogWithMark(\"Setting last failed login timestamp to now.\")\n                            \n                            ud.setValue(ISO8601DateFormatter().string(from: Date()), forKey: PrefKeys.lastOIDCLoginFailTimestamp.rawValue)\n                            feedbackDelegate?.invalidCredentials()\n                            \n\n                        case .OtherError:\n                            TCSLogWithMark(\"Delaying check for ldap didn't get success or failure.\")\n                            nextTokenCheckTime=Date.distantPast\n\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    func NoMADAuthenticationSucceeded() {\n        TCSLogWithMark()\n        if let userPrinc = session?.userPrincipal {\n            TCTaskHelper.shared().runCommand(\"/usr/bin/kswitch\", withOptions: [\"-p\", userPrinc])\n//            let _ = cliTask(\"/usr/bin/kswitch -p \" +  userPrinc)\n        }\n        feedbackDelegate?.kerberosTicketUpdated()\n        session?.userInfo()\n    }\n\n    func NoMADAuthenticationFailed(error: NoMADSessionError, description: String) {\n        TCSLogErrorWithMark(\"AuthenticationFailed:\\(description)\")\n        switch error {\n\n        case .OffDomain:\n            nextADCheckTime=Date.distantPast\n        default:\n            break\n        }\n        feedbackDelegate?.kerberosTicketCheckFailed(error)\n    }\n\n    func NoMADUserInformation(user: ADUserRecord) {\n        TCSLogWithMark(\"AD user password expires: \\(user.passwordExpire?.description ?? \"unknown\")\")\n\n\n        let dateFormatter = DateFormatter()\n\n        dateFormatter.locale = Locale.current\n        dateFormatter.dateStyle = .medium\n        dateFormatter.timeStyle = .short\n        if let passExpired = user.passwordExpire {\n//            let dateString = dateFormatter.string(from: passExpired)\n            feedbackDelegate?.passwordExpiryUpdate(passExpired)\n            feedbackDelegate?.adUserUpdated(user)\n\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "XCreds/SecurityPrivateAPI.h",
    "content": "//\n//  SecurityPrivateAPI.h\n//  NoMAD\n//\n//  Created by Phillip Boushy on 4/26/16.\n//  Copyright © 2016 Trusource Labs. All rights reserved.\n//\n\n#ifndef SecurityPrivateAPI_h\n#define SecurityPrivateAPI_h\n\n// So we can use SecKeychainChangePassword() \n#import <Security/Security.h>\nextern OSStatus SecKeychainChangePassword(SecKeychainRef keychainRef, UInt32 oldPasswordLength, const void* oldPassword, UInt32 newPasswordLength, const void* newPassword);\n\nOSStatus SecKeychainLogin(UInt32 nameLength, const void* name, UInt32 passwordLength, const void* password);\n\n#endif /* SecurityPrivateAPI_h */\n"
  },
  {
    "path": "XCreds/SelectLocalAccountWindowController.swift",
    "content": "//\n//  VerifyLocalCredentialsWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 11/25/23.\n//\n\nimport Cocoa\n\nclass SelectLocalAccountWindowController: NSWindowController, NSWindowDelegate {\n\n    @IBOutlet weak private var usernameTextField: NSTextField!\n    @IBOutlet weak private var passwordTextField: NSSecureTextField!\n    @IBOutlet weak private var createNewAccountButton: NSButton!\n\n    var username:String?\n    var password:String?\n    var shouldCreateNewAccount:Bool?=false\n    var shouldShowCreateNewAccountButton:Bool?=true\n\n    enum VerifyLocalCredentialsResult {\n        case successful(String)\n        case canceled\n        case createNewAccount\n        case error(String)\n    }\n    static func selectLocalAccountAndUpdate(newPassword:String) -> VerifyLocalCredentialsResult{\n        let verifyLocalCredentialsWindowController = SelectLocalAccountWindowController.init(windowNibName: NSNib.Name(\"SelectLocalAccountWindowController\"))\n        verifyLocalCredentialsWindowController.window?.canBecomeVisibleWithoutLogin=true\n        verifyLocalCredentialsWindowController.window?.isMovable = false\n        verifyLocalCredentialsWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n        var isDone = false\n        while (!isDone){\n            DispatchQueue.main.async{\n                TCSLogWithMark(\"resetting level\")\n                verifyLocalCredentialsWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n            }\n\n            let response = NSApp.runModal(for: verifyLocalCredentialsWindowController.window!)\n            verifyLocalCredentialsWindowController.window?.close()\n            if response == .cancel {\n                isDone=true\n                TCSLogWithMark(\"User cancelled. Denying login\")\n//                mechanism.denyLogin(message:nil)\n                return .canceled\n\n            }\n            let localUsername = verifyLocalCredentialsWindowController.username\n            let localPassword = verifyLocalCredentialsWindowController.password\n            let shouldCreateNewAccount = verifyLocalCredentialsWindowController.shouldCreateNewAccount\n\n\n            guard let localUsername = localUsername, let localPassword = localPassword, let shouldCreateNewAccount = shouldCreateNewAccount else {\n                TCSLogWithMark(\"local username, password or shouldCreateNewAccount not set\")\n//                mechanism.denyLogin(message:nil)\n                return .canceled\n            }\n            if shouldCreateNewAccount == false {\n                let isValidPassword = PasswordUtils.isLocalPasswordValid(userName: localUsername, userPass: localPassword)\n                switch isValidPassword {\n                case .success:\n                    isDone = true\n                   let localUser = try? PasswordUtils.getLocalRecord(localUsername)\n                    guard let localUser = localUser else {\n\n                        isDone = true\n                        TCSLogErrorWithMark(\"localUser is not set\")\n                        return .error(\"local user not set\")\n\n                    }\n                    do {\n                        TCSLogWithMark(\"Changing password\")\n                        if localPassword == newPassword {\n                            TCSLogWithMark(\"cloud password is already the local password.\")\n\n                            return .successful(localUsername)\n                        }\n                        try localUser.changePassword(localPassword, toPassword: newPassword)\n\n                        TCSLogWithMark(\"local password set successfully to network / cloud password\")\n                        return .successful(localUsername)\n\n                    }\n                    catch {\n                        TCSLogErrorWithMark(\"Error setting local password to cloud password\")\n                        return .error(\"Error setting local password to cloud password\")\n                    }\n\n                case .accountLocked:\n                    TCSLogErrorWithMark(\"Account Locked\")\n                case .incorrectPassword: //don't return b/c we just loop and ask again\n                    TCSLogErrorWithMark(\"Incorrect Password\")\n\n                case .accountDoesNotExist:\n                    TCSLogErrorWithMark(\"Account \\(localUsername) does not exist\")\n\n                case .other(let err):\n                    isDone = true\n                    TCSLogErrorWithMark(\"Other err: \\(err)\")\n                    return .error(err)\n\n\n                }\n            }\n            else {\n                isDone = true\n                return .createNewAccount\n            }\n        }\n\n    }\n    override func windowDidLoad() {\n        super.windowDidLoad()\n        if let shouldShowCreateNewAccountButton = shouldShowCreateNewAccountButton{\n            createNewAccountButton.isHidden = !shouldShowCreateNewAccountButton\n        }\n\n    }\n    func windowDidBecomeKey(_ notification: Notification) {\n        if let shouldShowCreateNewAccountButton = shouldShowCreateNewAccountButton{\n            createNewAccountButton.isHidden = !shouldShowCreateNewAccountButton\n        }\n\n    }\n\n    @IBAction func okButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            username = usernameTextField.stringValue\n            password=passwordTextField.stringValue\n            NSApp.stopModal(withCode: .OK)\n\n        }\n\n    }\n    @IBAction func cancelButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            NSApp.stopModal(withCode: .cancel)\n        }\n\n    }\n    @IBAction func createNewAccountButtonPressed(_ sender: Any) {\n        shouldCreateNewAccount=true\n        username = \"\"\n        password = \"\"\n        if self.window?.isModalPanel==true {\n            NSApp.stopModal(withCode: .OK)\n\n        }\n    }\n}\n"
  },
  {
    "path": "XCreds/SelectLocalAccountWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"SelectLocalAccountWindowController\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"createNewAccountButton\" destination=\"7Ug-nA-fDT\" id=\"bI2-wP-dse\"/>\n                <outlet property=\"passwordTextField\" destination=\"Cn6-Sr-4P4\" id=\"lzh-df-Qkw\"/>\n                <outlet property=\"usernameTextField\" destination=\"pxh-m5-P6y\" id=\"0Ju-7W-uFJ\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Local Credentials\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"198\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <value key=\"minSize\" type=\"size\" width=\"480\" height=\"198\"/>\n            <value key=\"maxSize\" type=\"size\" width=\"480\" height=\"198\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"198\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZZX-XH-fjB\">\n                        <rect key=\"frame\" x=\"34\" y=\"82\" width=\"66\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Password:\" id=\"rUt-ss-qKo\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Cn6-Sr-4P4\">\n                        <rect key=\"frame\" x=\"106\" y=\"79\" width=\"309\" height=\"21\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"scW-MH-3py\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                    </secureTextField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wo9-Dj-FEZ\">\n                        <rect key=\"frame\" x=\"30\" y=\"111\" width=\"70\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Username:\" id=\"Ojt-X8-n4q\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"08F-oQ-5uA\">\n                        <rect key=\"frame\" x=\"18\" y=\"135\" width=\"444\" height=\"43\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"43\" id=\"GUN-ht-5Os\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"Enter in the username and password for an existing local user account:\" id=\"lqa-a3-ueN\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nQ2-zF-cDA\">\n                        <rect key=\"frame\" x=\"381\" y=\"13\" width=\"86\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"OLF-AL-cUU\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"72\" id=\"n7f-Es-V9U\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"okButtonPressed:\" target=\"-2\" id=\"0SQ-Fh-w9W\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dOG-kc-J9Z\">\n                        <rect key=\"frame\" x=\"297\" y=\"13\" width=\"86\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ves-vV-33n\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"72\" id=\"5IC-ar-JhB\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"2bh-OB-agN\"/>\n                        </connections>\n                    </button>\n                    <textField verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pxh-m5-P6y\">\n                        <rect key=\"frame\" x=\"106\" y=\"108\" width=\"309\" height=\"21\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"edT-ab-4tW\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7Ug-nA-fDT\">\n                        <rect key=\"frame\" x=\"13\" y=\"13\" width=\"159\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Create New Account\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"ORW-cO-U6m\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"createNewAccountButtonPressed:\" target=\"-2\" id=\"Qfz-lh-9Rq\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"dOG-kc-J9Z\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"7g8-7m-rzg\"/>\n                    <constraint firstItem=\"08F-oQ-5uA\" firstAttribute=\"trailing\" secondItem=\"nQ2-zF-cDA\" secondAttribute=\"trailing\" id=\"8ij-Oq-Wbf\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"08F-oQ-5uA\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"9Bd-qc-VcN\"/>\n                    <constraint firstItem=\"pxh-m5-P6y\" firstAttribute=\"leading\" secondItem=\"wo9-Dj-FEZ\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"Bis-fQ-RKh\"/>\n                    <constraint firstItem=\"08F-oQ-5uA\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"Dch-xx-ld8\"/>\n                    <constraint firstItem=\"wo9-Dj-FEZ\" firstAttribute=\"top\" secondItem=\"08F-oQ-5uA\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"FVm-Cl-T6C\"/>\n                    <constraint firstItem=\"pxh-m5-P6y\" firstAttribute=\"leading\" secondItem=\"Cn6-Sr-4P4\" secondAttribute=\"leading\" id=\"Jbb-ps-6E7\"/>\n                    <constraint firstItem=\"Cn6-Sr-4P4\" firstAttribute=\"top\" secondItem=\"pxh-m5-P6y\" secondAttribute=\"bottom\" constant=\"8\" id=\"RSc-nh-iDz\"/>\n                    <constraint firstItem=\"08F-oQ-5uA\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"Tp1-04-UBk\"/>\n                    <constraint firstItem=\"ZZX-XH-fjB\" firstAttribute=\"baseline\" secondItem=\"Cn6-Sr-4P4\" secondAttribute=\"baseline\" id=\"eeS-tP-wYv\"/>\n                    <constraint firstItem=\"Cn6-Sr-4P4\" firstAttribute=\"leading\" secondItem=\"ZZX-XH-fjB\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"gwh-4V-1GM\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"pxh-m5-P6y\" secondAttribute=\"trailing\" constant=\"65\" id=\"kQJ-Yu-Omx\"/>\n                    <constraint firstItem=\"pxh-m5-P6y\" firstAttribute=\"trailing\" secondItem=\"Cn6-Sr-4P4\" secondAttribute=\"trailing\" id=\"l3q-7f-NHc\"/>\n                    <constraint firstItem=\"wo9-Dj-FEZ\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"32\" id=\"o2x-eC-m7D\"/>\n                    <constraint firstItem=\"nQ2-zF-cDA\" firstAttribute=\"leading\" secondItem=\"dOG-kc-J9Z\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"r5v-Nl-X5K\"/>\n                    <constraint firstItem=\"dOG-kc-J9Z\" firstAttribute=\"baseline\" secondItem=\"nQ2-zF-cDA\" secondAttribute=\"baseline\" id=\"tgp-6f-5f5\"/>\n                    <constraint firstItem=\"pxh-m5-P6y\" firstAttribute=\"baseline\" secondItem=\"wo9-Dj-FEZ\" secondAttribute=\"baseline\" id=\"wZe-bT-uWS\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"133\" y=\"79\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds/StatusMenuController.swift",
    "content": "//\n//  MainMenu.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\n@available(macOS, deprecated: 11)\nclass StatusMenuController: NSObject, NSMenuItemValidation {\n    enum StatusMenuItemType:Int {\n        case AboutMenuItem=1\n        case OIDCUsername=2\n        case KerberosUsername=3\n        case NextADPasswordCheckMenuItem=4\n        case NextTokenPasswordCheckMenuItem=5\n        case ADCredentialStatusMenuItem=6\n        case CloudPasswordExpires=7\n        case ADPasswordExpires=8\n        case SignInMenuItem=9\n        case ChangePasswordMenuItem=10\n        case SharesMenuItem=11\n        case QuitMenuItem=12\n        case Additional=13\n        case SetupCardMenuItem=14\n        case OIDCCredentialStatusMenuItem=15\n        case FileVaultAutoLoginMenuItem=16\n\n\n    }\n    enum MenuElements:String {\n        case linkOrAppPath\n        case menuItemName\n        case separatorAfter\n        case separatorBefore\n    }\n    struct StatusMenuItem {\n        var name:String\n        var path:String\n    }\n    var signedIn = false\n    var aboutWindowController: AboutWindowController?\n    var oidcUsername = \"\"\n    var kerberosPrincipalName = \"\"\n    @IBOutlet var signinMenuItem:NSMenuItem!\n    @IBOutlet var changePasswordMenuItem:NSMenuItem!\n    @IBOutlet var quitMenuItem:NSMenuItem!\n    @IBOutlet var quitMenuItemSeparator:NSMenuItem!\n    \n    @IBOutlet var aboutMenuItem:NSMenuItem!\n    @IBOutlet var aboutMenuItemSeparator:NSMenuItem!\n    @IBOutlet var nextPasswordCheckMenuItem:NSMenuItem!\n    @IBOutlet var credentialStatusMenuItem:NSMenuItem!\n    @IBOutlet var statusMenu:NSMenu!\n    @IBOutlet var sharesMenuItem:NSMenuItem!\n    \n    @IBOutlet weak var filevaultLoginEnabledMenuItem: NSMenuItem!\n    override func awakeFromNib() {\n\n        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n        if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_username\") as? [String], userNames.count>0, let username = userNames.first {\n            oidcUsername = username\n\n        }\n        else if let oidcUsernamePrefs = UserDefaults.standard.string(forKey:\"_xcreds_oidc_username\" )\n        {\n            oidcUsername = oidcUsernamePrefs\n        }\n        if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? [String], userNames.count>0, let username = userNames.first {\n            kerberosPrincipalName = username\n\n        }\n\n\n        if let menuItems = DefaultsOverride.standardOverride.value(forKey: PrefKeys.menuItems.rawValue) as? Array<Dictionary<String,Any?>> {\n            let insertPos = StatusMenuItemType.OIDCCredentialStatusMenuItem.rawValue+1\n            var index = 0\n            for item in menuItems {\n                if let name = item[MenuElements.menuItemName.rawValue] as? String,\n                   let path = item[MenuElements.linkOrAppPath.rawValue] as? String,\n                    let separatorBefore = item[MenuElements.separatorBefore.rawValue] as? Bool,\n                    let separatorAfter = item[MenuElements.separatorAfter.rawValue] as? Bool\n                {\n                    let menuItem = NSMenuItem(title: name, action:#selector(additionalMenuItemSelected(_:)) , keyEquivalent: \"\")\n                    menuItem.target=self\n                    menuItem.tag=StatusMenuItemType.Additional.rawValue\n                    menuItem.representedObject=StatusMenuItem(name: name, path: path)\n                    if separatorBefore == true {\n                        statusMenu.insertItem(NSMenuItem.separator(), at: insertPos+index)\n                        index+=1\n                    }\n                    statusMenu.insertItem(menuItem, at:insertPos+index)\n                    index+=1\n                    if separatorAfter == true {\n                        statusMenu.insertItem(NSMenuItem.separator(), at:insertPos+index)\n                        index+=1\n                    }\n\n                }\n\n            }\n        }\n    }\n    \n    @objc func additionalMenuItemSelected(_ sender:NSMenuItem){\n        guard let menuItemInfo = sender.representedObject as? StatusMenuItem else  {\n            return\n        }\n\n        let pathString = menuItemInfo.path\n\n        if pathString.hasPrefix(\"http\") || pathString.hasPrefix(\"mailto\"), let url = URL(string: pathString){\n\n            NSWorkspace.shared.open(url)\n\n        }\n        else  {\n            let fileUrl = URL(fileURLWithPath: pathString)\n            NSWorkspace.shared.openApplication(at: fileUrl, configuration: NSWorkspace.OpenConfiguration())\n        }\n\n    }\n    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {\n\n        var adSetup = false\n        var oidcSetup = false\n\n        if let adDomainFromPrefs = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue){\n\n            if adDomainFromPrefs.isEmpty==false, adDomainFromPrefs.count>0 {\n                adSetup=true\n\n            }\n        }\n        if let oidcDiscoveryFromPrefs = DefaultsOverride.standardOverride.string(forKey: PrefKeys.discoveryURL.rawValue){\n\n            if oidcDiscoveryFromPrefs.isEmpty==false, oidcDiscoveryFromPrefs.count>0 {\n                oidcSetup=true\n\n            }\n        }\n        let appDelegate = NSApp.delegate as? AppDelegate\n        let mainController = appDelegate?.mainController\n        \n        let tag = menuItem.tag\n        guard let menuType = StatusMenuItemType(rawValue: tag) else {\n            return false\n        }\n        \n        switch menuType {\n\n        case .SetupCardMenuItem:\n            return true\n\n        case .AboutMenuItem:\n            \n            if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowAboutMenu.rawValue) == false {\n                \n                aboutMenuItem.isHidden=true\n                aboutMenuItemSeparator.isHidden=true\n                return false\n            }\n            aboutMenuItem.isHidden=false\n            aboutMenuItemSeparator.isHidden=false\n            \n            let infoPlist = Bundle.main.infoDictionary\n            \n            if let infoPlist = infoPlist, let build = infoPlist[\"CFBundleVersion\"], let appVersion =  infoPlist[\"CFBundleShortVersionString\"]{\n                menuItem.title=\"About XCreds \\(appVersion) (\\(build))\"\n                \n            }\n            \n        case .NextADPasswordCheckMenuItem:\n            menuItem.isHidden=false\n            if adSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n            if let nextADPassCheck = mainController?.nextPasswordADCheck {\n                menuItem.title=\"Next AD Check: \\(nextADPassCheck)\"\n            }\n\n            \n            return false\n\n        case .NextTokenPasswordCheckMenuItem:\n            menuItem.isHidden=false\n            if oidcSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n            if let nextTokenPassCheck = mainController?.nextPasswordTokenCheck {\n                menuItem.title=\"Next OIDC Check: \\(nextTokenPassCheck)\"\n            }\n            return false\n\n        case .ADCredentialStatusMenuItem:\n            menuItem.isHidden=false\n            if adSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            if let status = mainController?.kerberosCredentialStatus {\n                menuItem.title=\"Active Directory Credentials Status: \\(status)\"\n            }\n            return false\n\n        case .FileVaultAutoLoginMenuItem:\n            menuItem.isHidden=true\n            if mainController?.shouldShowFilevaultBypassMenuItem==true{\n                menuItem.isHidden=false\n                menuItem.title=mainController?.fileVaultMenuItemText ?? \"\"\n//                menuItem.isEnabled=false\n                return false\n            }\n            break\n\n        case .OIDCCredentialStatusMenuItem:\n            menuItem.isHidden=false\n            if oidcSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n\n            if let status = mainController?.tokenCredentialStatus {\n                menuItem.title=\"Credentials Status: \\(status)\"\n            }\n            return false\n\n        case .SignInMenuItem:\n            print(\"SignInMenuItem\")\n            if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowSignInMenuItem.rawValue) == false {\n                \n                signinMenuItem.isHidden=true\n                return false\n            }\n            signinMenuItem.isHidden=false\n            \n            \n            \n            \n        case .ChangePasswordMenuItem:\n            \n            print(\"ChangePasswordMenuItem\")\n            \n            if let passwordChangeURLString = DefaultsOverride.standardOverride.value(forKey: PrefKeys.passwordChangeURL.rawValue) as? String, passwordChangeURLString.count>0 {\n                \n                menuItem.isHidden=false\n                return true\n            }\n            else if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseADNativePasswordChangeMenuItem.rawValue) == true {\n                menuItem.isHidden=false\n                return true\n\n            }\n            else  {\n                menuItem.isHidden=true\n                return false\n            }\n            \n        case .QuitMenuItem:\n            if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowQuitMenu.rawValue)==false{\n                quitMenuItem.isHidden=true\n                quitMenuItemSeparator.isHidden=true\n                \n            }\n            else {\n                quitMenuItem.isHidden=false\n                quitMenuItemSeparator.isHidden=false\n            }\n            \n        case .CloudPasswordExpires:\n            menuItem.isHidden=false\n            if oidcSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            if let passwordExpires = mainController?.cloudPasswordExpires {\n                menuItem.isHidden=false\n                menuItem.title=\"OIDC Password Expires: \\(passwordExpires)\"\n            }\n            else {\n                menuItem.isHidden=true\n            }\n            return false\n            \n        case .ADPasswordExpires:\n            menuItem.isHidden=false\n            if adSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            if let passwordExpires = mainController?.adPasswordExpires, DefaultsOverride.standardOverride.bool(forKey: PrefKeys.hideExpiration.rawValue)==false {\n                TCSLogWithMark(\"Unhiding password expires\")\n                menuItem.isHidden=false\n                menuItem.title=\"AD Password Expires: \\(passwordExpires)\"\n            }\n            else {\n                TCSLogWithMark(\"hiding password expires\")\n                menuItem.isHidden=true\n            }\n            return false\n        case .SharesMenuItem:\n            menuItem.isHidden=false\n            if adSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            if let shareMenuItemTitle = DefaultsOverride.standardOverride.value(forKey: PrefKeys.shareMenuItemName.rawValue) as? String {\n                menuItem.title = shareMenuItemTitle\n            }\n            return true\n        case .Additional:\n            return true\n        case .OIDCUsername:\n            menuItem.isHidden=false\n            if oidcSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            var userName = \"None\"\n            if oidcUsername.isEmpty == false {\n                menuItem.isHidden=false\n                userName = oidcUsername\n                menuItem.title = \"OIDC Username: \\(userName) \"\n\n            }\n            else {\n                menuItem.isHidden=true\n            }\n\n            return false\n\n        case .KerberosUsername:\n            menuItem.isHidden=false\n            if adSetup==false {\n                menuItem.isHidden=true\n                return false\n\n            }\n\n            var userName = \"None\"\n            if kerberosPrincipalName.isEmpty == false {\n                menuItem.isHidden=false\n                userName = kerberosPrincipalName\n                menuItem.title = \"Active Directory Username: \\(userName) \"\n\n            }\n            else {\n                menuItem.isHidden=true\n            }\n            //grayed out\n            return false\n        }\n\n\n        return true\n    }\n    \n    @IBAction func aboutMenuItemSelected(_ sender:Any?){\n        if aboutWindowController == nil {\n            aboutWindowController = AboutWindowController()\n        }\n        aboutWindowController?.window!.forceToFrontAndFocus(nil)\n        NSApp.activate(ignoringOtherApps: true)\n\n    }\n    \n    @IBAction func changePasswordMenuItemSelected(_ sender:Any?)  {\n        if  DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseADNativePasswordChangeMenuItem.rawValue)==true {\n            let appDelegate = NSApp.delegate as? AppDelegate\n\n            if let mainController = appDelegate?.mainController,\n            let signInViewController = mainController.signInViewController{\n\n                do {\n                    try signInViewController.showResetUI()\n                    TCSLogWithMark(\"reset password\")\n                }\n                catch SignInViewController.SignInViewControllerResetPasswordError.cancelled  {\n                    TCSLogWithMark(\"user cancelled\")\n                }\n                catch {\n                    NSAlert.showAlert(title: \"Error resetting password\", message: \"There was an error resetting your password. \\(error)\")\n                }\n            }\n        }\n        else if let passwordChangeURLString = DefaultsOverride.standardOverride.value(forKey: PrefKeys.passwordChangeURL.rawValue) as? String, passwordChangeURLString.count>0 {\n\n            if let url = URL(string: passwordChangeURLString) {\n                NSWorkspace.shared.open(url)\n            }\n        }\n    }\n    @IBAction func quitMenuItemSelected(_ sender:Any?)  {\n        \n        NSApp.terminate(self)\n        \n    }\n    @IBAction func fileVaultAutoLoginEnabledMenuItemSelected(_ sender:Any?)  {\n        \n    }\n\n    @IBAction func nextPasswordCheckTimeMenuItemSelected(_ sender:Any?)  {\n        \n    }\n    @IBAction func credentialStatusMenuItemSelected(_ sender:Any?)  {\n        \n    }\n    @IBAction func signInMenuItemSelected(_ sender:Any?)  {\n        let appDelegate = NSApp.delegate as? AppDelegate\n        \n        let mainController = appDelegate?.mainController\n        mainController?.showSignInWindow(force: true)\n\n    }\n}\n\n\n\n"
  },
  {
    "path": "XCreds/TCSLoginWindowUtilities.h",
    "content": "//\n//  TCSLoginWindowUtilities.h\n//  XCreds\n//\n//  Created by Timothy Perfitt on 5/11/23.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface TCSLoginWindowUtilities : NSObject\n-(void)switchToLoginWindow:(id)sender;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "XCreds/TCSLoginWindowUtilities.m",
    "content": "//\n//  TCSLoginWindowUtilities.m\n//  XCreds\n//\n//  Created by Timothy Perfitt on 5/11/23.\n//\n#import <Foundation/Foundation.h>\n\n#import \"TCSLoginWindowUtilities.h\"\n@protocol LFSessionAgentListenerInterface <NSObject>\n- (void)SACLOFinishDelayedLogout:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACLORegisterLogoutStatusCallacks:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACLOStartLogoutWithOptions:(int)arg1 subType:(int)arg2 showConfirmation:(BOOL)arg3 countDownTime:(int)arg4 talOptions:(int)arg5 logoutOptions:(NSDictionary *)arg6 reply:(void (^)(int))arg7;\n- (void)SACLOStartLogout:(int)arg1 subType:(int)arg2 showConfirmation:(BOOL)arg3 talOptions:(int)arg4 reply:(void (^)(int))arg5;\n- (void)SACLogoutComplete:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACNewSessionSignalReady:(void (^)(int))arg1;\n- (void)SACStartSessionForUser:(unsigned int)arg1 reply:(void (^)(int))arg2;\n- (void)SACStopSessionForLoginWindow:(void (^)(int))arg1;\n- (void)SACStartSessionForLoginWindow:(void (^)(int))arg1;\n- (void)SACSaveSetupUserScreenShots:(void (^)(int))arg1;\n- (void)SACMiniBuddySignalFinishedStage1WithOptions:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACMiniBuddyCopyUpgradeDictionary:(void (^)(int, NSDictionary *))arg1;\n- (void)SACSetFinalSnapshot:(BOOL)arg1 reply:(void (^)(int))arg2;\n- (void)SACStopProgressIndicator:(void (^)(int))arg1;\n- (void)SACStartProgressIndicator:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACBeginLoginTransition:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACSwitchToLoginWindow:(void (^)(int))arg1;\n- (void)SACSwitchToUser:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACSetKeyboardType:(int)arg1 productID:(int)arg2 vendorID:(int)arg3 countryCode:(int)arg4 reply:(void (^)(int))arg5;\n- (void)SACSetAutologinPassword:(NSString *)arg1 reply:(void (^)(int))arg2;\n- (void)SACSetAppleIDForUser:(NSString *)arg1 verified:(BOOL)arg2 reply:(void (^)(int))arg3;\n- (void)SACUpdateAppleIDUserLogin:(NSString *)arg1 reply:(void (^)(int))arg2;\n- (void)SACRestartForUser:(NSString *)arg1 reply:(void (^)(int))arg2;\n- (void)SACScreenSaverDidFadeInBackground:(BOOL)arg1 psnHi:(unsigned int)arg2 psnLow:(unsigned int)arg3 reply:(void (^)(int))arg4;\n- (void)SACScreenSaverIsRunningInBackground:(void (^)(int, BOOL))arg1;\n- (void)SACScreenSaverTimeRemaining:(void (^)(int, double))arg1;\n- (void)SACScreenSaverStopNowWithOptions:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SACScreenSaverStopNow:(void (^)(int))arg1;\n- (void)SACScreenSaverStartNow:(void (^)(int))arg1;\n- (void)SACSetScreenSaverCanRun:(BOOL)arg1 reply:(void (^)(int))arg2;\n- (void)SACScreenSaverCanRun:(void (^)(int, BOOL))arg1;\n- (void)SACScreenSaverIsRunning:(void (^)(int, BOOL))arg1;\n- (void)SACShieldWindowShowing:(void (^)(int, BOOL))arg1;\n- (void)SACScreenLockEnabled:(void (^)(int, BOOL))arg1;\n- (void)SACLockScreenImmediate:(void (^)(int))arg1;\n- (void)SACScreenLockPreferencesChanged:(void (^)(int))arg1;\n- (void)SACFaceTimeCallRingStop:(void (^)(int))arg1;\n- (void)SACFaceTimeCallRingStart:(void (^)(int))arg1;\n@end\n\n@protocol LFLogindListenerLookupInterface <NSObject>\n- (void)SMMoveSessionToConsoleTemporaryBridge:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SMReleaseSessionTemporaryBridge:(NSDictionary *)arg1 reply:(void (^)(int))arg2;\n- (void)SMCreateSessionTemporaryBridge:(NSDictionary *)arg1 reply:(void (^)(int, unsigned int))arg2;\n- (void)SMGetSessionAgentConnection:(void (^)(int, NSXPCListenerEndpoint *))arg1;\n@end\n\nstatic NSString* XPCHelperMachServiceName = @\"com.apple.logind\";\n\n\n@implementation TCSLoginWindowUtilities\n\n\n-(void)switchToLoginWindow:(id)sender{\n\n    NSString*  service_name = XPCHelperMachServiceName;\n\n    NSXPCConnection* connection = [[NSXPCConnection alloc] initWithMachServiceName:service_name options:0x1000];\n\n    NSXPCInterface* interface = [NSXPCInterface interfaceWithProtocol:@protocol(LFLogindListenerLookupInterface)];\n\n    [connection setRemoteObjectInterface:interface];\n\n    [connection resume];\n\n    id obj = [connection remoteObjectProxyWithErrorHandler:^(NSError* error)\n    {\n    NSLog(@\"[-] Something went wrong\");\n    NSLog(@\"[-] Error: %@\", error);\n    }];\n\n    NSLog(@\"obj: %@\", obj);\n    NSLog(@\"conn: %@\", connection);\n\n    [obj SMGetSessionAgentConnection:^(int b, NSXPCListenerEndpoint * endpoint){\n        NSLog(@\"SMGetSessionAgentConnection Response: %d\", b);\n\n        NSXPCConnection* SAConnection = [[NSXPCConnection alloc] initWithListenerEndpoint:endpoint];\n        [SAConnection setRemoteObjectInterface:[NSXPCInterface interfaceWithProtocol:@protocol(LFSessionAgentListenerInterface)]];\n        [SAConnection resume];\n\n        id login_window = [SAConnection remoteObjectProxy];\n\n\n        [login_window SACSwitchToLoginWindow:^(int val) {\n\n        }];\n\n    }];\n\n    [NSThread sleepForTimeInterval:10.0f];\n\n    NSLog(@\"Done\");\n\n}\n@end\n"
  },
  {
    "path": "XCreds/TokenManager.swift",
    "content": "//\n//  TokenManager.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\nimport Foundation\nimport OIDCLite\n\nstruct IDToken:Decodable {\n    let iss,sub:String\n    let aud:StringOrArray\n    let iat, exp:Int\n    let email:String?\n    let unique_name, given_name,family_name,name:String?\n\n    enum CodingKeys: String, CodingKey {\n        case iss,sub,aud,name,given_name,family_name,email,iat,exp, unique_name\n\n    }\n}\n\nenum StringOrArray:Decodable{\n    case string(String)\n    case array([String])\n\n    init(from decoder: Decoder) throws {\n            let container = try decoder.singleValueContainer()\n            if let x = try? container.decode(String.self) {\n                self = .string(x)\n                return\n            }\n            if let x = try? container.decode([String].self) {\n                self = .array(x)\n                return\n            }\n            throw DecodingError.typeMismatch(StringOrArray.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: \"Wrong type for Names\"))\n        }\n}\nprotocol TokenManagerFeedbackDelegate {\n    func tokenError(_ err:String)\n    func credentialsUpdated(_ credentials:Creds)\n    func invalidCredentials()\n\n\n}\n@available(macOS, deprecated: 11)\nclass TokenManager:DSQueryable {\n\n\n    struct UserAccountInfo {\n        var fullName:String?\n        var firstName:String?\n        var lastName:String?\n        var username:String?\n        var fullUsername:String?\n        var groups:Array<String>?\n        var alias:String?\n        var kerberosPrincipalName:String?\n        var uid:String?\n    }\n    enum ParseHintsResult:Error {\n        case error(String)\n    }\n    enum ProcessTokenResult:Error {\n        case error(String)\n        case invalidCredentials\n    }\n    enum CalculateUserAccountInfoResult {\n        case success(UserAccountInfo)\n        case error(String)\n    }\n\n    var feedbackDelegate:TokenManagerFeedbackDelegate?\n    let defaults = DefaultsOverride.standard\n    private var oidcLocal:OIDCLite?\n    func oidc() async throws -> OIDCLite {\n        var scopes: [String]?\n        var additionalParameters:[String:String] = [:]\n\n        if let oidcPrivate = oidcLocal {\n           try await oidcPrivate.getEndpoints()\n\n            return oidcPrivate\n        }\n        let clientSecret = DefaultsOverride.standardOverride.string(forKey: PrefKeys.clientSecret.rawValue)\n\n\n        \n        let clientID = DefaultsOverride.standardOverride.string(forKey: PrefKeys.clientID.rawValue)\n\n        let resource = DefaultsOverride.standardOverride.string(forKey: PrefKeys.resource.rawValue)\n\n        \n        if let scopesRaw = DefaultsOverride.standardOverride.string(forKey: PrefKeys.scopes.rawValue) {\n            scopes = scopesRaw.components(separatedBy: \" \")\n        }\n\n        //\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSetGoogleAccessTypeToOffline.rawValue) == true {\n\n            additionalParameters[\"access_type\"]=\"offline\"\n        }\n        \n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSetGoogleHDParam.rawValue) == true,\n            let oidcUsernamePrefs = UserDefaults.standard.string(forKey:\"_xcreds_oidc_username\" )\n        {\n                additionalParameters = [\"hd\":oidcUsernamePrefs]\n\n        }\n\n        let oidcLite = OIDCLite(discoveryURL: DefaultsOverride.standardOverride.string(forKey: PrefKeys.discoveryURL.rawValue) ?? \"NONE\", clientID: clientID ?? \"NONE\", clientSecret: clientSecret, redirectURI: DefaultsOverride.standardOverride.string(forKey: PrefKeys.redirectURI.rawValue), scopes: scopes, additionalParameters:additionalParameters.count==0 ? nil:additionalParameters, resource: resource)\n        try await oidcLite.getEndpoints()\n        oidcLocal = oidcLite\n        return oidcLite\n\n\n    }\n\n    static func saveTokensToKeychain(creds:Creds, keychainPassword:String) -> Bool {\n        let keychainUtil = KeychainUtil()\n\n        if let password = creds.password, password.count>0{\n            TCSLogWithMark(\"Saving cloud password\")\n\n            TCSLogWithMark()\n            if keychainUtil.updatePassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue, pass: password, keychainPassword:keychainPassword) == false {\n                TCSLogErrorWithMark(\"Error Updating password\")\n\n                return false\n            }\n\n        }\n\n        if let accessToken = creds.accessToken, accessToken.count>0{\n            TCSLogWithMark(\"Saving Access Token\")\n\n            if  keychainUtil.updatePassword(serviceName: \"xcreds \".appending(PrefKeys.accessToken.rawValue),accountName:PrefKeys.accessToken.rawValue, pass: accessToken, keychainPassword:keychainPassword) == false {\n                TCSLogErrorWithMark(\"Error Updating Access Token\")\n\n                return false\n            }\n\n        }\n        if let idToken = creds.idToken, idToken.count>0{\n            TCSLogWithMark(\"Saving idToken Token\")\n\n            if keychainUtil.updatePassword(serviceName: \"xcreds \".appending(PrefKeys.idToken.rawValue),accountName:PrefKeys.idToken.rawValue, pass: idToken, keychainPassword:keychainPassword) == false {\n                TCSLogErrorWithMark(\"Error Updating idToken Token\")\n\n                return false\n            }\n        }\n\n\n        if let refreshToken = creds.refreshToken, refreshToken.count>0 {\n            TCSLogWithMark(\"Saving refresh Token\")\n\n            if keychainUtil.updatePassword(serviceName: \"xcreds \".appending(PrefKeys.refreshToken.rawValue),accountName:PrefKeys.refreshToken.rawValue, pass: refreshToken, keychainPassword:keychainPassword) == false {\n                TCSLogErrorWithMark(\"Error Updating refreshToken Token\")\n\n                return false\n            }\n        }\n\n\n\n        return true\n    }\n\n    func tokenEndpoint() async throws -> String? {\n\n        let prefTokenEndpoint = DefaultsOverride.standardOverride.string(forKey: PrefKeys.tokenEndpoint.rawValue)\n        if  prefTokenEndpoint != nil {\n            return prefTokenEndpoint\n        }\n\n\n        if let tokenEndpoint = try await oidc().OIDCTokenEndpoint {\n            return tokenEndpoint\n        }\n        return nil\n    }\n    func getNewAccessToken()   {\n        Task{\n            do {\n                //just care if we throw\n                let _ = try await getNewAccessToken()\n\n            }\n            catch let error as OIDCLiteError {\n                switch error {\n                case .unableToFindCode:\n                    break\n                case .unableToLoadEndpoint:\n                    break\n                case .unableToParseEndpoint:\n                    break\n                case .tokenError(_):\n                    break\n                case .authFailure(_):\n                    break\n                }\n\n            }\n        }\n    }\n    func getNewAccessToken() async throws -> Creds? {\n\n        TCSLogWithMark()\n\n        let keychainUtil = KeychainUtil()\n        TCSLogWithMark()\n\n        let clientID = defaults.string(forKey: PrefKeys.clientID.rawValue)\n        let localCredFromKeychain =  keychainUtil.findPassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue)\n\n        TCSLogWithMark()\n        //ropg\n        if\n            let localCredFromKeychain = localCredFromKeychain,\n            DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForPasswordChangeChecking.rawValue) == true{\n            TCSLogWithMark(\"Checking credentials using ROPG\")\n            guard let oidcUsername = currOidcUsername() else {\n                throw ProcessTokenResult.error(\"no username for oidc config\")\n            }\n            let shouldUseBasicAuthWithROPG = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseBasicAuthWithROPG.rawValue)\n\n            var overrrideErrorArray = [String]()\n            let ropgResponseValue = DefaultsOverride.standardOverride.string(forKey: PrefKeys.ropgResponseValue.rawValue)\n\n\n            if let ropgResponseValue = ropgResponseValue {\n                overrrideErrorArray.append(ropgResponseValue)\n                TCSLogWithMark(\"ropgResponseValue: \\(ropgResponseValue)\")\n\n            }\n            else if let ropgResponseValueArray = DefaultsOverride.standardOverride.array(forKey: PrefKeys.ropgResponseValue.rawValue) as? [String] {\n                overrrideErrorArray.append(contentsOf: ropgResponseValueArray)\n            }\n\n            let tokenResponse = try await oidc().requestTokenWithROPG(username: oidcUsername, password: localCredFromKeychain.password, basicAuth: shouldUseBasicAuthWithROPG, overrideErrors: overrrideErrorArray)\n\n            TCSLogWithMark(\"ROPG successful. Returning credentials for tokenInfo\")\n\n            if let tokenResponse = tokenResponse {\n                return Creds(password: localCredFromKeychain.password, tokens:tokenResponse )\n            }\n            return nil\n        } //use the refresh token\n        else if let refreshTokenFromKeychain =  keychainUtil.findPassword(serviceName: \"xcreds \".appending(PrefKeys.refreshToken.rawValue),accountName:PrefKeys.refreshToken.rawValue){\n            \n            let refreshToken = refreshTokenFromKeychain.password\n\n            TCSLogWithMark(\"Using refresh token\")\n            let tokenInfo = try await oidc().refreshTokens(refreshToken)\n            TCSLogWithMark(\"Got tokens\")\n\n            return Creds(password: localCredFromKeychain?.password, tokens: tokenInfo)\n\n        } // nothing. let delegate know\n        else if DefaultsOverride.standardOverride.value(forKey: PrefKeys.discoveryURL.rawValue) == nil {\n\n            throw ProcessTokenResult.error(\"no discovery URL defined\")\n\n         }\n        else {\n            TCSLogWithMark(\"clientID or refreshToken blank, or not foud it keychain. clientid: \\(clientID ?? \"empty\")\")\n            throw ProcessTokenResult.error(\"no refresh token\")\n\n        }\n    }\n    func currOidcUsername() -> String?{\n        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n\n        if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_full_username\") as? [String], userNames.count>0, let username = userNames.first\n        {\n            return username\n        }\n        else if let oidcUsernamePrefs = UserDefaults.standard.string(forKey:\"_xcreds_oidc_full_username\" ), oidcUsernamePrefs.isEmpty == false {\n            return oidcUsernamePrefs\n\n        }\n        return nil\n    }\n    func idTokenData(jwtString:String) throws -> Data {\n        let array = jwtString.components(separatedBy: \".\")\n\n        if array.count != 3 {\n            TCSLogErrorWithMark(\"idToken is invalid\")\n            throw ProcessTokenResult.error(\"The identity token is incorrect length.\")\n            //            mechanismDelegate.denyLogin(message:\"The identity token is incorrect length.\")\n        }\n        let body = array[1]\n        TCSLogWithMark(\"base64 encoded IDToken: \\(body)\");\n        guard let data = base64UrlDecode(value:body ) else {\n            TCSLogErrorWithMark(\"error decoding id token base64\")\n            throw ProcessTokenResult.error(\"The identity token could not be decoded from base64.\")\n        }\n        return data\n\n    }\n    func tokenInfo(fromCredentials credentials:Creds) throws -> Dictionary<String, Any>? {\n        //if we have tokens, that means that authentication was successful.\n\n\n        guard let idToken = credentials.idToken else {\n            TCSLogErrorWithMark(\"invalid idToken\")\n            throw ProcessTokenResult.error(\"invalid idToken\")\n        }\n\n        let data = try idTokenData(jwtString: idToken)\n        if let decodedTokenString = String(data: data, encoding: .utf8) {\n            TCSLogWithMark(\"IDToken:\\(decodedTokenString)\")\n        }\n\n        let decoder = JSONDecoder()\n        var idTokenObject:IDToken\n        do {\n            idTokenObject = try decoder.decode(IDToken.self, from: data)\n\n        }\n        catch {\n            TCSLogErrorWithMark(\"error decoding idtoken::\")\n            TCSLogErrorWithMark(\"Token:\\(data)\")\n            throw ProcessTokenResult.error(\"The identity token could not be decoded from json\")\n        }\n\n        let idTokenInfo = jwtDecode(value: idToken)  //dictionary for mapping\n        guard var idTokenInfo = idTokenInfo else {\n            throw ProcessTokenResult.error(\"No idTokenInfo found\")\n\n            //            mechanismDelegate.denyLogin(message:\"No idTokenInfo found.\")\n            //            return\n        }\n\n        idTokenInfo[\"idToken\"]=idTokenObject\n        return idTokenInfo\n    }\n    func findUserAndUpdatePassword(idTokenInfo:Dictionary<String, Any>,newPassword:String) -> SelectLocalAccountWindowController.VerifyLocalCredentialsResult?{\n\n        TCSLogWithMark()\n        guard let subValue = idTokenInfo[\"sub\"] as? String, let issuerValue = idTokenInfo[\"iss\"] as? String else {\n            TCSLogWithMark(\"no sub or iss\")\n\n            return nil\n        }\n\n        TCSLogWithMark(\"getting users\")\n        let nonSystemUsers = try? getAllNonSystemUsers()\n        let existingUser = try? getUserRecord(sub: subValue, iss: issuerValue)\n        let shouldPromptForMigration = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldPromptForMigration.rawValue)\n\n        if shouldPromptForMigration == false {\n            TCSLogWithMark(\"not prompting for migration\")\n\n        }\n        if  let existingUser = existingUser, let odUsername = existingUser.recordName  {\n            TCSLogWithMark(\"prior local user found. using.\")\n\n            return .successful(odUsername)\n        }\n        else if let nonSystemUsers = nonSystemUsers, nonSystemUsers.count>0, shouldPromptForMigration == true {\n\n            TCSLogWithMark(\"Preference set to prompt for migration and there are existing users, so prompting\")\n\n\n            return SelectLocalAccountWindowController.selectLocalAccountAndUpdate(newPassword: newPassword)\n        }\n        return .createNewAccount\n    }\n    func setupUserAccountInfo(idTokenInfo:Dictionary<String, Any>)  -> CalculateUserAccountInfoResult {\n\n        TCSLogWithMark()\n        var userAccountInfo = UserAccountInfo()\n        guard let idTokenObject = idTokenInfo[\"idToken\"] as? IDToken else {\n            return .error(\"invalid token object\")\n\n        }\n        let defaultsUsername = DefaultsOverride.standardOverride.string(forKey: PrefKeys.username.rawValue)\n\n        // username static map\n        if let defaultsUsername = defaultsUsername, defaultsUsername.count>0 {\n            userAccountInfo.username = defaultsUsername\n        }\n        else if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapUserName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String, let leftSide = mapValue.components(separatedBy: \"@\").first, leftSide.count>0{\n\n            TCSLogWithMark()\n            userAccountInfo.username = leftSide.replacingOccurrences(of: \" \", with: \"_\").stripped\n            TCSLogWithMark(\"mapped username found: \\(mapValue) clean version:\\(userAccountInfo.username ?? \"nil\")\")\n        }\n        else {\n            TCSLogWithMark()\n            var emailString:String\n\n            if let email = idTokenObject.email, email.count>0  {\n                emailString=email.lowercased()\n            }\n            else if let uniqueName=idTokenObject.unique_name, uniqueName.count>0 {\n                emailString=uniqueName\n            }\n\n            else {\n                TCSLogWithMark(\"no username found. Using sub.\")\n                emailString=idTokenObject.sub\n            }\n            guard let tUsername = emailString.components(separatedBy: \"@\").first?.lowercased() else {\n                TCSLogErrorWithMark(\"email address invalid\")\n\n                return .error(\"The email address from the identity token is invalid\")\n\n            }\n            TCSLogWithMark(\"username found: \\(tUsername)\")\n            userAccountInfo.username = tUsername\n        }\n\n        if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapFullUserName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String {\n            TCSLogWithMark(\"setting fullUsername to \\(mapValue)\")\n            userAccountInfo.fullUsername = mapValue\n            \n        }\n\n        else if let email = idTokenObject.email {\n            TCSLogWithMark()\n            userAccountInfo.fullUsername = email.lowercased()\n\n        }\n        else if let mapValue = idTokenInfo[\"upn\"] as? String {\n            TCSLogWithMark()\n            userAccountInfo.fullUsername = mapValue\n\n        }\n\n            \n\n        //kerberos principal name\n\n        //mapKerberosPrincipalName\n\n        if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapKerberosPrincipalName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String {\n            //we have a mapping so use that.\n            TCSLogWithMark(\"mapKerberosPrincipalName name mapped to: \\(mapKey)\")\n            userAccountInfo.kerberosPrincipalName = mapValue\n        }\n\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUpdateKerberosUserPrincipalADDomain.rawValue) == true,\n           let adDomain = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue) {\n\n            if userAccountInfo.kerberosPrincipalName?.uppercased().hasSuffix(adDomain.uppercased())==false{\n                TCSLogWithMark(\"kerberosPrincipalName name does not end with \\(adDomain). Updating...\")\n\n                let principalNameWithoutDomain = userAccountInfo.kerberosPrincipalName?.split(separator: \"@\").first ?? \"\"\n                userAccountInfo.kerberosPrincipalName = principalNameWithoutDomain + \"@\" + adDomain\n\n                TCSLogWithMark(\"kerberosPrincipalName name is now \\(userAccountInfo.kerberosPrincipalName ?? \"\")\")\n\n            }   \n        }\n\n        //full name\n        TCSLogWithMark(\"checking map_fullname\")\n\n        if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapFullName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String {\n            //we have a mapping so use that.\n            TCSLogWithMark(\"full name mapped to: \\(mapKey)\")\n            userAccountInfo.fullName = mapValue\n\n        }\n\n        else if let firstName = idTokenObject.given_name, let lastName = idTokenObject.family_name {\n            TCSLogWithMark(\"firstName: \\(firstName)\")\n            TCSLogWithMark(\"lastName: \\(lastName)\")\n            userAccountInfo.fullName = \"\\(firstName) \\(lastName)\"\n\n        }\n\n\n        //first name\n        if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapFirstName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String {\n            //we have a mapping for username, so use that.\n            TCSLogWithMark(\"first name mapped to: \\(mapKey)\")\n            userAccountInfo.firstName = mapValue\n        }\n\n        else if let given_name = idTokenObject.given_name {\n            TCSLogWithMark(\"firstName from token: \\(given_name)\")\n            userAccountInfo.firstName = given_name\n\n        }\n        //last name\n        TCSLogWithMark(\"checking map_lastname\")\n\n        if let mapKey = DefaultsOverride.standardOverride.object(forKey: PrefKeys.mapLastName.rawValue)  as? String, mapKey.count>0, let mapValue = idTokenInfo[mapKey] as? String {\n            //we have a mapping for lastName, so use that.\n            TCSLogWithMark(\"last name mapped to: \\(mapKey)\")\n            userAccountInfo.lastName = mapValue\n        }\n\n        else if let familyName = idTokenObject.family_name {\n            TCSLogWithMark(\"lastName from token: \\(familyName)\")\n            userAccountInfo.lastName = familyName\n\n        }\n        //groups\n        if let mapValue = idTokenInfo[\"groups\"] as? Array<String> {\n            TCSLogWithMark(\"setting groups: \\(mapValue)\")\n            userAccountInfo.groups = mapValue\n        }\n        else {\n\n            TCSLogWithMark(\"No groups found\")\n        }\n\n        let aliasClaim = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aliasName.rawValue)\n        if let aliasClaim = aliasClaim, let aliasClaimValue = idTokenInfo[aliasClaim] as? String {\n            TCSLogWithMark(\"found alias claim: \\(aliasClaim):\\(aliasClaimValue)\")\n\n            userAccountInfo.alias = aliasClaimValue\n        }\n        else {\n            TCSLogWithMark(\"no alias claim: \\(aliasClaim ?? \"none\")\")\n        }\n\n        //uid\n        let mapUID = DefaultsOverride.standardOverride.string(forKey: PrefKeys.mapUID.rawValue)\n\n        if let mapUID = mapUID, let uid = idTokenInfo[mapUID] as? String {\n            if let mapValueInt = Int(uid), mapValueInt > 499 {\n                TCSLogWithMark(\"setting uid: \\(uid)\")\n                userAccountInfo.uid = uid\n            }\n            else {\n                TCSLogWithMark(\"invalid uid mapping value\")\n            }\n\n        }\n        else {\n            TCSLogWithMark(\"No uid mapping\")\n        }\n\n        return .success(userAccountInfo)\n\n    }\n\n}\n// MARK: OIDC Lite Delegate Functions\n@available(macOS, deprecated: 11)\nextension TokenManager {\n\n    func ropgSuccess(errorMessage: String) {\n        TCSLogWithMark(\"ropgSuccess: \\(errorMessage)\")\n        feedbackDelegate?.tokenError(errorMessage)\n\n    }\n\n\n    func authFailure(message: String) {\n        XCredsAudit().auditError(message)\n        TCSLogWithMark(\"authFailure: \\(message)\")\n        feedbackDelegate?.tokenError(message)\n    }\n\n    func tokenResponse(tokens: OIDCLite.TokenResponse) {\n\n\n\n        TCSLogWithMark(\"======== tokenResponse =========\")\n        RunLoop.main.perform {\n            let googleAuth = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSetGoogleAccessTypeToOffline.rawValue)\n\n\n            let xcredCreds = Creds(password: nil, tokens: tokens)\n\n            if xcredCreds.hasAccessAndRefresh() {\n                TCSLogWithMark(\"Found access and refresh token\")\n\n            }\n            if googleAuth {\n                TCSLogWithMark(\"Found google auth\")\n\n            }\n            if xcredCreds.hasAccess() {\n                TCSLogWithMark(\"found access token\")\n\n            }\n            if googleAuth && xcredCreds.hasAccess() {\n                TCSLogWithMark(\"Found google auth and access token\")\n\n            }\n\n            if xcredCreds.hasAccessAndRefresh() || (googleAuth && xcredCreds.hasAccess()) {\n                XCredsAudit().refreshTokenUpdated(true)\n                self.feedbackDelegate?.credentialsUpdated(xcredCreds)\n            }\n//            else if let dict = tokens.jsonDict, let error = dict[\"error\"] as? String, error == ropgResponseValue ?? \"interaction_required\" {\n//                TCSLogWithMark(\"ropgResponseValue matched to \\(error)\")\n//                XCredsAudit().refreshTokenUpdated(true)\n//\n//                self.feedbackDelegate?.credentialsUpdated(xcredCreds)\n//            }\n            else if let dict = tokens.jsonDict, let error = dict[\"error\"] as? String, error == \"invalid_grant\" {\n                TCSLogWithMark(\"invalid grant, so password wrong: \\(error)\")\n                XCredsAudit().auditError(error)\n\n                self.feedbackDelegate?.invalidCredentials()\n            }\n            else {\n                let err = \"error gettings tokens: jsonDict:\\(String(describing: tokens.jsonDict?.debugDescription))\"\n\n                self.feedbackDelegate?.tokenError(err)\n            }\n\n        }\n    }\n}\n\n"
  },
  {
    "path": "XCreds/UpdatePasswordWindowController.swift",
    "content": "//\n//  UpdatePasswordWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 12/1/23.\n//\n\nimport Cocoa\n\nclass UpdatePasswordWindowController: NSWindowController {\n\n    @IBOutlet var currentPasswordTextField:NSTextField!\n\n    @IBOutlet var passwordTextField:NSTextField!\n    @IBOutlet var verifyPasswordTextField:NSTextField!\n    @IBOutlet var passwordMatchWarningLabel:NSTextField!\n    var password:String?\n    var currentPassword:String?\n\n    \n    override func windowDidLoad() {\n        super.windowDidLoad()\n        self.window?.makeFirstResponder(currentPasswordTextField)\n        passwordMatchWarningLabel.isHidden=true\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n    }\n    \n    @IBAction func changePasswordButtonPressed(_ sender: Any) {\n        if passwordTextField.stringValue.count==0 ||  verifyPasswordTextField.stringValue.count == 0 ||\n            currentPasswordTextField.stringValue.count == 0\n        {\n            return\n        }\n\n        if passwordTextField.stringValue != verifyPasswordTextField.stringValue {\n            passwordMatchWarningLabel.isHidden=false\n            return\n\n        }\n        if self.window?.isModalPanel==true {\n            password=passwordTextField.stringValue\n            currentPassword=currentPasswordTextField.stringValue\n            NSApp.stopModal(withCode: .OK)\n        }\n\n    }\n    @IBAction func cancelButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            password=nil\n            NSApp.stopModal(withCode: .cancel)\n        }\n    }\n}\n"
  },
  {
    "path": "XCreds/UpdatePasswordWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"UpdatePasswordWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"currentPasswordTextField\" destination=\"Hxs-l7-sUe\" id=\"7M4-yM-7iR\"/>\n                <outlet property=\"passwordMatchWarningLabel\" destination=\"8Q1-1M-Nbw\" id=\"zoU-8u-Wzq\"/>\n                <outlet property=\"passwordTextField\" destination=\"aJb-tK-xZG\" id=\"uxq-O4-p2R\"/>\n                <outlet property=\"verifyPasswordTextField\" destination=\"PV4-XS-O11\" id=\"kEx-dx-maM\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Change Password\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <rect key=\"contentRect\" x=\"509\" y=\"291\" width=\"503\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"503\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SaB-7D-bdO\">\n                        <rect key=\"frame\" x=\"20\" y=\"180\" width=\"68\" height=\"70\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"68\" id=\"PDv-UI-d3T\"/>\n                            <constraint firstAttribute=\"height\" constant=\"70\" id=\"hym-ip-atf\"/>\n                        </constraints>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"icon_128x128\" id=\"1dt-8T-NuJ\"/>\n                    </imageView>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1eo-Mo-pn0\">\n                        <rect key=\"frame\" x=\"100\" y=\"196\" width=\"385\" height=\"37\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"381\" id=\"5Jv-xh-ZxU\"/>\n                            <constraint firstAttribute=\"height\" constant=\"37\" id=\"B9i-zC-Z8E\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"To change your password, enter in the current password, a new password, and verify the new password.\" id=\"Po9-7m-fhL\">\n                            <font key=\"font\" metaFont=\"systemBold\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lVw-0x-O6r\">\n                        <rect key=\"frame\" x=\"69\" y=\"92\" width=\"97\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"New Password:\" id=\"maC-rJ-Z1l\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aJb-tK-xZG\">\n                        <rect key=\"frame\" x=\"172\" y=\"89\" width=\"309\" height=\"21\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"21\" id=\"4pP-kf-GWa\"/>\n                            <constraint firstAttribute=\"width\" constant=\"309\" id=\"UL7-XT-SkO\"/>\n                        </constraints>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"yRi-4M-jri\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                        <connections>\n                            <outlet property=\"nextKeyView\" destination=\"PV4-XS-O11\" id=\"qPC-L3-Zuv\"/>\n                        </connections>\n                    </secureTextField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OXa-fp-R7n\">\n                        <rect key=\"frame\" x=\"31\" y=\"66\" width=\"135\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Verify New Password:\" id=\"Qtw-vQ-aSu\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PV4-XS-O11\">\n                        <rect key=\"frame\" x=\"172\" y=\"63\" width=\"309\" height=\"21\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"21\" id=\"ByD-eM-GWl\"/>\n                            <constraint firstAttribute=\"width\" constant=\"309\" id=\"snU-JF-wK0\"/>\n                        </constraints>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"ccj-hi-Vzx\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                        <connections>\n                            <outlet property=\"nextKeyView\" destination=\"vhg-os-HMJ\" id=\"GAA-eL-Zrl\"/>\n                        </connections>\n                    </secureTextField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vhg-os-HMJ\">\n                        <rect key=\"frame\" x=\"411\" y=\"13\" width=\"79\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Update\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Rxq-NW-OfD\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"changePasswordButtonPressed:\" target=\"-2\" id=\"oi8-hD-VXm\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HVm-aM-bnd\">\n                        <rect key=\"frame\" x=\"337\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"QgK-2X-noe\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"gRN-nc-l4R\"/>\n                        </connections>\n                    </button>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8Q1-1M-Nbw\">\n                        <rect key=\"frame\" x=\"151\" y=\"152\" width=\"282\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"New Password and Verify do not match!\" id=\"Iph-k3-qYQ\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QHr-rf-rsn\">\n                        <rect key=\"frame\" x=\"50\" y=\"119\" width=\"116\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Current Password:\" id=\"gXk-2W-s0L\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hxs-l7-sUe\">\n                        <rect key=\"frame\" x=\"172\" y=\"116\" width=\"309\" height=\"21\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"309\" id=\"Gek-ts-MI4\"/>\n                            <constraint firstAttribute=\"height\" constant=\"21\" id=\"h5B-6b-LRh\"/>\n                        </constraints>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"LtI-dp-7gI\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                        <connections>\n                            <outlet property=\"nextKeyView\" destination=\"aJb-tK-xZG\" id=\"Ik0-CJ-rh1\"/>\n                        </connections>\n                    </secureTextField>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"leading\" secondItem=\"lVw-0x-O6r\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"0T2-TR-TFZ\"/>\n                    <constraint firstItem=\"lVw-0x-O6r\" firstAttribute=\"trailing\" secondItem=\"QHr-rf-rsn\" secondAttribute=\"trailing\" id=\"6La-Ig-kuP\"/>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"trailing\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"trailing\" id=\"EKQ-9R-hW1\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"HVm-aM-bnd\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"Fge-qu-iyl\"/>\n                    <constraint firstItem=\"SaB-7D-bdO\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"Gaa-75-Fxd\"/>\n                    <constraint firstItem=\"SaB-7D-bdO\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"IOT-7G-F3O\"/>\n                    <constraint firstItem=\"PV4-XS-O11\" firstAttribute=\"trailing\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"trailing\" id=\"K1a-cn-13G\"/>\n                    <constraint firstItem=\"lVw-0x-O6r\" firstAttribute=\"trailing\" secondItem=\"OXa-fp-R7n\" secondAttribute=\"trailing\" id=\"Lc5-DL-dCU\"/>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"trailing\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"trailing\" id=\"Nds-5v-lkB\"/>\n                    <constraint firstItem=\"PV4-XS-O11\" firstAttribute=\"leading\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"leading\" id=\"Sv2-6y-1wf\"/>\n                    <constraint firstItem=\"vhg-os-HMJ\" firstAttribute=\"leading\" secondItem=\"HVm-aM-bnd\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"Tqf-vK-Q8b\"/>\n                    <constraint firstItem=\"PV4-XS-O11\" firstAttribute=\"top\" secondItem=\"aJb-tK-xZG\" secondAttribute=\"bottom\" constant=\"5\" id=\"a2D-pt-c0G\"/>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"leading\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"leading\" id=\"cUV-gO-5aT\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"vhg-os-HMJ\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"dyT-kL-uoW\"/>\n                    <constraint firstItem=\"OXa-fp-R7n\" firstAttribute=\"trailing\" secondItem=\"QHr-rf-rsn\" secondAttribute=\"trailing\" id=\"esl-rI-VuN\"/>\n                    <constraint firstItem=\"lVw-0x-O6r\" firstAttribute=\"baseline\" secondItem=\"aJb-tK-xZG\" secondAttribute=\"baseline\" id=\"iTn-Cd-ZiM\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"aJb-tK-xZG\" secondAttribute=\"trailing\" constant=\"22\" id=\"jhz-ZB-nBn\"/>\n                    <constraint firstItem=\"1eo-Mo-pn0\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"37\" id=\"jrf-rT-OsW\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"lVw-0x-O6r\" secondAttribute=\"bottom\" constant=\"92\" id=\"k7U-eJ-2Pq\"/>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"leading\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"leading\" id=\"owb-hc-ufg\"/>\n                    <constraint firstItem=\"QHr-rf-rsn\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"52\" id=\"qRq-cX-2ku\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"vhg-os-HMJ\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"rmd-P5-foh\"/>\n                    <constraint firstItem=\"OXa-fp-R7n\" firstAttribute=\"top\" secondItem=\"lVw-0x-O6r\" secondAttribute=\"bottom\" constant=\"10\" id=\"sYd-zg-QzX\"/>\n                    <constraint firstItem=\"1eo-Mo-pn0\" firstAttribute=\"leading\" secondItem=\"SaB-7D-bdO\" secondAttribute=\"trailing\" constant=\"14\" id=\"se9-aI-mHv\"/>\n                    <constraint firstItem=\"aJb-tK-xZG\" firstAttribute=\"top\" secondItem=\"Hxs-l7-sUe\" secondAttribute=\"bottom\" constant=\"6\" id=\"wiw-ha-Key\"/>\n                    <constraint firstItem=\"lVw-0x-O6r\" firstAttribute=\"top\" secondItem=\"QHr-rf-rsn\" secondAttribute=\"bottom\" constant=\"11\" id=\"yLC-Jv-mkq\"/>\n                    <constraint firstItem=\"lVw-0x-O6r\" firstAttribute=\"trailing\" secondItem=\"QHr-rf-rsn\" secondAttribute=\"trailing\" id=\"yV0-1i-bGJ\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"4.5\" y=\"190\"/>\n        </window>\n    </objects>\n    <resources>\n        <image name=\"icon_128x128\" width=\"128\" height=\"128\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCreds/VerifyLocalPasswordWindowController.swift",
    "content": "//\n//  LoginPasswordWindowController.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/4/22.\n//\n\nimport Cocoa\nclass VerifyLocalPasswordWindowController: NSWindowController, DSQueryable {\n\n    enum LocalUsernamePasswordResult {\n        case success(LocalAdminCredentials?)\n        case accountResetRequested(LocalAdminCredentials?)\n        case userCancelled\n        case error(String)\n    }\n\n\n    @IBOutlet weak var passwordTextField: NSSecureTextField!\n    @IBOutlet weak var adminUsernameTextField: NSTextField!\n    @IBOutlet weak var adminPasswordTextField: NSSecureTextField!\n    @IBOutlet weak var adminCredentialsWindow: NSWindow!\n    @IBOutlet weak var resetButton: NSButton!\n    @IBOutlet weak var resetText: NSTextField!\n    @IBOutlet weak var resetTitle: NSTextField!\n\n    @IBOutlet weak var usernameTextField: NSTextField!\n    var showResetButton = true\n    var showResetText = true\n    var shouldPromptForAdmin=false\n    var passwordEntered:String?\n    var resetKeychain = false\n    var adminUsername:String?\n    var adminPassword:String?\n    var currentUsername:String?\n\n    var isAccountLocked:Bool=false\n\n\n    override var windowNibName: NSNib.Name {\n\n        return \"VerifyLocalPasswordWindowController\"\n    }\n    override func awakeFromNib() {\n        if isAccountLocked {\n            resetTitle.stringValue=\"Unlock Account\"\n            resetText.stringValue=\"The user account is locked.  You can wait for the account to unlock or reset the password by clicking the Reset button below.\"\n\n            if let accountLockedPasswordDialogTitle = DefaultsOverride.standardOverride.string(forKey: PrefKeys.accountLockedPasswordDialogTitle.rawValue),accountLockedPasswordDialogTitle.count>0{\n                resetTitle.stringValue=accountLockedPasswordDialogTitle\n            }\n            if let accountLockedPasswordDialogText = DefaultsOverride.standardOverride.string(forKey: PrefKeys.accountLockedPasswordDialogText.rawValue),accountLockedPasswordDialogText.count>0{\n                resetText.stringValue=accountLockedPasswordDialogText\n            }\n\n        }\n\n        resetButton.isHidden = !showResetButton\n        resetText.isHidden = !showResetText\n        if let currentUsername = currentUsername {\n            usernameTextField.stringValue = currentUsername\n        }\n\n        if let resetPasswordDialogTitle = DefaultsOverride.standardOverride.string(forKey: PrefKeys.resetPasswordDialogTitle.rawValue), resetPasswordDialogTitle.count>0{\n\n            resetTitle.stringValue=resetPasswordDialogTitle\n        }\n\n    }\n    func promptForLocalAccountAndChangePassword(username:String, newPassword:String?, shouldUpdatePassword:Bool, showResetButton:Bool=true) -> LocalUsernamePasswordResult {\n        currentUsername = username\n        if newPassword == nil {\n         TCSLogWithMark(\"new password is nil\")\n        }\n        self.showResetButton = showResetButton\n        window?.canBecomeVisibleWithoutLogin=true\n        window?.isMovable = true\n        window?.canBecomeVisibleWithoutLogin = true\n        window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n\n        var isDone = false\n        while (!isDone){\n            DispatchQueue.main.async{\n                TCSLogWithMark(\"resetting level\")\n                self.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n            }\n\n            let response = NSApp.runModal(for: window!)\n            window?.close()\n\n            if response == .cancel {\n                isDone=true\n                TCSLogWithMark(\"User cancelled resetting keychain or entering password.\")\n                return .userCancelled\n\n            }\n            if resetKeychain == true { //user clicked reset\n                isDone=true\n\n                if let adminUsername = adminUsername,\n                   let adminPassword = adminPassword {\n                    return .accountResetRequested(LocalAdminCredentials(username: adminUsername, password: adminPassword))\n                }\n                return .error(\"no admin username or password set\")\n            }\n            else {\n                TCSLogWithMark(\"user gave old password. checking...\")\n                let passwordEntered = self.passwordEntered\n                guard let passwordEntered = passwordEntered else {\n                    TCSLogWithMark(\"No password entered, looping...\")\n\n                    continue\n                }\n\n                let isValidPassword = PasswordUtils.isLocalPasswordValid(userName: username, userPass: passwordEntered)\n                switch isValidPassword {\n                case .success:\n                    TCSLogWithMark(\"Password check successful\")\n                    let localUser = try? PasswordUtils.getLocalRecord(username)\n                    guard let localUser = localUser else {\n                        TCSLogErrorWithMark(\"invalid local user\")\n                        return .error(\"The local user \\(username) could not be found\")\n                    }\n                    TCSLogWithMark()\n\n                    if shouldUpdatePassword==false {\n                        TCSLogWithMark(\"shouldUpdatePassword set to false\")\n                        return .success(LocalAdminCredentials(username:username,password: passwordEntered))\n                    }\n                    TCSLogWithMark()\n                    guard let newPassword = newPassword else {\n                        TCSLogWithMark(\"Password not provided for changing\")\n                        return .error(\"Password not provided for changing\")\n\n                    }\n                    TCSLogWithMark()\n                    do {\n                        TCSLogWithMark(\"attempting to change password\")\n\n                        try localUser.changePassword(passwordEntered, toPassword: newPassword)\n                    }\n                    catch {\n                        TCSLogErrorWithMark(\"Error setting local password to cloud password\")\n\n                        return .error(\"Error setting local password to cloud password: \\(error.localizedDescription)\")\n                    }\n                    isDone=true\n                    window?.close()\n                    TCSLogWithMark(\"returning success with local password\")\n                    return .success(LocalAdminCredentials(username:username,password: passwordEntered))\n                default:\n                    window?.shake(self)\n\n                }\n            }\n        }\n    }\n\n    \n    override func windowDidLoad() {\n        super.windowDidLoad()\n        TCSLogWithMark()\n    }\n  \n\n    @IBAction func removeKeychainButtonPressed(_ sender: Any) {\n\n        TCSLogWithMark()\n        //override or prefs has admin username / password so don't prompt\n        if let _ = adminUsername, let _ = adminPassword{\n            TCSLogWithMark()\n            if self.window?.isModalPanel==true {\n                TCSLogWithMark()\n                resetKeychain=true\n                NSApp.stopModal(withCode: .OK)\n            }\n            TCSLogWithMark()\n\n        }\n        else { //prompt\n            TCSLogWithMark()\n            self.adminCredentialsWindow?.canBecomeVisibleWithoutLogin = true\n\n            self.window?.beginSheet(adminCredentialsWindow) { res in\n                if res == .OK {\n                    self.resetKeychain=true\n                    TCSLogWithMark(\"got admin username and password\")\n                    self.window?.endSheet(self.adminCredentialsWindow)\n\n                    if self.window?.isModalPanel==true {\n                        TCSLogWithMark(\"Prompt for local password window is modal so stopping\")\n\n                        NSApp.stopModal(withCode: .OK)\n                    }\n\n\n\n                }\n                else { //user hit cancel\n                    TCSLogWithMark(\"cancelled admin\")\n                    self.window?.endSheet(self.adminCredentialsWindow)\n                }\n            }\n        }\n\n    }\n    @IBAction func updateButtonPressed(_ sender: Any) {\n        passwordEntered=passwordTextField.stringValue\n\n        if self.window?.isModalPanel==true {\n            NSApp.stopModal(withCode: .OK)\n\n        }\n    }\n    @IBAction func cancelButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            NSApp.stopModal(withCode: .cancel)\n        }\n    }\n\n    @IBAction func adminCancelButtonPressed(_ sender: Any) {\n\n        window?.endSheet(adminCredentialsWindow, returnCode: .cancel)\n\n    }\n    @IBAction func adminResetButtonPressed(_ sender: Any) {\n        self.adminUsername=nil\n        self.adminPassword=nil\n        let adminUserName = adminUsernameTextField.stringValue\n        let adminPassword = adminPasswordTextField.stringValue\n\n        if adminUserName == \"\" {\n\n            adminUsernameTextField.shake(self)\n            return\n        }\n\n        else if adminPassword == \"\" {\n            adminPasswordTextField.shake(self)\n            return\n\n        }\n        let user = try? getLocalRecord(adminUserName)\n\n        if user == nil {\n\n            adminUsernameTextField.shake(self)\n            return\n        }\n\n        let res = PasswordUtils.isLocalPasswordValid(userName: adminUserName, userPass: adminPassword)\n        switch res {\n\n        case .success:\n            self.adminUsername=adminUserName\n            self.adminPassword=adminPassword\n            window?.endSheet(adminCredentialsWindow, returnCode: .OK)\n            \n        default:\n            adminPasswordTextField.shake(self)\n\n\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "XCreds/VerifyLocalPasswordWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"VerifyLocalPasswordWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"adminCredentialsWindow\" destination=\"1CI-8H-5ew\" id=\"1aY-ev-BST\"/>\n                <outlet property=\"adminPasswordTextField\" destination=\"Vej-yJ-L7m\" id=\"Add-Hz-899\"/>\n                <outlet property=\"adminUsernameTextField\" destination=\"A7r-Vp-fPL\" id=\"eDj-O0-Rul\"/>\n                <outlet property=\"passwordTextField\" destination=\"uxk-Kc-Ey2\" id=\"NeY-1n-1d3\"/>\n                <outlet property=\"resetButton\" destination=\"vfc-Lt-21D\" id=\"yz0-10-auQ\"/>\n                <outlet property=\"resetText\" destination=\"qCR-tF-te2\" id=\"uuK-CN-MNh\"/>\n                <outlet property=\"resetTitle\" destination=\"NQJ-DJ-Vk6\" id=\"wP4-XO-Ieg\"/>\n                <outlet property=\"usernameTextField\" destination=\"lCq-bJ-BnB\" id=\"aPa-bA-D30\"/>\n                <outlet property=\"window\" destination=\"y1s-aj-r0T\" id=\"ZcP-JQ-mk1\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" titleVisibility=\"hidden\" id=\"y1s-aj-r0T\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"537\" y=\"504\" width=\"497\" height=\"206\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"keP-aO-VT7\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"497\" height=\"206\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GHv-Is-FVt\">\n                        <rect key=\"frame\" x=\"14\" y=\"138\" width=\"68\" height=\"68\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"68\" id=\"1Oa-2H-d1T\"/>\n                            <constraint firstAttribute=\"height\" constant=\"68\" id=\"UrF-51-RMG\"/>\n                        </constraints>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"icon_128x128\" id=\"i1e-r0-Waa\"/>\n                    </imageView>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NQJ-DJ-Vk6\">\n                        <rect key=\"frame\" x=\"94\" y=\"174\" width=\"385\" height=\"32\"/>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"Please enter your local login password to sync your cloud password and login.\" id=\"Kf4-Rd-r7U\">\n                            <font key=\"font\" metaFont=\"systemBold\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qCR-tF-te2\">\n                        <rect key=\"frame\" x=\"94\" y=\"134\" width=\"383\" height=\"32\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"379\" id=\"FQ6-pb-WMe\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"If you do not know your local login password, click Reset and enter in a local admin user and password.\" id=\"raI-nS-JM6\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vgp-AS-5WP\">\n                        <rect key=\"frame\" x=\"94\" y=\"86\" width=\"66\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Password:\" id=\"gjN-RB-inR\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uxk-Kc-Ey2\">\n                        <rect key=\"frame\" x=\"166\" y=\"83\" width=\"309\" height=\"21\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"C9u-SH-tmE\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                    </secureTextField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gTn-ws-NVT\">\n                        <rect key=\"frame\" x=\"405\" y=\"13\" width=\"79\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Update\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Koa-hU-IdG\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"updateButtonPressed:\" target=\"-2\" id=\"0Yw-3m-Zc7\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Wv-NR-a6r\">\n                        <rect key=\"frame\" x=\"331\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"yk2-3t-h59\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"qAB-hi-1zy\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vfc-Lt-21D\">\n                        <rect key=\"frame\" x=\"89\" y=\"13\" width=\"69\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Reset\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"AFi-y5-fTi\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"removeKeychainButtonPressed:\" target=\"-2\" id=\"T0U-p4-KUW\"/>\n                        </connections>\n                    </button>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lCq-bJ-BnB\">\n                        <rect key=\"frame\" x=\"166\" y=\"110\" width=\"311\" height=\"16\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"307\" id=\"MGo-Lv-j2g\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" id=\"jMD-Ug-i8F\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vGB-Ib-lEa\">\n                        <rect key=\"frame\" x=\"90\" y=\"110\" width=\"70\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Username:\" id=\"ZuH-Ng-Fmh\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"NQJ-DJ-Vk6\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"0JO-yj-BKh\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"gTn-ws-NVT\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"1PF-dv-8LN\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"vfc-Lt-21D\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"1zB-rS-iwS\"/>\n                    <constraint firstItem=\"GHv-Is-FVt\" firstAttribute=\"top\" secondItem=\"keP-aO-VT7\" secondAttribute=\"top\" id=\"4kl-rZ-SsF\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"gTn-ws-NVT\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"Ca3-N3-wr2\"/>\n                    <constraint firstItem=\"qCR-tF-te2\" firstAttribute=\"leading\" secondItem=\"GHv-Is-FVt\" secondAttribute=\"trailing\" constant=\"14\" id=\"Fv4-6V-A3b\"/>\n                    <constraint firstItem=\"vfc-Lt-21D\" firstAttribute=\"leading\" secondItem=\"keP-aO-VT7\" secondAttribute=\"leading\" constant=\"96\" id=\"Gmn-zf-2fn\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"0Wv-NR-a6r\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"MBG-D2-E15\"/>\n                    <constraint firstItem=\"uxk-Kc-Ey2\" firstAttribute=\"leading\" secondItem=\"Vgp-AS-5WP\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"O4r-Zr-Xu3\"/>\n                    <constraint firstItem=\"GHv-Is-FVt\" firstAttribute=\"leading\" secondItem=\"keP-aO-VT7\" secondAttribute=\"leading\" constant=\"14\" id=\"OHy-xI-hcN\"/>\n                    <constraint firstItem=\"NQJ-DJ-Vk6\" firstAttribute=\"top\" secondItem=\"keP-aO-VT7\" secondAttribute=\"top\" id=\"OL0-2c-nQu\"/>\n                    <constraint firstItem=\"uxk-Kc-Ey2\" firstAttribute=\"top\" secondItem=\"lCq-bJ-BnB\" secondAttribute=\"bottom\" constant=\"6\" id=\"Q9u-Mj-u8I\"/>\n                    <constraint firstItem=\"Vgp-AS-5WP\" firstAttribute=\"top\" secondItem=\"vGB-Ib-lEa\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"QdQ-GZ-fdP\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"uxk-Kc-Ey2\" secondAttribute=\"bottom\" constant=\"83\" id=\"YoP-Id-BDz\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"lCq-bJ-BnB\" secondAttribute=\"trailing\" constant=\"22\" id=\"cwL-Do-eW5\"/>\n                    <constraint firstItem=\"uxk-Kc-Ey2\" firstAttribute=\"top\" secondItem=\"lCq-bJ-BnB\" secondAttribute=\"bottom\" constant=\"6\" id=\"kSZ-Qf-EzS\"/>\n                    <constraint firstItem=\"Vgp-AS-5WP\" firstAttribute=\"leading\" secondItem=\"keP-aO-VT7\" secondAttribute=\"leading\" constant=\"96\" id=\"ln4-et-saI\"/>\n                    <constraint firstItem=\"qCR-tF-te2\" firstAttribute=\"top\" secondItem=\"NQJ-DJ-Vk6\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"lyd-HN-U6K\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"uxk-Kc-Ey2\" secondAttribute=\"trailing\" constant=\"22\" id=\"mFj-nB-xVr\"/>\n                    <constraint firstItem=\"vGB-Ib-lEa\" firstAttribute=\"leading\" secondItem=\"keP-aO-VT7\" secondAttribute=\"leading\" constant=\"92\" id=\"obY-9z-0eB\"/>\n                    <constraint firstItem=\"gTn-ws-NVT\" firstAttribute=\"leading\" secondItem=\"0Wv-NR-a6r\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"r3F-ci-tu2\"/>\n                    <constraint firstItem=\"vGB-Ib-lEa\" firstAttribute=\"top\" secondItem=\"qCR-tF-te2\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"uI3-AI-pXw\"/>\n                    <constraint firstItem=\"lCq-bJ-BnB\" firstAttribute=\"leading\" secondItem=\"vGB-Ib-lEa\" secondAttribute=\"trailing\" constant=\"10\" id=\"vAM-Vb-Fc3\"/>\n                    <constraint firstItem=\"NQJ-DJ-Vk6\" firstAttribute=\"leading\" secondItem=\"GHv-Is-FVt\" secondAttribute=\"trailing\" constant=\"14\" id=\"wyR-MN-cCw\"/>\n                    <constraint firstItem=\"Vgp-AS-5WP\" firstAttribute=\"top\" secondItem=\"vGB-Ib-lEa\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"xRV-HR-ZBd\"/>\n                    <constraint firstItem=\"lCq-bJ-BnB\" firstAttribute=\"top\" secondItem=\"qCR-tF-te2\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"z0K-yN-5Oi\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"WxA-Qo-qaN\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"135.5\" y=\"263\"/>\n        </window>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" titleVisibility=\"hidden\" id=\"1CI-8H-5ew\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"537\" y=\"504\" width=\"503\" height=\"226\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"9wN-Ld-7y9\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"503\" height=\"226\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xxe-1S-Zna\">\n                        <rect key=\"frame\" x=\"20\" y=\"138\" width=\"68\" height=\"68\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"icon_128x128\" id=\"POn-cP-I3n\"/>\n                    </imageView>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AEQ-FX-hY0\">\n                        <rect key=\"frame\" x=\"100\" y=\"168\" width=\"385\" height=\"38\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"Please enter a local administrator password to reset the user's account.\" id=\"qqZ-3u-MDh\">\n                            <font key=\"font\" metaFont=\"systemBold\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dRz-I7-gTV\">\n                        <rect key=\"frame\" x=\"94\" y=\"106\" width=\"70\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Username:\" id=\"GRh-vK-MaB\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A7r-Vp-fPL\">\n                        <rect key=\"frame\" x=\"172\" y=\"103\" width=\"309\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"dGW-6n-oBR\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3Cv-XF-qcP\">\n                        <rect key=\"frame\" x=\"100\" y=\"79\" width=\"66\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Password:\" id=\"uze-MC-XH3\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vej-yJ-L7m\">\n                        <rect key=\"frame\" x=\"172\" y=\"76\" width=\"309\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"yFQ-uv-jJr\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                    </secureTextField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lz5-lN-SaL\">\n                        <rect key=\"frame\" x=\"421\" y=\"13\" width=\"69\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Reset\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"H7H-CH-T4d\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"adminResetButtonPressed:\" target=\"-2\" id=\"NkZ-to-YVx\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c3P-E7-EL1\">\n                        <rect key=\"frame\" x=\"347\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"fkE-3E-eCB\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"adminCancelButtonPressed:\" target=\"-2\" id=\"4Uu-S8-IJk\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"Lz5-lN-SaL\" firstAttribute=\"leading\" secondItem=\"c3P-E7-EL1\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"C4o-sr-KbQ\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"c3P-E7-EL1\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"J8P-p3-zsV\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"Lz5-lN-SaL\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"UIg-q7-AP7\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Lz5-lN-SaL\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"Uil-qM-WHE\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"oG5-CP-lwV\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"79.5\" y=\"-120\"/>\n        </window>\n    </objects>\n    <resources>\n        <image name=\"icon_128x128\" width=\"128\" height=\"128\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCreds/VerifyOIDCPassword.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"VerifyLocalPasswordWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"passwordTextField\" destination=\"uxk-Kc-Ey2\" id=\"NeY-1n-1d3\"/>\n                <outlet property=\"window\" destination=\"y1s-aj-r0T\" id=\"ZcP-JQ-mk1\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" titleVisibility=\"hidden\" id=\"y1s-aj-r0T\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"519\" y=\"431\" width=\"497\" height=\"189\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"keP-aO-VT7\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"497\" height=\"189\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GHv-Is-FVt\">\n                        <rect key=\"frame\" x=\"20\" y=\"121\" width=\"68\" height=\"68\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"NSApplicationIcon\" id=\"i1e-r0-Waa\"/>\n                    </imageView>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NQJ-DJ-Vk6\">\n                        <rect key=\"frame\" x=\"94\" y=\"118\" width=\"385\" height=\"64\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" id=\"Kf4-Rd-r7U\">\n                            <font key=\"font\" metaFont=\"systemBold\"/>\n                            <string key=\"title\">Your local login password and keychain will now be updated to your cloud password. Please enter in your cloud password to verify it is correct.</string>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"or1-FG-c7l\">\n                        <rect key=\"frame\" x=\"96\" y=\"108\" width=\"218\" height=\"14\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"To allow this, enter your cloud password.\" id=\"NBo-xg-6iv\">\n                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vgp-AS-5WP\">\n                        <rect key=\"frame\" x=\"96\" y=\"76\" width=\"66\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Password:\" id=\"gjN-RB-inR\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uxk-Kc-Ey2\">\n                        <rect key=\"frame\" x=\"168\" y=\"73\" width=\"309\" height=\"21\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"C9u-SH-tmE\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                    </secureTextField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gTn-ws-NVT\">\n                        <rect key=\"frame\" x=\"405\" y=\"13\" width=\"79\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Update\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Koa-hU-IdG\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"updateButtonPressed:\" target=\"-2\" id=\"0Yw-3m-Zc7\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Wv-NR-a6r\">\n                        <rect key=\"frame\" x=\"291\" y=\"13\" width=\"115\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Don't Update\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"yk2-3t-h59\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"qAB-hi-1zy\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"gTn-ws-NVT\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"1PF-dv-8LN\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"gTn-ws-NVT\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"Ca3-N3-wr2\"/>\n                    <constraint firstItem=\"gTn-ws-NVT\" firstAttribute=\"leading\" secondItem=\"0Wv-NR-a6r\" secondAttribute=\"trailing\" constant=\"13\" id=\"cuy-Mu-Sgh\"/>\n                    <constraint firstItem=\"0Wv-NR-a6r\" firstAttribute=\"centerY\" secondItem=\"gTn-ws-NVT\" secondAttribute=\"centerY\" id=\"plG-CO-NAT\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"WxA-Qo-qaN\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"122.5\" y=\"341.5\"/>\n        </window>\n    </objects>\n    <resources>\n        <image name=\"NSApplicationIcon\" width=\"32\" height=\"32\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCreds/VerifyOIDCPasswordWindowController.swift",
    "content": "//\n//  VerifyOIDCPassword.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/4/22.\n//\n\nimport Cocoa\n\nclass VerifyOIDCPasswordWindowController: NSWindowController {\n\n    @IBOutlet weak var passwordTextField: NSSecureTextField!\n\n    var password:String?\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n    }\n    \n    @IBAction func updateButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            password=passwordTextField.stringValue\n            NSApp.stopModal(withCode: .OK)\n\n        }\n    }\n    @IBAction func cancelButtonPressed(_ sender: Any) {\n        if self.window?.isModalPanel==true {\n            NSApp.stopModal(withCode: .cancel)\n            self.window?.close()\n        }\n    }\n}\n"
  },
  {
    "path": "XCreds/View+Shake.swift",
    "content": "//\n//  NSView+Shake.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/4/22.\n//\n//https://onmyway133.com/posts/how-to-shake-nsview-in-macos/\n\nimport Foundation\nimport Cocoa\n\nextension NSView {\n    @objc func shake(_ sender: AnyObject?) {\n        let midX = self.layer?.position.x ?? 0\n        let midY = self.layer?.position.y ?? 0\n\n        let animation = CABasicAnimation(keyPath: \"position\")\n        animation.duration = 0.1\n        animation.repeatCount = 2\n        animation.autoreverses = true\n        animation.fromValue = CGPoint(x: midX - 10, y: midY)\n        animation.toValue = CGPoint(x: midX + 10, y: midY)\n        self.layer?.add(animation, forKey: \"position\")\n    }\n\n}\n"
  },
  {
    "path": "XCreds/WebViewController.swift",
    "content": "//\n//  WebView.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\n@preconcurrency import WebKit\nimport OIDCLite\n@available(macOS, deprecated: 11)\nclass WebViewController: NSViewController, TokenManagerFeedbackDelegate {\n\n    struct WebViewControllerError:Error {\n\n        var errorDescription: String\n\n    }\n    func invalidCredentials() {\n        \n    }\n    \n    func authenticationSuccessful() {\n        \n    }\n\n    func credentialsUpdated(_ credentials: Creds) {\n        TCSLogWithMark()\n        var credWithPass = credentials\n        credWithPass.password = self.password\n//        NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"credentials\":credWithPass]\n//                       )\n\n        updateCredentialsFeedbackDelegate?.credentialsUpdated(credWithPass)\n    }\n  \n    @IBOutlet weak var refreshTitleTextField: NSTextField?\n    @IBOutlet weak var webView: WKWebView!\n    @IBOutlet weak var cancelButton: NSButton!\n    @available(macOS, deprecated: 11)\n    var tokenManager=TokenManager()\n    var password:String?\n    var updateCredentialsFeedbackDelegate: UpdateCredentialsFeedbackProtocol?\n\n    override func viewWillAppear() {\n        if let refreshTitleTextField = self.refreshTitleTextField {\n            refreshTitleTextField.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowRefreshBanner.rawValue)\n\n\n            if let refreshBannerText = DefaultsOverride.standardOverride.string(forKey: PrefKeys.refreshBannerText.rawValue) {\n                self.refreshTitleTextField?.stringValue = refreshBannerText\n            }\n\n        }\n\n    }\n    func loadPage() {\n        Task{ @MainActor in\n            TCSLogWithMark(\"Clearing cookies\")\n            self.webView.cleanAllCookies()\n            TCSLogWithMark()\n            let licenseState = LicenseChecker().currentLicenseState()\n\n            self.webView.navigationDelegate = self\n            self.tokenManager.feedbackDelegate=self\n            //            TokenManager.shared.oidc().delegate = self\n            self.clearCookies()\n            TCSLogWithMark()\n            switch licenseState {\n\n            case .valid(let sec):\n                let daysRemaining = Int(sec/(24*60*60))\n                TCSLogWithMark(\"valid license. Days remaining: \\(daysRemaining) (\\(sec) seconds)\")\n                if daysRemaining < 14 {\n                }\n                break;\n\n            case .trial(_):\n                break\n            case .invalid,.trialExpired, .expired:\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n                if let bundle = bundle {\n                    let loadPageURL = bundle.url(forResource: \"errorpage\", withExtension: \"html\")\n                    if let loadPageURL = loadPageURL {\n                        self.webView.load(URLRequest(url:loadPageURL))\n\n                    }\n                }\n                return\n\n            }\n\n            NotificationCenter.default.addObserver(self, selector: #selector(self.connectivityStatusHandler(notification:)), name: NSNotification.Name.connectivityStatus, object: nil)\n\n//            let discoveryURL = DefaultsOverride.standardOverride.string(forKey: PrefKeys.discoveryURL.rawValue)\n\n            NetworkMonitor.shared.startMonitoring()\n            TCSLogWithMark(\"Network monitor: adding connectivity status change observer\")\n\n            do {\n//                guard let discoveryURL = discoveryURL else {\n//                    TCSLogWithMark(\"discoveryURL not defined\");\n//\n//                    throw WebViewControllerError(errorDescription: \"The discovery URL not defined in settings. Verify that settings have been configured and scoped to the system (not user).\")\n//                }\n                TCSLogWithMark(\"getOidcLoginURL\");\n\n                let url = try await self.getOidcLoginURL()\n                TCSLogWithMark(\"URL: \\(url)\");\n\n                self.webView.load(URLRequest(url: url))\n                NetworkMonitor.shared.stopMonitoring()\n            }\n            catch {\n                TCSLogWithMark(\"error: \\(error)\");\n\n                let loadPageTitle = DefaultsOverride.standardOverride.string(forKey: PrefKeys.loadPageTitle.rawValue)?.stripped ?? \"loadPageTitle\"\n\n                var loadPageInfo = DefaultsOverride.standardOverride.string(forKey: PrefKeys.loadPageInfo.rawValue)?.stripped ?? \"loadPageInfo\"\n\n\n                loadPageInfo = loadPageInfo + \"<br><br>\" + (error as? WebViewControllerError ?? WebViewControllerError(errorDescription: error.localizedDescription)).errorDescription\n\n                let html = \"<!DOCTYPE html><html><head><style>.center-screen { display: flex;flex-direction: column;justify-content: center;align-items: center;text-align: center;min-height: 100vh;}</style></head><body><div class=\\\"center-screen\\\"> <h1>\\(loadPageTitle)</h1><p>\\(loadPageInfo)</p></div></body></html>\"\n\n                self.webView.loadHTMLString(html, baseURL: nil)\n\n            }\n        }\n    }\n\n    @objc func connectivityStatusHandler(notification: Notification) {\n        TCSLogWithMark(\"Network monitor: handling connectivity status update\")\n\n        Task {\n            try? await tokenManager.oidc().getEndpoints()\n            TCSLogWithMark(\"Refresh webview login\")\n            loadPage()\n        }\n    }\n\n\n\n    private func getOidcLoginURL() async throws -> URL {\n        if let url = try await tokenManager.oidc().createLoginURL() {\n            return url\n        }\n        throw WebViewControllerError(errorDescription: \"Error getting OIDC URL\")\n    }\n\n\n\n    private func clearCookies() {\n        let dataStore = WKWebsiteDataStore.default()\n        dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in\n            dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(),\n                                 for: records,\n                                 completionHandler: {\n                print(\"Removing Cookie\")\n            })\n        }\n\n        if let cookies = HTTPCookieStorage.shared.cookies {\n            for cookie in cookies {\n                HTTPCookieStorage.shared.deleteCookie(cookie)\n            }\n        }\n    }\n   \n    func showErrorMessageAndDeny(_ message:String){\n    }\n    func tokenError(_ err: String) {\n        TCSLogErrorWithMark(\"authFailure: \\(err)\")\n        XCredsAudit().auditError(err)\n\n        //TODO: need to post this?\n        NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"error\":err])\n\n    }\n}\n@available(macOS, deprecated: 11)\nextension WebViewController: WKNavigationDelegate {\n\n    public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {\n\n        let idpHostName = DefaultsOverride.standardOverride.value(forKey: PrefKeys.idpHostName.rawValue)\n        var idpHostNames = DefaultsOverride.standardOverride.value(forKey: PrefKeys.idpHostNames.rawValue)\n\n        if idpHostNames == nil && idpHostName != nil {\n            idpHostNames=[idpHostName]\n        }\n        let passwordElementID:String? = DefaultsOverride.standardOverride.value(forKey: PrefKeys.passwordElementID.rawValue) as? String\n\n        TCSLogWithMark(\"inserting javascript to get password\")\n        webView.evaluateJavaScript(\"result\", completionHandler: { response, error in\n            if error != nil {\n//                TCSLogWithMark(error?.localizedDescription ?? \"unknown error\")\n                TCSLogWithMark(\"password not found\")\n            }\n            else {\n                if let responseDict = response as? NSDictionary, let ids = responseDict[\"ids\"] as? Array<String>, let passwords = responseDict[\"passwords\"] as? Array<String> {\n                    \n                    guard passwords.count > 0 else {\n                        TCSLogWithMark(\"No passwords set\")\n                        return\n                        \n                    }\n\n                    TCSLogWithMark(\"found password elements with ids:\\(ids)\")\n\n                    guard let host = navigationAction.request.url?.host else {\n\n                        return\n                    }\n                    var foundHostname = \"\"\n                    if  let idpHostNames = idpHostNames as? Array<String?>,\n                        idpHostNames.contains(host) {\n                        foundHostname=host\n\n                    }\n                    else if [\"login.microsoftonline.com\", \"login.live.com\", \"accounts.google.com\"].contains(host) || host.contains(\"okta.com\"){\n                        foundHostname=host\n\n                    }\n                    else {\n                        TCSLogWithMark(\"hostname (\\(host)) not matched so not looking for password\")\n                        return\n                    }\n\n                    TCSLogWithMark(\"host matches custom idpHostName \\(foundHostname)\")\n\n\n                    if passwords.count==3, passwords[1]==passwords[2] {\n                        TCSLogWithMark(\"found 3 password fields. so it is a reset password situation\")\n                        TCSLogWithMark(\"========= password set===========\")\n                        self.password=passwords[2]\n                    }\n                    else if passwords.count==2, passwords[0]==passwords[1] {\n                        TCSLogWithMark(\"found 2 password fields. so it is a reset password situation\")\n                        TCSLogWithMark(\"========= password set===========\")\n                        self.password=passwords[1]\n                    }\n                    else if let passwordElementID = passwordElementID{\n                        TCSLogWithMark(\"the id is defined in prefs (\\(passwordElementID)) so seeing if that field is on the page.\")\n\n                    // we have a mapped field defined in prefs so only check this.\n                        if ids.count==1, ids[0]==passwordElementID, passwords.count==1 {\n                            TCSLogWithMark(\"========= password set===========\")\n                            self.password=passwords[0]\n                        }\n                        else {\n\n                            TCSLogWithMark(\"did not find a single password field on the page with the specified ID so not setting password\")\n                        }\n\n                    }\n                    //\n                    else if passwords.count==1 {\n                        TCSLogWithMark(\"found 1 password field on the specified page with the set idpHostName. setting password.\")\n                        TCSLogWithMark(\"========= password set===========\")\n                        self.password=passwords[0]\n\n                    }\n                    else {\n                        TCSLogWithMark(\"No passwords found on page\")\n                    }\n                }\n                else {\n                    \n                    TCSLogWithMark(\"password not set\")\n\n                }\n            }\n        })\n        decisionHandler(.allow)\n\n    }\n\n//    func setupAppearance() {\n//        let screenRect = NSScreen.screens[0].frame\n//\n//        let screenWidth = screenRect.width\n//        let screenHeight = screenRect.height\n//\n//\n//        self.view.frame=NSMakeRect((screenWidth-CGFloat(loginWindowWidth))/2,(screenHeight-CGFloat(loginWindowHeight))/2, CGFloat(loginWindowWidth), CGFloat(loginWindowHeight))\n//        TCSLogWithMark()\n//\n//    }\n    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {\n        //this inserts javascript to copy passwords to a variable. Sometimes the\n        //div gets removed before we can evaluate it so this helps. It works by\n        // attaching to keydown. At each keydown, it attaches to password elements\n        // for keyup. When a key is released, it copies all the passwords to an array\n        // to be read later.\n\n        TCSLogWithMark(\"adding listener for password\")\n        var pathURL:URL?\n        let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n        if let bundle = bundle {\n            TCSLogWithMark()\n            pathURL = bundle.url(forResource: \"get_pw\", withExtension: \"js\")\n            \n        }\n\n        guard let pathURL = pathURL else {\n            TCSLogErrorWithMark(\"get_pw.js not found\")\n            return\n        }\n\n        let javascript = try? String(contentsOf: pathURL, encoding: .utf8)\n\n        guard let javascript = javascript else {\n            return\n        }\n        webView.evaluateJavaScript(javascript, completionHandler: { response, error in\n            if (error != nil){\n                \n                TCSLogWithMark(error?.localizedDescription ?? \"unknown listener error\")\n                if UserDefaults.standard.bool(forKey: \"reloadPageOnError\")==true {\n                    TCSLogWithMark(\"reloading page\")\n                    self.loadPage()\n                }\n            }\n            else {\n                TCSLogWithMark(\"inserted javascript for password setup\")\n            }\n        })\n\n    }\n    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {\n\n\n    }\n\n    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {\n        TCSLogErrorWithMark(error.localizedDescription)\n\n\n    }\n    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {\n        TCSLogWithMark(\"Redirect error. if the error is \\\"Could not connect to the server.\\\", it is probably safe to ignore. If the error is \\\"unsupported URL\\\", please check your redirectURL in prefs matches the one defined in your OIDC app. Error: \\(error.localizedDescription)\")\n    }\n    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {\n        Task{\n            guard let url = webView.url else {\n                return\n            }\n            TCSLogWithMark(\"WebDel:: Did Receive Redirect for: \\(url.absoluteString)\")\n\n            TCSLogWithMark(\"URL: \\(url.absoluteString)\")\n            let redirectURI = try await tokenManager.oidc().redirectURI\n            TCSLogWithMark(\"URL: \\(url.absoluteString)\")\n            TCSLogWithMark(\"redirectURI: \\(redirectURI)\")\n\n            if (url.absoluteString.starts(with: (redirectURI))) {\n                TCSLogWithMark(\"got redirect URI match. separating URL\")\n                var code = \"\"\n                let fullCommand = url.absoluteString\n                let pathParts = fullCommand.components(separatedBy: \"&\")\n                for part in pathParts {\n                    if part.contains(\"code=\") {\n                        TCSLogWithMark(\"found code=. cleaning up.\")\n\n                        code = part.replacingOccurrences(of: redirectURI + \"?\" , with: \"\").replacingOccurrences(of: \"code=\", with: \"\")\n                        TCSLogWithMark(\"getting tokens\")\n\n                        let tokenResponse = try await tokenManager.oidc().getToken(code: code)\n                        TCSLogWithMark(\"got token. Token ID: \\(tokenResponse.idToken ?? \"\" )\")\n\n                        tokenManager.tokenResponse(tokens: tokenResponse)\n                        return\n                    }\n                }\n            }\n        }\n\n    }\n\n    private func queryToDict(query: String) -> [String:String]? {\n        let components = query.components(separatedBy: \"&\")\n        var dictionary = [String:String]()\n\n        for pairs in components {\n            let pair = pairs.components(separatedBy: \"=\")\n            if pair.count == 2 {\n                dictionary[pair[0]] = pair[1]\n            }\n        }\n\n        if dictionary.count == 0 {\n            return nil\n        }\n\n        return dictionary\n    }\n\n\n}\n\n//TODO: Integrate?\n//extension WebViewController: OIDCLiteDelegate {\n//\n////    func authFailure(message: String) {\n////        TCSLogErrorWithMark(\"authFailure: \\(message)\")\n////        NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[:])\n////\n////    }\n//\n//    \n//}\nextension String {\n    func sanitized() -> String {\n        // see for ressoning on charachrer sets https://superuser.com/a/358861\n        let invalidCharacters = CharacterSet(charactersIn: \"\\\\/:*?\\\"<>| \")\n            .union(.newlines)\n            .union(.illegalCharacters)\n            .union(.controlCharacters)\n\n        return self\n            .components(separatedBy: invalidCharacters)\n            .joined(separator: \"\")\n    }\n\n    mutating func sanitize() -> Void {\n        self = self.sanitized()\n    }\n}\nextension WKWebView {\n\n    func cleanAllCookies() {\n        HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)\n        print(\"All cookies deleted\")\n\n        WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in\n            records.forEach { record in\n                WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})\n                print(\"Cookie ::: \\(record) deleted\")\n            }\n        }\n    }\n\n    func refreshCookies() {\n        self.configuration.processPool = WKProcessPool()\n    }\n}\n"
  },
  {
    "path": "XCreds/Window+ForceToFront.swift",
    "content": "//\n//  Window+ForceToFront.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\n\nextension NSWindow {\n    @objc func forceToFrontAndFocus(_ sender: AnyObject?) {\n        NSApp.activate(ignoringOtherApps: true)\n        self.makeKeyAndOrderFront(sender);\n    }\n}\n"
  },
  {
    "path": "XCreds/Window+Shake.swift",
    "content": "//\n//  Window+Shake.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/4/22.\n//\n// https://stackoverflow.com/a/50267597\n// thanks to Mike James https://stackoverflow.com/users/531419/mike-james\nimport Foundation\nimport Cocoa\n\nextension NSWindow {\n    @objc func shake(_ sender: AnyObject?) {\n        let numberOfShakes = 3\n        let durationOfShake = 0.4\n        let vigourOfShake : CGFloat = 0.03\n        let frame : CGRect = (self.frame)\n        let shakeAnimation :CAKeyframeAnimation  = CAKeyframeAnimation()\n\n        let shakePath = CGMutablePath()\n        shakePath.move( to: CGPoint(x:NSMinX(frame), y:NSMinY(frame)))\n\n        for _ in 0...numberOfShakes-1 {\n            shakePath.addLine(to: CGPoint(x:NSMinX(frame) - frame.size.width * vigourOfShake, y:NSMinY(frame)))\n            shakePath.addLine(to: CGPoint(x:NSMinX(frame) + frame.size.width * vigourOfShake, y:NSMinY(frame)))\n        }\n\n        shakePath.closeSubpath()\n        shakeAnimation.path = shakePath\n        shakeAnimation.duration = durationOfShake\n\n        let animations = [NSAnimatablePropertyKey( \"frameOrigin\") : shakeAnimation]\n\n        self.animations = animations\n        self.animator().setFrameOrigin(NSPoint(x: frame.minX, y: frame.minY))\n    }\n}\n"
  },
  {
    "path": "XCreds/XCreds-Bridging-Header.h",
    "content": "//\n//  XCreds-Bridging-Header.h\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\n#ifndef XCreds_Bridging_Header_h\n#define XCreds_Bridging_Header_h\n#import \"SecurityPrivateAPI.h\"\n#import \"XCredsLoginPlugin.h\"\n#import \"TCSKeychain.h\"\n#import \"TCSUnifiedLogger.h\"\n#import \"TCTaskHelper.h\"\n#if !defined(AUTOFILL_TARGET) && !defined(FILEVAULTLOGIN_TARGET) && !defined(FILEVAULTLOGINHELPER_TARGET)\n#import <ProductLicense/ProductLicense.h>\n#endif\n#import \"TCSLoginWindowUtilities.h\"\n#import \"DNSResolver.h\"\n#import \"TCTaskWrapperWithBlocks.h\"\n\n// Kerb bits\n#import \"KerbUtil.h\"\n#import \"GSSItem.h\"\n#import \"krb5.h\"\n\n#include <membership.h>\n#import \"TCSTKSmartCard.h\"\n#endif /* XCreds_Bridging_Header_h */\n"
  },
  {
    "path": "XCreds/XCredsLoginPlugin-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import \"XCredsLoginPlugin.h\"\n#import \"TCSUnifiedLogger.h\"\n#import \"TCSReturnWindow.h\"\n#import \"TCSKeychain.h\"\n#import <ProductLicense/ProductLicense.h>\n#include <membership.h>\n#import \"DNSResolver.h\"\n#import \"TCTaskWrapperWithBlocks.h\"\n// Kerb bits\n#import \"KerbUtil.h\"\n#import \"GSSItem.h\"\n#import \"krb5.h\"\n#import \"TCSTKSmartCard.h\"\n"
  },
  {
    "path": "XCreds/XCredsMechanismProtocol.swift",
    "content": "//\n//  XCredsMechanismProtocol.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 12/24/23.\n//\n\nenum ErrorResult {\n    case success\n    case failure(String)\n    case userCancelled\n}\n\nprotocol XCredsMechanismProtocol {\n    func allowLogin()\n    func denyLogin(message:String?)\n    func setHints(_ hints:[HintType:Any])\n    func setContextStrings(_ contentStrings: [String : String])\n    func setContextString(type: String, value: String)\n    func setStickyContextString(type: String, value: String)\n    func setHint(type: HintType, hint: NSSecureCoding)\n    func setHintData(type: HintType, data: Data)\n\n    func getHint(type: HintType) -> Any?\n\n    func reload()\n    func run()\n    func setupHints(fromCredentials credentials:Creds, password:String) -> ErrorResult\n    func unsyncedPasswordPrompt(username: String, password: String,accountLocked:Bool, localAdmin: LocalAdminCredentials?, showResetButton:Bool) ->ErrorResult \n}\n"
  },
  {
    "path": "XCreds/defaults.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>redirectURI</key>\n\t<string>xcreds://auth/</string>\n\t<key>refreshRateHours</key>\n\t<integer>3</integer>\n\t<key>refreshRateMinutes</key>\n\t<integer>0</integer>\n\t<key>showDebug</key>\n\t<false/>\n\t<key>verifyPassword</key>\n\t<true/>\n\t<key>LogFileName</key>\n\t<string>xcreds.log</string>\n\t<key>shouldShowPreferencesOnStart</key>\n\t<false/>\n\t<key>shouldSetGoogleAccessTypeToOffline</key>\n\t<false/>\n\t<key>shouldShowAboutMenu</key>\n\t<true/>\n\t<key>shouldShowQuitMenu</key>\n\t<false/>\n\t<key>shouldFindPasswordElement</key>\n\t<true/>\n\t<key>shouldShowSupportStatus</key>\n\t<string>1</string>\n\t<key>shouldShowConfigureWifiButton</key>\n\t<true/>\n\t<key>shouldShowShutdownButton</key>\n\t<true/>\n\t<key>shouldShowRestartButton</key>\n\t<true/>\n\t<key>shouldHideIfLocalOnlyUser</key>\n\t<string>NO</string>\n\t<key>shouldShowSystemInfoButton</key>\n\t<true/>\n\t<key>shouldShowMacLoginButton</key>\n\t<string>1</string>\n\t<key>shouldShowRefreshBanner</key>\n\t<true/>\n\t<key>KeychainCreate</key>\n\t<true/>\n\t<key>shouldSwitchToLoginWindowWhenLocked</key>\n\t<false/>\n\t<key>shouldShowCloudLoginByDefault</key>\n\t<true/>\n\t<key>shouldPreferLocalLoginInsteadOfCloudLogin</key>\n\t<false/>\n\t<key>shouldShowTokenUpdateStatus</key>\n\t<true/>\n\t<key>autoRefreshLoginTimer</key>\n\t<integer>0</integer>\n\t<key>usernamePlaceholder</key>\n\t<string>Enter Username</string>\n\t<key>shouldShowLocalOnlyCheckbox</key>\n\t<true/>\n\t<key>shouldDetectNetworkToDetermineLoginWindow</key>\n\t<false/>\n\t<key>shouldUseROPGForPasswordChangeChecking</key>\n\t<false/>\n\t<key>checkForUpdates</key>\n\t<true/>\n\t<key>shouldUseROPGForMenuLogin</key>\n\t<false/>\n\t<key>shouldUseROPGForLoginWindowLogin</key>\n\t<false/>\n\t<key>passwordPlaceholder</key>\n\t<string>Password</string>\n\t<key>versionCheckURL</key>\n\t<string>https://paypro.twocanoes.com/api/version_info</string>\n\t<key>licenseActivityURL</key>\n\t<string>https://paypro.twocanoes.com/api/license_activity</string>\n\t<key>refreshBannerText</key>\n\t<string>Log in to verify your cloud credentials. After verification, your local user account password will be set to your cloud password.</string>\n\t<key>shouldPromptForMigration</key>\n\t<false/>\n\t<key>shouldAllowKeyComboForMacLoginWindow</key>\n\t<false/>\n\t<key>claimsToAddToLocalUserAccount</key>\n\t<array>\n\t\t<string>groups</string>\n\t</array>\n\t<key>adUserAttributesToAddToLocalUserAccount</key>\n\t<array>\n\t\t<string>userPrincipalName</string>\n\t\t<string>dn</string>\n\t</array>\n\t<key>loadPageTitle</key>\n\t<string>Waiting for Network...</string>\n\t<key>loadPageInfo</key>\n\t<string>If this page does not reload with the login screen in a few seconds, please check the network connection.</string>\n\t<key>shouldPromptForADPasswordChange</key>\n\t<true/>\n\t<key>allowUsersClaim</key>\n\t<string>upn</string>\n\t<key>shareMenuItemName</key>\n\t<string>Shares</string>\n\t<key>shouldUseBasicAuthWithROPG</key>\n\t<false/>\n\t<key>map_password_expiry</key>\n\t<string>pwd_exp</string>\n\t<key>map_fullusername</key>\n\t<string>unique_name</string>\n\t<key>shouldShowSignInMenuItem</key>\n\t<true/>\n\t<key>shouldLoginWindowBackgroundImageFillScreen</key>\n\t<true/>\n\t<key>shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen</key>\n\t<true/>\n\t<key>shouldActivateSystemInfoButton</key>\n\t<true/>\n\t<key>ropgResponseValue</key>\n\t<string>interaction_required</string>\n\t<key>menuItemWindowBackgroundImageAlpha</key>\n\t<integer>1</integer>\n\t<key>loginWindowBackgroundImageAlpha</key>\n\t<integer>1</integer>\n\t<key>loginWindowSecondaryMonitorsBackgroundAlpha</key>\n\t<integer>1</integer>\n\t<key>shouldSuppressLocalPasswordPrompt</key>\n\t<false/>\n\t<key>overlayDelaySecs</key>\n\t<integer>10</integer>\n\t<key>shouldUseKillWhenLoginWindowSwitching</key>\n\t<false/>\n\t<key>shouldAllowLoginCardSetup</key>\n\t<true/>\n\t<key>shouldDisableMenuItemAutoLaunch</key>\n\t<false/>\n\t<key>shouldUseADNativePasswordChangeMenuItem</key>\n\t<false/>\n\t<key>shouldHideLoginWindowLogo</key>\n\t<false/>\n\t<key>primaryGroupID</key>\n\t<string>20</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds/tap-Bridging-Header.h",
    "content": "//\n//  XCreds-Bridging-Header.h\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\n#ifndef XCreds_Bridging_Header_h\n#define XCreds_Bridging_Header_h\n#import \"SecurityPrivateAPI.h\"\n#import \"XCredsLoginPlugin.h\"\n#import \"TCSKeychain.h\"\n#import \"TCSUnifiedLogger.h\"\n#ifndef AUTOFILL_TARGET\n#endif\n#import \"TCSLoginWindowUtilities.h\"\n#import \"DNSResolver.h\"\n#import \"TCTaskWrapperWithBlocks.h\"\n\n// Kerb bits\n#import \"KerbUtil.h\"\n#import \"GSSItem.h\"\n#import \"krb5.h\"\n\n#include <membership.h>\n\n#endif /* XCreds_Bridging_Header_h */\n"
  },
  {
    "path": "XCreds/xCreds.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.smartcard</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds AutoFill/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  XCreds AutoFill\n//\n//  Created by Timothy Perfitt on 6/5/24.\n//\n\nimport Cocoa\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    static func main() {\n        if CommandLine.arguments.contains(\"-r\") {\n            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+5) {\n                NSApplication.shared.terminate(self)\n            }\n        }\n        let app = NSApplication.shared\n        let appDelegate = AppDelegate()\n        app.delegate = appDelegate\n        _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)\n\n\n    }\n\n\n\n\n\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        // Insert code here to initialize your application\n    }\n\n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n    }\n\n    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n        return true\n    }\n\n\n}\n\n"
  },
  {
    "path": "XCreds AutoFill/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"XCreds AutoFill\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"XCreds AutoFill\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About XCreds AutoFill\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide XCreds AutoFill\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit XCreds AutoFill\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" keyEquivalent=\"s\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" keyEquivalent=\"s\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" keyEquivalent=\"=\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"XCreds AutoFill Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"XCreds_Login_Autofill\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "XCreds AutoFill/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  XCreds AutoFill\n//\n//  Created by Timothy Perfitt on 6/5/24.\n//\n\nimport Cocoa\n\nclass ViewController: NSViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        // Do any additional setup after loading the view.\n    }\n\n    override var representedObject: Any? {\n        didSet {\n        // Update the view, if already loaded.\n        }\n    }\n\n\n}\n\n"
  },
  {
    "path": "XCreds AutoFill/XCreds_AutoFill.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.developer.authentication-services.autofill-credential-provider</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds AutoFill Extension/Base.lproj/CredentialProviderViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"CredentialProviderViewController\" customModule=\"XCreds_Login_Password\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"view\" destination=\"1\" id=\"2\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customView id=\"1\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"257\" height=\"94\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <point key=\"canvasLocation\" x=\"222.5\" y=\"146\"/>\n        </customView>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCreds AutoFill Extension/CredentialProviderViewController.swift",
    "content": "//\n//  CredentialProviderViewController.swift\n//  XCreds AutoFill Extension\n//\n//  Created by Timothy Perfitt on 6/5/24.\n//\n\nimport AuthenticationServices\nimport LocalAuthentication\n@available(macOS, deprecated: 11)\n\nclass CredentialProviderViewController: ASCredentialProviderViewController {\n\n    /*\n     Prepare your UI to list available credentials for the user to choose from. The items in\n     'serviceIdentifiers' describe the service the user is logging in to, so your extension can\n     prioritize the most relevant credentials in the list.\n    */\n    override func prepareCredentialList(for serviceIdentifiers: [ASCredentialServiceIdentifier]) {\n    }\n\n    /*\n     Implement this method if your extension supports showing credentials in the QuickType bar.\n     When the user selects a credential from your app, this method will be called with the\n     ASPasswordCredentialIdentity your app has previously saved to the ASCredentialIdentityStore.\n     Provide the password by completing the extension request with the associated ASPasswordCredential.\n     If using the credential would require showing custom UI for authenticating the user, cancel\n     the request with error code ASExtensionError.userInteractionRequired.\n\n    override func provideCredentialWithoutUserInteraction(for credentialIdentity: ASPasswordCredentialIdentity) {\n        let databaseIsUnlocked = true\n        if (databaseIsUnlocked) {\n            let passwordCredential = ASPasswordCredential(user: \"j_appleseed\", password: \"apple1234\")\n            self.extensionContext.completeRequest(withSelectedCredential: passwordCredential, completionHandler: nil)\n        } else {\n            self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code:ASExtensionError.userInteractionRequired.rawValue))\n        }\n    }\n    */\n\n    /*\n     Implement this method if provideCredentialWithoutUserInteraction(for:) can fail with\n     ASExtensionError.userInteractionRequired. In this case, the system may present your extension's\n     UI and call this method. Show appropriate UI for authenticating the user then provide the password\n     by completing the extension request with the associated ASPasswordCredential.\n\n    override func prepareInterfaceToProvideCredential(for credentialIdentity: ASPasswordCredentialIdentity) {\n    }\n    */\n\n    override func viewDidAppear() {\n        passwordSelected(self)\n\n    }\n    @IBAction func cancel(_ sender: AnyObject?) {\n        self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code: ASExtensionError.userCanceled.rawValue))\n    }\n\n    @IBAction func passwordSelected(_ sender: AnyObject?) {\n        let keychainUtil = KeychainUtil()\n\n        let passwordItem = keychainUtil.findPassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue)\n\n        guard let passwordItem = passwordItem  else {\n            TCSLogWithMark(\"No keychainAccountAndPassword\")\n            self.extensionContext.cancelRequest(withError: NSError(domain: \"none\", code: -1))\n\n            return\n        }\n        var dsUsername:String?\n        let currentUser = PasswordUtils.getCurrentConsoleUserRecord()\n        if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_full_username\") as? [String], userNames.count>0, let username = userNames.first {\n            TCSLogWithMark()\n            dsUsername = username\n\n        }\n        else if let userNames = try? currentUser?.values(forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? [String], userNames.count>0, let username = userNames.first {\n            TCSLogWithMark()\n            dsUsername = username\n\n        }\n        else {\n            \n            dsUsername=currentUser?.recordName\n        }\n        guard let dsUsername = dsUsername else {\n            TCSLogWithMark(\"Invalid dsUsername\")\n            self.extensionContext.cancelRequest(withError: NSError(domain: \"none\", code: -1))\n\n            return\n        }\n\n        let passwordCredential = ASPasswordCredential(user: dsUsername, password: passwordItem.password)\n\n\n        let context = LAContext()\n        var error: NSError?\n\n        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {\n            let reason = \"XCreds Login Password\"\n\n            context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) {\n                [weak self] success, authenticationError in\n\n                DispatchQueue.main.async {\n                    if success {\n                        self?.extensionContext.completeRequest(withSelectedCredential: passwordCredential, completionHandler: nil)\n                        \n                    } else {\n                        self?.extensionContext.cancelRequest(withError: NSError(domain: \"none\", code: -1))\n                    }\n                }\n            }\n        }\n        else if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {\n            let reason = \"XCreds Login Password\"\n\n            context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) {\n                [weak self] success, authenticationError in\n\n                DispatchQueue.main.async {\n                    if success {\n                        self?.extensionContext.completeRequest(withSelectedCredential: passwordCredential, completionHandler: nil)\n\n                    } else {\n                        self?.extensionContext.cancelRequest(withError: NSError(domain: \"none\", code: -1))\n                    }\n                }\n            }\n        }\n        else {\n            self.extensionContext.cancelRequest(withError: NSError(domain: \"none\", code: -1))\n        }\n    }\n\n}\n"
  },
  {
    "path": "XCreds AutoFill Extension/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionAttributes</key>\n\t\t<dict>\n\t\t\t<key>ASCredentialProviderExtensionShowsConfigurationUI</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.authentication-services-credential-provider-ui</string>\n\t\t<key>NSExtensionPrincipalClass</key>\n\t\t<string>$(PRODUCT_MODULE_NAME).CredentialProviderViewController</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.developer.authentication-services.autofill-credential-provider</key>\n    <true/>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds Login Overlay/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  XCreds Login Overlay\n//\n//  Created by Timothy Perfitt on 7/16/22.\n//\n\nimport Cocoa\nimport AppKit\n\n@main\nclass App {\n    static func main() {\n        if let ud = UserDefaults(suiteName: \"com.twocanoes.xcreds\") {\n            var delay = ud.integer(forKey: \"overlayDelaySecs\")\n            if delay<10 {\n                delay = 10\n            }\n            TCSLogWithMark(\"delaying overlay by \\(delay) secs\");\n            sleep(UInt32(delay))\n        }\n        _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)\n    }\n}\n\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    @IBOutlet weak var cloudLoginTextField: NSTextField!\n    @IBOutlet var window: NSWindow!\n    @IBOutlet var waitWindow: NSWindow!\n    var returnFileExistedOnStart = false\n\n    var timer:Timer?\n    @IBAction func cloudLoginButtonPressed(_ sender: Any) {\n\n        var shouldSwitch = true\n\n        if UserDefaults.standard.bool(forKey:PrefKeys.shouldUseKillWhenLoginWindowSwitching.rawValue)==false{\n\n            let alert = NSAlert()\n            alert.addButton(withTitle: \"Restart\")\n            alert.addButton(withTitle: \"Cancel\")\n            alert.messageText=\"Switching login windows requires a restart. Do you want to restart now?\"\n\n            alert.window.canBecomeVisibleWithoutLogin=true\n\n\n            alert.icon=Bundle.main.image(forResource: NSImage.Name(\"icon_128x128\"))\n\n\n            if alert.runModal() == .alertSecondButtonReturn {\n                shouldSwitch=false\n            }\n        }\n        if shouldSwitch == false {\n            return\n\n        }\n        waitWindow.level = .modalPanel\n        waitWindow.canBecomeVisibleWithoutLogin = true\n        let screenRect = NSScreen.screens[0].visibleFrame\n\n        let screenWidth = screenRect.width\n        let screenHeight = screenRect.height\n        let waitWindowWidth = waitWindow.frame.width\n\n        let newPos = NSMakePoint(screenWidth/2-waitWindowWidth/2, screenHeight/2)\n        waitWindow.setFrameOrigin(newPos)\n        waitWindow.makeKeyAndOrderFront(self)\n\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n            \n            TCSLogWithMark(\"creating return file so XCreds does not return to mac login if it is set to go to mac login window by default.\")\n            do {\n                try StateFileHelper().createFile(.returnType)\n            }\n            catch {\n                TCSLogWithMark(\"not create xcreds_return file:\\(error)\")\n            }\n            if UserDefaults.standard.bool(forKey: \"slowReboot\")==true {\n               sleep(30)\n            }\n            let _ = AuthRightsHelper.addRights()\n\n            StateFileHelper().killOrReboot()\n\n\n\n        }\n    }\n\n/*\n (void)showStatusBar:(__unused id)sender{\n\n     [self updateStatus:self];\n     [self.returnToBootRunnerWindow setLevel:NSScreenSaverWindowLevel];\n\n\n     [self.returnToBootRunnerWindow setCanBecomeVisibleWithoutLogin:YES];\n     [self.returnToBootRunnerWindow setHidesOnDeactivate:NO];\n     [self.returnToBootRunnerWindow setOpaque:NO];\n     [self.returnToBootRunnerWindow orderFront:self];\n\n     NSRect statusWindowRect=self.returnToBootRunnerWindow.frame;\n     NSRect screenRect=[[[NSScreen screens] objectAtIndex:0] visibleFrame];\n\n     statusWindowRect.size.width=screenRect.size.width;\n     statusWindowRect.origin=screenRect.origin;\n     [self.returnToBootRunnerWindow setFrame:statusWindowRect display:YES];\n\n }\n\n\n */\n    func setupWindow()  {\n        var statusWindowRect=window.frame\n        let screenRect = NSScreen.screens[0].visibleFrame\n        statusWindowRect.size.width=screenRect.size.width\n        statusWindowRect.origin=screenRect.origin;\n        window.setFrame(statusWindowRect, display: true, animate: false)\n        window.canBecomeVisibleWithoutLogin=true\n        window.hidesOnDeactivate=false\n        window.isOpaque=false\n        window.level = .modalPanel\n        if let ud = UserDefaults(suiteName: \"com.twocanoes.xcreds\"),  let customTextString = ud.value(forKey: \"cloudLoginText\") {\n            cloudLoginTextField.stringValue = customTextString as! String\n            cloudLoginTextField.sizeToFit()\n\n        }\n    }\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        \n        TCSLogWithMark(\"starting overlay\")\n        UserDefaults.standard.addSuite(named: \"com.twocanoes.xcreds\")\n\n        do {\n\n            if StateFileHelper().fileExists(.returnType) == true {\n                returnFileExistedOnStart = true\n                try StateFileHelper().removeFile(.returnType)\n            }\n\n        }\n\n        catch {\n\n            TCSLogWithMark(\"Error removing return file: \\(error)\")\n        }\n        self.checkStatus()\n        DispatchQueue.main.async {\n\n            self.timer = Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in\n\n                self.checkStatus()\n\n            }\n        }\n\n    }\n    func checkStatus()  {\n        if  AuthRightsHelper.verifyRights() == false {\n            TCSLogWithMark(\"rights are not correct. Fixing setting to xcloud. if mac login window is forced, will bounce back there after the cloud window shows.\")\n            let _ = AuthRightsHelper.resetRights()\n\n            StateFileHelper().killOrReboot()\n            return\n        }\n\n        if let ud = UserDefaults(suiteName: \"com.twocanoes.xcreds\"){\n\n            if ud.bool(forKey: \"shouldShowCloudLoginByDefault\") == true,\n               returnFileExistedOnStart == false,\n               AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\")==true\n            {\n                TCSLogWithMark(\"we should be at XCreds window but we are at mac login window. Resetting and rebooting\")\n\n                let _ = AuthRightsHelper.addRights()\n                TCSLogWithMark(\"XCreds rights added. Rebooting\")\n                if UserDefaults.standard.bool(forKey: \"slowReboot\")==true {\n                   sleep(30)\n                }\n                StateFileHelper().killOrReboot()\n                return\n            }\n\n        }\n//        else {\n//            TCSLogWithMark(\"rights correct\")\n//        }\n\n        if AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\") == true {\n\n            TCSLogWithMark(\"moving to front\")\n            NSApp.activate(ignoringOtherApps: true)\n            self.setupWindow()\n            NSApp.activate(ignoringOtherApps: true)\n            self.window.orderFrontRegardless()\n        }\n//        else {\n//            TCSLogWithMark(\"loginwindow:login does not exist so we are at xcreds login\")\n//        }\n\n\n    }\n\n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n    }\n\n    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n        return true\n    }\n\n\n}\n\n"
  },
  {
    "path": "XCreds Login Overlay/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"color\" : {\n        \"color-space\" : \"srgb\",\n        \"components\" : {\n          \"alpha\" : \"1.000\",\n          \"blue\" : \"1.000\",\n          \"green\" : \"1.000\",\n          \"red\" : \"1.000\"\n        }\n      },\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"color\" : {\n        \"color-space\" : \"srgb\",\n        \"components\" : {\n          \"alpha\" : \"1.000\",\n          \"blue\" : \"1.000\",\n          \"green\" : \"1.000\",\n          \"red\" : \"1.000\"\n        }\n      },\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds Login Overlay/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"icon_16x16.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_16x16@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"16x16\"\n    },\n    {\n      \"filename\" : \"icon_32x32.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_32x32@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"32x32\"\n    },\n    {\n      \"filename\" : \"icon_128x128.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_128x128@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"128x128\"\n    },\n    {\n      \"filename\" : \"icon_256x256.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_256x256@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"256x256\"\n    },\n    {\n      \"filename\" : \"icon_512x512.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"size\" : \"512x512\"\n    },\n    {\n      \"filename\" : \"icon_512x512@2x.png\",\n      \"idiom\" : \"mac\",\n      \"scale\" : \"2x\",\n      \"size\" : \"512x512\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds Login Overlay/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "XCreds Login Overlay/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"24128\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"24128\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"XCreds_Login_Overlay\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"cloudLoginTextField\" destination=\"MrL-Zn-3BA\" id=\"bWY-at-65J\"/>\n                <outlet property=\"waitWindow\" destination=\"Ayg-7T-0us\" id=\"GCI-xI-9sJ\"/>\n                <outlet property=\"window\" destination=\"ewK-Yh-gWi\" id=\"YmL-xe-4l3\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"XCreds Login Overlay\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"XCreds Login Overlay\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About XCreds Login Overlay\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide XCreds Login Overlay\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit XCreds Login Overlay\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                        <items>\n                            <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                <connections>\n                                    <action selector=\"newDocument:\" target=\"-1\" id=\"4Si-XN-c54\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                <connections>\n                                    <action selector=\"openDocument:\" target=\"-1\" id=\"bVn-NM-KNZ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                    <items>\n                                        <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"clearRecentDocuments:\" target=\"-1\" id=\"Daa-9d-B3U\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                            <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                <connections>\n                                    <action selector=\"performClose:\" target=\"-1\" id=\"HmO-Ls-i7Q\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                <connections>\n                                    <action selector=\"saveDocument:\" target=\"-1\" id=\"teZ-XB-qJY\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                <connections>\n                                    <action selector=\"saveDocumentAs:\" target=\"-1\" id=\"mDf-zr-I0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                <connections>\n                                    <action selector=\"revertDocumentToSaved:\" target=\"-1\" id=\"iJ3-Pv-kwq\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                            <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"runPageLayout:\" target=\"-1\" id=\"Din-rz-gC5\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                <connections>\n                                    <action selector=\"print:\" target=\"-1\" id=\"qaZ-4w-aoO\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" keyEquivalent=\"s\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" keyEquivalent=\"s\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" control=\"YES\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                        <items>\n                            <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                    <items>\n                                        <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                            <connections>\n                                                <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                            <connections>\n                                                <action selector=\"underline:\" target=\"-1\" id=\"FYS-2b-JAY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                        <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                        <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardKerning:\" target=\"-1\" id=\"6dk-9l-Ckg\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffKerning:\" target=\"-1\" id=\"U8a-gz-Maa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"tightenKerning:\" target=\"-1\" id=\"hr7-Nz-8ro\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"loosenKerning:\" target=\"-1\" id=\"8i4-f9-FKE\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardLigatures:\" target=\"-1\" id=\"7uR-wd-Dx6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffLigatures:\" target=\"-1\" id=\"iX2-gA-Ilz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useAllLigatures:\" target=\"-1\" id=\"KcB-kA-TuK\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"unscript:\" target=\"-1\" id=\"0vZ-95-Ywn\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"superscript:\" target=\"-1\" id=\"3qV-fo-wpU\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"subscript:\" target=\"-1\" id=\"Q6W-4W-IGz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"raiseBaseline:\" target=\"-1\" id=\"4sk-31-7Q9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowerBaseline:\" target=\"-1\" id=\"OF1-bc-KW4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                        <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                            <connections>\n                                                <action selector=\"orderFrontColorPanel:\" target=\"-1\" id=\"mSX-Xz-DV3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                        <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyFont:\" target=\"-1\" id=\"GJO-xA-L4q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteFont:\" target=\"-1\" id=\"JfD-CL-leO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                    <items>\n                                        <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                            <connections>\n                                                <action selector=\"alignLeft:\" target=\"-1\" id=\"zUv-R1-uAa\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                            <connections>\n                                                <action selector=\"alignCenter:\" target=\"-1\" id=\"spX-mk-kcS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"alignJustified:\" target=\"-1\" id=\"ljL-7U-jND\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                            <connections>\n                                                <action selector=\"alignRight:\" target=\"-1\" id=\"r48-bG-YeY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                        <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                <items>\n                                                    <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"YGs-j5-SAR\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionNatural:\" target=\"-1\" id=\"qtV-5e-UBP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"Lbh-J2-qVU\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"-1\" id=\"S0X-9S-QSf\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"jFq-tB-4Kx\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"-1\" id=\"5fk-qB-AqJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                    <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"Nop-cj-93Q\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionNatural:\" target=\"-1\" id=\"lPI-Se-ZHp\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"BgM-ve-c93\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"-1\" id=\"caW-Bv-w94\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"RB4-Sm-HuC\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"-1\" id=\"EXD-6r-ZUu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                        <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleRuler:\" target=\"-1\" id=\"FOx-HJ-KwY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyRuler:\" target=\"-1\" id=\"71i-fW-3W2\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteRuler:\" target=\"-1\" id=\"cSh-wd-qM2\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleToolbarShown:\" target=\"-1\" id=\"BXY-wc-z0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"runToolbarCustomizationPalette:\" target=\"-1\" id=\"pQI-g3-MTW\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                            <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleSidebar:\" target=\"-1\" id=\"iwa-gc-5KM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" keyEquivalent=\"=\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                        <items>\n                            <menuItem title=\"XCreds Login Overlay Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                <connections>\n                                    <action selector=\"showHelp:\" target=\"-1\" id=\"y7X-2Q-9no\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"200\" y=\"121\"/>\n        </menu>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" hasShadow=\"NO\" releasedWhenClosed=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" id=\"ewK-Yh-gWi\" customClass=\"TCSXCredsLoginOverlayWindow\" customModule=\"XCreds_Login_Overlay\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"25\" y=\"25\" width=\"872\" height=\"109\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1728\" height=\"1079\"/>\n            <view key=\"contentView\" id=\"1nr-Jh-HO9\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"872\" height=\"109\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <customView fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GfD-0a-eQ7\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"39\" width=\"395\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MrL-Zn-3BA\">\n                                <rect key=\"frame\" x=\"43\" y=\"6\" width=\"88\" height=\"20\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Cloud Login\" drawsBackground=\"YES\" id=\"UqT-fq-knF\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"highlightColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" red=\"0.59999999999999998\" green=\"0.59999999999999998\" blue=\"0.59999999999999998\" alpha=\"0.40000000000000002\" colorSpace=\"calibratedRGB\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ksj-I0-NcP\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"43\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"returnArrow\" imagePosition=\"only\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"LrF-1c-c51\">\n                                    <behavior key=\"behavior\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"cloudLoginButtonPressed:\" target=\"Voe-Tx-rLC\" id=\"lJn-Y1-21o\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                    </customView>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"XKY-p3-ykt\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-479\" y=\"714.5\"/>\n        </window>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" id=\"Ayg-7T-0us\" customClass=\"TCSXCredsLoginOverlayWindow\" customModule=\"XCreds_Login_Overlay\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"144\" y=\"174\" width=\"362\" height=\"190\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1728\" height=\"1079\"/>\n            <view key=\"contentView\" id=\"MiV-8U-Ioy\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"362\" height=\"190\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView id=\"53v-9p-pn5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"362\" height=\"190\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"pleaseWaitGraphic\" id=\"qqL-n9-ZCX\"/>\n                    </imageView>\n                </subviews>\n            </view>\n            <point key=\"canvasLocation\" x=\"-1016\" y=\"368\"/>\n        </window>\n    </objects>\n    <resources>\n        <image name=\"pleaseWaitGraphic\" width=\"432\" height=\"216\"/>\n        <image name=\"returnArrow\" width=\"53.746479034423828\" height=\"52.732395172119141\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCreds Login Overlay/TCSXCredsLoginOverlayWindow.swift",
    "content": "//\n//  TCSXCredsLoginOverlayWindow.swift\n//  XCreds Login Overlay\n//\n//  Created by Timothy Perfitt on 7/16/22.\n//\n\nimport Cocoa\n\nclass TCSXCredsLoginOverlayWindow: NSWindow {\n    override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {\n        super.init(contentRect:contentRect, styleMask: style, backing: backingStoreType, defer: flag)\n        alphaValue=1.0\n        backgroundColor=NSColor.clear\n    }\n}\n"
  },
  {
    "path": "XCreds Login Overlay/XCreds_Login_Overlay.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "XCreds Login Overlay/com.twocanoes.xcreds-overlay.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.twocanoes.xcreds-overlay</string>\n\t<key>ThrottleInterval</key>\n\t<integer>30</integer>\n\t<key>LimitLoadToSessionType</key>\n\t<string>LoginWindow</string>\n\t<key>OnDemand</key>\n\t<false/>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>/Applications/XCreds.app/Contents/Resources/XCreds Login Overlay.app/Contents/MacOS/XCreds Login Overlay</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds-Login-Overlay-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSUIElement</key>\n\t<string>1</string>\n\t<key>LogFileName</key>\n\t<string>xcreds.log</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 70;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E22C116E450075FBD8 /* AppDelegate.swift */; };\n\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E42C116E450075FBD8 /* ViewController.swift */; };\n\t\t760291EA2C116E470075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291E92C116E470075FBD8 /* Base */; };\n\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */ = {isa = PBXBuildFile; fileRef = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */; };\n\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 760291CB2C1166870075FBD8 /* AuthenticationServices.framework */; };\n\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */; };\n\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291FA2C116EDB0075FBD8 /* Base */; };\n\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760769C12D9120C1006A1F4E /* com.twocanoes.xcreds-launchagent.plist in Resources */ = {isa = PBXBuildFile; fileRef = 760769C02D9120C1006A1F4E /* com.twocanoes.xcreds-launchagent.plist */; };\n\t\t760B6B732EE890FE000C7E9B /* FDESetupHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A35FD12EAC0DC400099940 /* FDESetupHelper.swift */; };\n\t\t760D8D5A2EC5757B00252828 /* UserSecretManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD92CEFED3800A5FEE3 /* UserSecretManager.swift */; };\n\t\t760D8D5B2EC575A100252828 /* SecretKeeper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD82CEFED3800A5FEE3 /* SecretKeeper.swift */; };\n\t\t760D8D5C2EC5760E00252828 /* UsernamePassword.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D67772E96249A009CE2BF /* UsernamePassword.swift */; };\n\t\t760D8D5D2EC5769B00252828 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760D8D5E2EC576B300252828 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEBF288B75140063A644 /* XCredsCreateUser.swift */; };\n\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */; };\n\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76189C782E9A021D00BEF023 /* com.twocanoes.FileVaultLoginHelper.plist in Copy LaunchDaemons Property Lists */ = {isa = PBXBuildFile; fileRef = 76189C6F2E99FF8800BEF023 /* com.twocanoes.FileVaultLoginHelper.plist */; };\n\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486B28A3575000C6A02B /* XCredsLoginDone.swift */; };\n\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 762177E52B7144460051B756 /* OIDCLite */; };\n\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */; };\n\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */; };\n\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7631935F287D22C700D36BF7 /* authrights.swift */; };\n\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319365287D24E100D36BF7 /* ArgumentParser */; };\n\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319368287D24F600D36BF7 /* ArgumentParser */; };\n\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */; };\n\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */ = {isa = PBXBuildFile; fileRef = 7631935D287D22C700D36BF7 /* authrights */; };\n\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */; };\n\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */; };\n\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */; };\n\t\t763C039A2D965607000C061F /* icon_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 76833EF12D95D4B500375CA4 /* icon_64x64.png */; };\n\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 763DDF192B4F1DD4000D48CC /* GSS.framework */; };\n\t\t764297AB2D015AB800678928 /* SetupCardWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764297AA2D015AB800678928 /* SetupCardWindowController.xib */; };\n\t\t764297AD2D015AB800678928 /* SetupCardWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764297A92D015AB800678928 /* SetupCardWindowController.swift */; };\n\t\t764297AE2D015AB800678928 /* SetupCardWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764297AA2D015AB800678928 /* SetupCardWindowController.xib */; };\n\t\t764446FD2CF80CD800E6289E /* StateFileHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764446FC2CF80CD800E6289E /* StateFileHelper.swift */; };\n\t\t764446FE2CF80CD800E6289E /* StateFileHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764446FC2CF80CD800E6289E /* StateFileHelper.swift */; };\n\t\t764447142CF825C500E6289E /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t764447152CF825D500E6289E /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t764447212CF8307200E6289E /* StateFileHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764446FC2CF80CD800E6289E /* StateFileHelper.swift */; };\n\t\t764447222CF830A700E6289E /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t764447232CF830CB00E6289E /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76477E032C626B5D00F01D56 /* OIDCLite */; };\n\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */; };\n\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */; };\n\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */ = {isa = PBXBuildFile; fileRef = 764D8132284D14A500B3EE54 /* Credits.txt */; };\n\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDF62A1474330075980B /* LoginWebViewController.xib */; };\n\t\t765348872E973B0800FECD7C /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t765348882E973B0F00FECD7C /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t765348962E973C7200FECD7C /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t766184B82DCE5DB5009D5A8C /* colorline.png in Resources */ = {isa = PBXBuildFile; fileRef = 766184B72DCE5DB5009D5A8C /* colorline.png */; };\n\t\t766184B92DCE5DB5009D5A8C /* colorline.png in Resources */ = {isa = PBXBuildFile; fileRef = 766184B72DCE5DB5009D5A8C /* colorline.png */; };\n\t\t76634F372D05FFA3000A63E8 /* LogOnly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76634F362D05FFA3000A63E8 /* LogOnly.swift */; };\n\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */; };\n\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 766355CD2870E9D3002E3867 /* OIDCLite */; };\n\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t766355D928711C51002E3867 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t766C602D2D3F409D0033E274 /* XCredsAudit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766C602C2D3F409D0033E274 /* XCredsAudit.swift */; };\n\t\t766C602E2D3F409D0033E274 /* XCredsAudit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766C602C2D3F409D0033E274 /* XCredsAudit.swift */; };\n\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t766D66792E961FA9009CE2BF /* CCIDCardReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66612E961F8F009CE2BF /* CCIDCardReader.swift */; };\n\t\t766D667A2E961FA9009CE2BF /* CCIDCardReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66612E961F8F009CE2BF /* CCIDCardReader.swift */; };\n\t\t766D667B2E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D667C2E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D667D2E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D667E2E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D667F2E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D66802E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D66812E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D66822E961FDB009CE2BF /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66622E961F8F009CE2BF /* LoggerHelper.swift */; };\n\t\t766D66832E962019009CE2BF /* NSAlert+showAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66642E961F8F009CE2BF /* NSAlert+showAlert.swift */; };\n\t\t766D66842E96203C009CE2BF /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66632E961F8F009CE2BF /* NetworkManager.swift */; };\n\t\t766D66852E96203C009CE2BF /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66632E961F8F009CE2BF /* NetworkManager.swift */; };\n\t\t766D66872E9620AC009CE2BF /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66862E96209F009CE2BF /* NetworkMonitor.swift */; };\n\t\t766D66882E9620AC009CE2BF /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66862E96209F009CE2BF /* NetworkMonitor.swift */; };\n\t\t766D66892E9620C6009CE2BF /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66652E961F8F009CE2BF /* NSBundle+FindBundlePath.swift */; };\n\t\t766D668A2E9620C6009CE2BF /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66652E961F8F009CE2BF /* NSBundle+FindBundlePath.swift */; };\n\t\t766D668B2E9620D9009CE2BF /* NSButton+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66662E961F8F009CE2BF /* NSButton+Color.swift */; };\n\t\t766D668C2E9620D9009CE2BF /* NSButton+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D66662E961F8F009CE2BF /* NSButton+Color.swift */; };\n\t\t766D668D2E9620F5009CE2BF /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666A2E961F8F009CE2BF /* NSData+SHA1.m */; };\n\t\t766D668E2E9620F5009CE2BF /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666A2E961F8F009CE2BF /* NSData+SHA1.m */; };\n\t\t766D668F2E9620FA009CE2BF /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66682E961F8F009CE2BF /* NSData+HexString.m */; };\n\t\t766D66902E9620FA009CE2BF /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66682E961F8F009CE2BF /* NSData+HexString.m */; };\n\t\t766D66912E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66922E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66932E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66942E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66952E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66962E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66972E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66982E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766D66992E962133009CE2BF /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D666D2E961F8F009CE2BF /* NSImage+String.swift */; };\n\t\t766D669A2E962133009CE2BF /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D666D2E961F8F009CE2BF /* NSImage+String.swift */; };\n\t\t766D669E2E962157009CE2BF /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D666F2E961F8F009CE2BF /* String+Base64URLEncoded.swift */; };\n\t\t766D669F2E962157009CE2BF /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D666F2E961F8F009CE2BF /* String+Base64URLEncoded.swift */; };\n\t\t766D66A02E96216E009CE2BF /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66712E961F8F009CE2BF /* TCSKeychain.m */; };\n\t\t766D66A12E96216E009CE2BF /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66712E961F8F009CE2BF /* TCSKeychain.m */; };\n\t\t766D66A22E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A32E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A42E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A52E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A62E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A72E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A82E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66A92E962186009CE2BF /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */; };\n\t\t766D66AA2E962198009CE2BF /* TCTaskHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66752E961F8F009CE2BF /* TCTaskHelper.m */; };\n\t\t766D66AB2E962198009CE2BF /* TCTaskHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66752E961F8F009CE2BF /* TCTaskHelper.m */; };\n\t\t766D66AC2E962198009CE2BF /* TCTaskHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66752E961F8F009CE2BF /* TCTaskHelper.m */; };\n\t\t766D66AD2E9621EC009CE2BF /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66772E961F8F009CE2BF /* TCTaskWrapperWithBlocks.m */; };\n\t\t766D66AE2E9621EC009CE2BF /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66772E961F8F009CE2BF /* TCTaskWrapperWithBlocks.m */; };\n\t\t766D66B12E962231009CE2BF /* NSError+EasyError.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66B02E962231009CE2BF /* NSError+EasyError.m */; };\n\t\t766D66B22E962231009CE2BF /* NSError+EasyError.m in Sources */ = {isa = PBXBuildFile; fileRef = 766D66B02E962231009CE2BF /* NSError+EasyError.m */; };\n\t\t766D67782E96249A009CE2BF /* UsernamePassword.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D67772E96249A009CE2BF /* UsernamePassword.swift */; };\n\t\t766D67792E96249A009CE2BF /* UsernamePassword.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766D67772E96249A009CE2BF /* UsernamePassword.swift */; };\n\t\t766F1E562D495BBF00AA5637 /* com.twocanoes.xcreds.json in Resources */ = {isa = PBXBuildFile; fileRef = 766F1E552D495BBF00AA5637 /* com.twocanoes.xcreds.json */; };\n\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */ = {isa = PBXBuildFile; fileRef = 766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */; };\n\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A6284AABC500CCD6FF /* NotifyManager.swift */; };\n\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */; };\n\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B0284B021500CCD6FF /* MainController.swift */; };\n\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908328908E40004E7085 /* WifiWindowController.swift */; };\n\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7677908528908E40004E7085 /* WifiWindowController.xib */; };\n\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F552A27C36A00AA8DB9 /* main.swift */; };\n\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t767916FE2E994EA100D99062 /* FileVaultLoginHelper in Embed Helper Tools */ = {isa = PBXBuildFile; fileRef = 765348762E97363900FECD7C /* FileVaultLoginHelper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };\n\t\t767917042E994F8D00D99062 /* HelperToolManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767916F02E994E2200D99062 /* HelperToolManager.swift */; };\n\t\t767917072E994FF200D99062 /* FileVaultLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767917062E994FE100D99062 /* FileVaultLogin.swift */; };\n\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */; };\n\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */; };\n\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */; };\n\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */; };\n\t\t76833EF22D95D4B500375CA4 /* icon_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 76833EF12D95D4B500375CA4 /* icon_64x64.png */; };\n\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76A247552C22747400859E0A /* CryptoTokenKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76A247542C22747400859E0A /* CryptoTokenKit.framework */; };\n\t\t76A247582C22747400859E0A /* Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A247572C22747400859E0A /* Token.swift */; };\n\t\t76A2475A2C22747400859E0A /* TokenDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A247592C22747400859E0A /* TokenDriver.swift */; };\n\t\t76A2475C2C22747400859E0A /* TokenSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A2475B2C22747400859E0A /* TokenSession.swift */; };\n\t\t76A35FD22EAC0DC400099940 /* FDESetupHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A35FD12EAC0DC400099940 /* FDESetupHelper.swift */; };\n\t\t76A35FD32EAC0DC400099940 /* FDESetupHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A35FD12EAC0DC400099940 /* FDESetupHelper.swift */; };\n\t\t76A52FDB2CF625EC00591252 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E02A12FAF900529D90 /* OIDCLite */; };\n\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E22A12FB4900529D90 /* ArgumentParser */; };\n\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B83A662C75711E00709C17 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76BE1DA12ED526AC001A4BE8 /* GoogleLDAP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BE1DA02ED526AC001A4BE8 /* GoogleLDAP.swift */; };\n\t\t76BE1DA22ED526AC001A4BE8 /* GoogleLDAP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BE1DA02ED526AC001A4BE8 /* GoogleLDAP.swift */; };\n\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */; };\n\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E2287202080013E2A1 /* RestartX.png */; };\n\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E6287202AF0013E2A1 /* ShutdownX.png */; };\n\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */; };\n\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */; };\n\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */; };\n\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */; };\n\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */; };\n\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FF2872A3030013E2A1 /* loginwindow.png */; };\n\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C084092A9A2635008039FA /* ControlsViewController.xib */; };\n\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t76C63A322A22872700810C53 /* History.md in Resources */ = {isa = PBXBuildFile; fileRef = 76C63A312A22872700810C53 /* History.md */; };\n\t\t76C661D82D3974910005F2CD /* PinPromptWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C661D72D3974910005F2CD /* PinPromptWindowController.xib */; };\n\t\t76C661D92D3974910005F2CD /* PinPromptWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C661D62D3974910005F2CD /* PinPromptWindowController.swift */; };\n\t\t76C661DA2D3974F30005F2CD /* SetupCardWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764297A92D015AB800678928 /* SetupCardWindowController.swift */; };\n\t\t76C661DB2D3975010005F2CD /* PinPromptWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C661D62D3974910005F2CD /* PinPromptWindowController.swift */; };\n\t\t76C840882D03BFF400E41802 /* PinSetWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C840872D03BFF400E41802 /* PinSetWindowController.xib */; };\n\t\t76C840892D03BFF400E41802 /* PinSetWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C840862D03BFF400E41802 /* PinSetWindowController.swift */; };\n\t\t76C8408A2D03BFF400E41802 /* PinSetWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C840872D03BFF400E41802 /* PinSetWindowController.xib */; };\n\t\t76C8408B2D03BFF400E41802 /* PinSetWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C840862D03BFF400E41802 /* PinSetWindowController.swift */; };\n\t\t76CA72BA2D0794D800C209A1 /* xcredstap.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 76A247532C22747400859E0A /* xcredstap.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */ = {isa = PBXBuildFile; fileRef = 76CB907C288112AF00C70D0C /* xcreds_login.sh */; };\n\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */; };\n\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */; };\n\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A6728836EB1007C42B2 /* AppDelegate.swift */; };\n\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6928836EB2007C42B2 /* Assets.xcassets */; };\n\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6B28836EB2007C42B2 /* MainMenu.xib */; };\n\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */; };\n\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */; };\n\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */; };\n\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A7628837028007C42B2 /* returnArrow.png */; };\n\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76DD6D16285997F300A700ED /* OIDCLite */; };\n\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */; };\n\t\t76EAAFD72CEFE22100A5FEE3 /* XCredsUserSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD62CEFE22000A5FEE3 /* XCredsUserSetup.swift */; };\n\t\t76EAAFDA2CEFED3800A5FEE3 /* SecretKeeper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD82CEFED3800A5FEE3 /* SecretKeeper.swift */; };\n\t\t76EAAFDB2CEFED3800A5FEE3 /* UserSecretManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD92CEFED3800A5FEE3 /* UserSecretManager.swift */; };\n\t\t76EAAFDC2CEFED3800A5FEE3 /* SecretKeeper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD82CEFED3800A5FEE3 /* SecretKeeper.swift */; };\n\t\t76EAAFDD2CEFED3800A5FEE3 /* UserSecretManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAAFD92CEFED3800A5FEE3 /* UserSecretManager.swift */; };\n\t\t76EB23E02CC898D7003F82CB /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t76EB23E12CC898D7003F82CB /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t76EB23E22CC8A232003F82CB /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t76EB23E32CC8A232003F82CB /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t76EB23E42CC8A3CB003F82CB /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t76EB23E52CC8A3CB003F82CB /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE069D27FD1D00009E0F3A /* AppDelegate.swift */; };\n\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06A127FD1D01009E0F3A /* MainMenu.xib */; };\n\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */; };\n\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */; };\n\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */; };\n\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */; };\n\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t76F0D8552EBBECFF001DAC01 /* TCSTKSmartCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F0D8542EBBECFF001DAC01 /* TCSTKSmartCard.m */; };\n\t\t76F0D8562EBBEF2B001DAC01 /* TCSTKSmartCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F0D8542EBBECFF001DAC01 /* TCSTKSmartCard.m */; };\n\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */; };\n\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */; };\n\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291F32C116EDB0075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill Extension\";\n\t\t};\n\t\t760292052C116EEE0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291DF2C116E450075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill\";\n\t\t};\n\t\t76319375287E19A500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 766355BC2870CA6A002E3867;\n\t\t\tremoteInfo = XCredsLoginPlugin;\n\t\t};\n\t\t76319378287E204500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7631935C287D22C700D36BF7;\n\t\t\tremoteInfo = authrights;\n\t\t};\n\t\t767917022E994F0300D99062 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 765348752E97363900FECD7C;\n\t\t\tremoteInfo = FileVaultLoginHelper;\n\t\t};\n\t\t76A2475F2C22747400859E0A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76A247522C22747400859E0A;\n\t\t\tremoteInfo = tapgo;\n\t\t};\n\t\t76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76DC0A6428836EB1007C42B2;\n\t\t\tremoteInfo = \"XCreds Login Overlay\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed Foundation Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935B287D22C700D36BF7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t765348742E97363900FECD7C /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t76EB23E12CC898D7003F82CB /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t76EB23E52CC8A3CB003F82CB /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t76EB23E32CC8A232003F82CB /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t767916FD2E994E8C00D99062 /* Embed Helper Tools */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 6;\n\t\t\tfiles = (\n\t\t\t\t767916FE2E994EA100D99062 /* FileVaultLoginHelper in Embed Helper Tools */,\n\t\t\t);\n\t\t\tname = \"Embed Helper Tools\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t767916FF2E994EC300D99062 /* Copy LaunchDaemons Property Lists */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Contents/Library/LaunchDaemons;\n\t\t\tdstSubfolderSpec = 1;\n\t\t\tfiles = (\n\t\t\t\t76189C782E9A021D00BEF023 /* com.twocanoes.FileVaultLoginHelper.plist in Copy LaunchDaemons Property Lists */,\n\t\t\t);\n\t\t\tname = \"Copy LaunchDaemons Property Lists\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76A247622C22747400859E0A /* Embed Foundation Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 12;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t76CA72BA2D0794D800C209A1 /* xcredstap.appex in Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed Foundation Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = System/Library/Frameworks/AuthenticationServices.framework; sourceTree = SDKROOT; };\n\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Autofill.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t760291E42C116E450075FBD8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291E92C116E470075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill.entitlements; sourceTree = \"<group>\"; };\n\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = \"XCreds Login Password.appex\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291FA2C116EDB0075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CredentialProviderViewController.xib; sourceTree = \"<group>\"; };\n\t\t760291FC2C116EDB0075FBD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill_Extension.entitlements; sourceTree = \"<group>\"; };\n\t\t760418CF2A1332210051411B /* SignInWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWindowController.swift; sourceTree = \"<group>\"; };\n\t\t760418D42A1332520051411B /* DS+AD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"DS+AD.swift\"; sourceTree = \"<group>\"; };\n\t\t760418D62A1332660051411B /* DSQueryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSQueryable.swift; sourceTree = \"<group>\"; };\n\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemInfoHelper.swift; sourceTree = \"<group>\"; };\n\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalCheckAndMigrate.swift; sourceTree = \"<group>\"; };\n\t\t760769C02D9120C1006A1F4E /* com.twocanoes.xcreds-launchagent.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-launchagent.plist\"; sourceTree = \"<group>\"; };\n\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsCreateUser.swift; sourceTree = \"<group>\"; };\n\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsEnableFDE.swift; sourceTree = \"<group>\"; };\n\t\t7613FDF6289E114F00340CCD /* loadpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = loadpage.html; sourceTree = \"<group>\"; };\n\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = XCreds/Assets.xcassets/AppIcon.appiconset/icon_128x128.png; sourceTree = \"<group>\"; };\n\t\t76189C6F2E99FF8800BEF023 /* com.twocanoes.FileVaultLoginHelper.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = com.twocanoes.FileVaultLoginHelper.plist; sourceTree = \"<group>\"; };\n\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoginProgressWindowController.xib; path = XCredsLoginPlugIn/LoginProgressWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginDone.swift; sourceTree = \"<group>\"; };\n\t\t7631935D287D22C700D36BF7 /* authrights */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = authrights; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7631935F287D22C700D36BF7 /* authrights.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = authrights.swift; sourceTree = \"<group>\"; };\n\t\t7632909B2876673500CF8857 /* DataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataExtension.swift; sourceTree = \"<group>\"; };\n\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsKeychainAdd.swift; sourceTree = \"<group>\"; };\n\t\t7632E3A02873497C00E37923 /* LogShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogShim.swift; path = Mechanisms/LogShim.swift; sourceTree = \"<group>\"; };\n\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesktopLoginWindowController.swift; sourceTree = \"<group>\"; };\n\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitePopoverBackgroundView.swift; sourceTree = \"<group>\"; };\n\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounterMenu.swift; sourceTree = \"<group>\"; };\n\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = System/Library/Frameworks/GSS.framework; sourceTree = SDKROOT; };\n\t\t764297A92D015AB800678928 /* SetupCardWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupCardWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764297AA2D015AB800678928 /* SetupCardWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SetupCardWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764446FC2CF80CD800E6289E /* StateFileHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateFileHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = xcredsmenuItemWindowBackgroundImage.png; sourceTree = \"<group>\"; };\n\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyLocalPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VerifyLocalPasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyOIDCPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerifyOIDCPassword.xib; sourceTree = \"<group>\"; };\n\t\t764D812E284C06AB00B3EE54 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = \"<group>\"; };\n\t\t764D8132284D14A500B3EE54 /* Credits.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.txt; sourceTree = \"<group>\"; };\n\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalUsersViewController.xib; sourceTree = \"<group>\"; };\n\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWebViewController.xib; sourceTree = \"<group>\"; };\n\t\t765348762E97363900FECD7C /* FileVaultLoginHelper */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = FileVaultLoginHelper; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoMADSession.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRecord.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBB2B35055F003A23DB /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNSResolver.m; sourceTree = \"<group>\"; };\n\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolver.h; sourceTree = \"<group>\"; };\n\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ADLDAPPing.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlistUtil.swift; sourceTree = \"<group>\"; };\n\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DED22B350644003A23DB /* GSSItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GSSItem.h; sourceTree = \"<group>\"; };\n\t\t7657DED32B35064E003A23DB /* krb5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5.h; sourceTree = \"<group>\"; };\n\t\t7657DED52B351A67003A23DB /* KerbUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KerbUtil.h; sourceTree = \"<group>\"; };\n\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UNIXUtilities.swift; sourceTree = \"<group>\"; };\n\t\t766184B72DCE5DB5009D5A8C /* colorline.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = colorline.png; sourceTree = \"<group>\"; };\n\t\t76634F362D05FFA3000A63E8 /* LogOnly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogOnly.swift; sourceTree = \"<group>\"; };\n\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCredsLoginPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XCredsLoginPlugin.h; path = XCredsLoginPlugIn/XCredsLoginPlugin.h; sourceTree = SOURCE_ROOT; };\n\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XCredsLoginPlugin.m; path = XCredsLoginPlugIn/XCredsLoginPlugin.m; sourceTree = SOURCE_ROOT; };\n\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCredsLoginPlugin-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginWebViewController.swift; path = XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift; sourceTree = SOURCE_ROOT; };\n\t\t766355E128713C47002E3867 /* LoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t766355E4287148C1002E3867 /* Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tokens.swift; path = Shared/Tokens.swift; sourceTree = SOURCE_ROOT; };\n\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseChecker.swift; sourceTree = \"<group>\"; };\n\t\t766C602C2D3F409D0033E274 /* XCredsAudit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = XCredsAudit.swift; path = ../Shared/XCredsAudit.swift; sourceTree = \"<group>\"; };\n\t\t766CC42129D3A320009BC526 /* Paddle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paddle.framework; path = Carthage/Build/Mac/Paddle.framework; sourceTree = \"<group>\"; };\n\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ProductLicense.framework; path = Carthage/Build/Mac/ProductLicense.framework; sourceTree = \"<group>\"; };\n\t\t766CC43729D3AED2009BC526 /* errorpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorpage.html; sourceTree = \"<group>\"; };\n\t\t766D66612E961F8F009CE2BF /* CCIDCardReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCIDCardReader.swift; sourceTree = \"<group>\"; };\n\t\t766D66622E961F8F009CE2BF /* LoggerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerHelper.swift; sourceTree = \"<group>\"; };\n\t\t766D66632E961F8F009CE2BF /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = \"<group>\"; };\n\t\t766D66642E961F8F009CE2BF /* NSAlert+showAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSAlert+showAlert.swift\"; sourceTree = \"<group>\"; };\n\t\t766D66652E961F8F009CE2BF /* NSBundle+FindBundlePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSBundle+FindBundlePath.swift\"; sourceTree = \"<group>\"; };\n\t\t766D66662E961F8F009CE2BF /* NSButton+Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSButton+Color.swift\"; sourceTree = \"<group>\"; };\n\t\t766D66672E961F8F009CE2BF /* NSData+HexString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSData+HexString.h\"; sourceTree = \"<group>\"; };\n\t\t766D66682E961F8F009CE2BF /* NSData+HexString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSData+HexString.m\"; sourceTree = \"<group>\"; };\n\t\t766D66692E961F8F009CE2BF /* NSData+SHA1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSData+SHA1.h\"; sourceTree = \"<group>\"; };\n\t\t766D666A2E961F8F009CE2BF /* NSData+SHA1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSData+SHA1.m\"; sourceTree = \"<group>\"; };\n\t\t766D666B2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+TCSRealHomeFolder.h\"; sourceTree = \"<group>\"; };\n\t\t766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+TCSRealHomeFolder.m\"; sourceTree = \"<group>\"; };\n\t\t766D666D2E961F8F009CE2BF /* NSImage+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSImage+String.swift\"; sourceTree = \"<group>\"; };\n\t\t766D666F2E961F8F009CE2BF /* String+Base64URLEncoded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"String+Base64URLEncoded.swift\"; sourceTree = \"<group>\"; };\n\t\t766D66702E961F8F009CE2BF /* TCSKeychain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCSKeychain.h; sourceTree = \"<group>\"; };\n\t\t766D66712E961F8F009CE2BF /* TCSKeychain.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCSKeychain.m; sourceTree = \"<group>\"; };\n\t\t766D66722E961F8F009CE2BF /* TCSUnifiedLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCSUnifiedLogger.h; sourceTree = \"<group>\"; };\n\t\t766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCSUnifiedLogger.m; sourceTree = \"<group>\"; };\n\t\t766D66742E961F8F009CE2BF /* TCTaskHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCTaskHelper.h; sourceTree = \"<group>\"; };\n\t\t766D66752E961F8F009CE2BF /* TCTaskHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCTaskHelper.m; sourceTree = \"<group>\"; };\n\t\t766D66762E961F8F009CE2BF /* TCTaskWrapperWithBlocks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCTaskWrapperWithBlocks.h; sourceTree = \"<group>\"; };\n\t\t766D66772E961F8F009CE2BF /* TCTaskWrapperWithBlocks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCTaskWrapperWithBlocks.m; sourceTree = \"<group>\"; };\n\t\t766D66862E96209F009CE2BF /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = \"<group>\"; };\n\t\t766D66AF2E962231009CE2BF /* NSError+EasyError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSError+EasyError.h\"; sourceTree = \"<group>\"; };\n\t\t766D66B02E962231009CE2BF /* NSError+EasyError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSError+EasyError.m\"; sourceTree = \"<group>\"; };\n\t\t766D67772E96249A009CE2BF /* UsernamePassword.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsernamePassword.swift; sourceTree = \"<group>\"; };\n\t\t766F1E552D495BBF00AA5637 /* com.twocanoes.xcreds.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = com.twocanoes.xcreds.json; path = \"../Profile Manifest/jamf/com.twocanoes.xcreds.json\"; sourceTree = \"<group>\"; };\n\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pleaseWaitGraphic.png; sourceTree = \"<group>\"; };\n\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsOverride.swift; sourceTree = \"<group>\"; };\n\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyManager.swift; sourceTree = \"<group>\"; };\n\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleManager.swift; sourceTree = \"<group>\"; };\n\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordUtils.swift; sourceTree = \"<group>\"; };\n\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityPrivateAPI.h; sourceTree = \"<group>\"; };\n\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCreds-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t767116B0284B021500CCD6FF /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = \"<group>\"; };\n\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainUtil.swift; sourceTree = \"<group>\"; };\n\t\t7675444428918CD100613840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = XCredsLoginPlugin/Info.plist; sourceTree = \"<group>\"; };\n\t\t7677908328908E40004E7085 /* WifiWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7677908528908E40004E7085 /* WifiWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WifiWindowController.xib; sourceTree = \"<group>\"; };\n\t\t767832732C234A6200E31295 /* tap-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"tap-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthRightsHelper.swift; path = Shared/AuthRightsHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = auth_mech_fixup; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F552A27C36A00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = \"auth_mech_fixup-Bridging-Header.h\"; path = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\"; sourceTree = SOURCE_ROOT; };\n\t\t767916F02E994E2200D99062 /* HelperToolManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelperToolManager.swift; sourceTree = \"<group>\"; };\n\t\t767917062E994FE100D99062 /* FileVaultLogin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileVaultLogin.swift; sourceTree = \"<group>\"; };\n\t\t767B939B2A28279E0038935E /* View+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libinfo.tbd; path = usr/lib/libinfo.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsystem_info.tbd; path = usr/lib/system/libsystem_info.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; };\n\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutWindow.xib; sourceTree = \"<group>\"; };\n\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */ = {isa = PBXFileReference; explicitFileType = text.plist.info; fileEncoding = 4; name = com.twocanoes.xcreds.plist; path = \"Profile Manifest/com.twocanoes.xcreds.plist\"; sourceTree = \"<group>\"; };\n\t\t76833EF12D95D4B500375CA4 /* icon_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_64x64.png; sourceTree = \"<group>\"; };\n\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsHelper.swift; sourceTree = \"<group>\"; };\n\t\t76A247532C22747400859E0A /* xcredstap.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = xcredstap.appex; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76A247542C22747400859E0A /* CryptoTokenKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoTokenKit.framework; path = System/Library/Frameworks/CryptoTokenKit.framework; sourceTree = SDKROOT; };\n\t\t76A247572C22747400859E0A /* Token.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Token.swift; sourceTree = \"<group>\"; };\n\t\t76A247592C22747400859E0A /* TokenDriver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenDriver.swift; sourceTree = \"<group>\"; };\n\t\t76A2475B2C22747400859E0A /* TokenSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenSession.swift; sourceTree = \"<group>\"; };\n\t\t76A2475D2C22747400859E0A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76A2475E2C22747400859E0A /* tap.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = tap.entitlements; sourceTree = \"<group>\"; };\n\t\t76A35FD12EAC0DC400099940 /* FDESetupHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FDESetupHelper.swift; sourceTree = \"<group>\"; };\n\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+JWTDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76BE1DA02ED526AC001A4BE8 /* GoogleLDAP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleLDAP.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSReturnWindow.m; sourceTree = \"<group>\"; };\n\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSReturnWindow.h; sourceTree = \"<group>\"; };\n\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7E2287202080013E2A1 /* RestartX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RestartX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"RestartX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ShutdownX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"ShutdownX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsBaseMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsPowerControlMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextAndHintHandling.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthorizationDBManager.swift; path = XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift; sourceTree = SOURCE_ROOT; };\n\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"loginwindow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loginwindow.png; sourceTree = \"<group>\"; };\n\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControlsViewController.xib; sourceTree = \"<group>\"; };\n\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounter.swift; sourceTree = \"<group>\"; };\n\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };\n\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = System/Library/Frameworks/Kerberos.framework; sourceTree = SDKROOT; };\n\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KerbUtil.m; sourceTree = \"<group>\"; };\n\t\t76C63A312A22872700810C53 /* History.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = History.md; sourceTree = \"<group>\"; };\n\t\t76C661D62D3974910005F2CD /* PinPromptWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PinPromptWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76C661D72D3974910005F2CD /* PinPromptWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PinPromptWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76C840862D03BFF400E41802 /* PinSetWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PinSetWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76C840872D03BFF400E41802 /* PinSetWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PinSetWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+URLDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = xcreds_login.sh; sourceTree = \"<group>\"; };\n\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocalAccountWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SelectLocalAccountWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainLoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = get_pw.js; path = Javascript/get_pw/get_pw.js; sourceTree = \"<group>\"; };\n\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Overlay.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76DC0A6C28836EB2007C42B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_Login_Overlay.entitlements; sourceTree = \"<group>\"; };\n\t\t76DC0A7628837028007C42B2 /* returnArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = returnArrow.png; sourceTree = \"<group>\"; };\n\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-overlay.plist\"; sourceTree = \"<group>\"; };\n\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCSXCredsLoginOverlayWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = \"XCreds-Login-Overlay-Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t76DD6D122859978F00A700ED /* OIDCLite */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = OIDCLite; path = ../OIDCLite; sourceTree = \"<group>\"; };\n\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsMechanismProtocol.swift; sourceTree = \"<group>\"; };\n\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCSLoginWindowUtilities.h; sourceTree = \"<group>\"; };\n\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCSLoginWindowUtilities.m; sourceTree = \"<group>\"; };\n\t\t76EAAFD62CEFE22000A5FEE3 /* XCredsUserSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsUserSetup.swift; sourceTree = \"<group>\"; };\n\t\t76EAAFD82CEFED3800A5FEE3 /* SecretKeeper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretKeeper.swift; sourceTree = \"<group>\"; };\n\t\t76EAAFD92CEFED3800A5FEE3 /* UserSecretManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSecretManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCreds.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76EE06A227FD1D01009E0F3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = xCreds.entitlements; sourceTree = \"<group>\"; };\n\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefKeys.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+ForceToFront.swift\"; sourceTree = \"<group>\"; };\n\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DesktopLoginWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = \"<group>\"; };\n\t\t76F0D8532EBBECFF001DAC01 /* TCSTKSmartCard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TCSTKSmartCard.h; sourceTree = \"<group>\"; };\n\t\t76F0D8542EBBECFF001DAC01 /* TCSTKSmartCard.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TCSTKSmartCard.m; sourceTree = \"<group>\"; };\n\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainLoginWindowController.swift; path = XCreds/MainLoginWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainLoginWindowController.xib; path = XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusMenuWindowController.xib; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFileSystemSynchronizedRootGroup section */\n\t\t765348662E97361F00FECD7C /* FileVaultLogin */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = FileVaultLogin; sourceTree = \"<group>\"; };\n\t\t765348772E97363900FECD7C /* FilevaultLoginHelper */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = FilevaultLoginHelper; sourceTree = \"<group>\"; };\n/* End PBXFileSystemSynchronizedRootGroup section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t760291DD2C116E450075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F12C116EDB0075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935A287D22C700D36BF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */,\n\t\t\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t765348732E97363900FECD7C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BA2870CA6A002E3867 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76EB23E42CC8A3CB003F82CB /* ProductLicense.framework in Frameworks */,\n\t\t\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F502A27C36A00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76A247502C22747400859E0A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76A247552C22747400859E0A /* CryptoTokenKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6228836EB1007C42B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76EB23E22CC8A232003F82CB /* ProductLicense.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069727FD1D00009E0F3A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */,\n\t\t\t\t76EB23E02CC898D7003F82CB /* ProductLicense.framework in Frameworks */,\n\t\t\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */,\n\t\t\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */,\n\t\t\t\t760291E42C116E450075FBD8 /* ViewController.swift */,\n\t\t\t\t760291E82C116E470075FBD8 /* Main.storyboard */,\n\t\t\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */,\n\t\t\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */,\n\t\t\t\t760291FC2C116EDB0075FBD8 /* Info.plist */,\n\t\t\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill Extension\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CC2A1331710051411B /* NomadLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */,\n\t\t\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */,\n\t\t\t\t760418D62A1332660051411B /* DSQueryable.swift */,\n\t\t\t\t760418D42A1332520051411B /* DS+AD.swift */,\n\t\t\t);\n\t\t\tpath = NomadLogin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7631935E287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */,\n\t\t\t\t7631935F287D22C700D36BF7 /* authrights.swift */,\n\t\t\t);\n\t\t\tpath = authrights;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7657DEDC2B351BF9003A23DB /* headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */,\n\t\t\t\t7657DED32B35064E003A23DB /* krb5.h */,\n\t\t\t\t7657DED22B350644003A23DB /* GSSItem.h */,\n\t\t\t);\n\t\t\tpath = headers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766355C72870D1B5002E3867 /* XCredsLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t764297A92D015AB800678928 /* SetupCardWindowController.swift */,\n\t\t\t\t764297AA2D015AB800678928 /* SetupCardWindowController.xib */,\n\t\t\t\t7613FDF6289E114F00340CCD /* loadpage.html */,\n\t\t\t\t766CC43729D3AED2009BC526 /* errorpage.html */,\n\t\t\t\t7677908328908E40004E7085 /* WifiWindowController.swift */,\n\t\t\t\t7677908528908E40004E7085 /* WifiWindowController.xib */,\n\t\t\t\t7632E3A02873497C00E37923 /* LogShim.swift */,\n\t\t\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */,\n\t\t\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */,\n\t\t\t\t764446FC2CF80CD800E6289E /* StateFileHelper.swift */,\n\t\t\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */,\n\t\t\t\t76BEF7F028724E520013E2A1 /* LoginWindow */,\n\t\t\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */,\n\t\t\t\t76C840862D03BFF400E41802 /* PinSetWindowController.swift */,\n\t\t\t\t76C840872D03BFF400E41802 /* PinSetWindowController.xib */,\n\t\t\t\t76C661D62D3974910005F2CD /* PinPromptWindowController.swift */,\n\t\t\t\t76C661D72D3974910005F2CD /* PinPromptWindowController.xib */,\n\t\t\t);\n\t\t\tname = XCredsLogin;\n\t\t\tpath = XCredsLoginPlugIn;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766D66782E961F8F009CE2BF /* tools */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76A35FD12EAC0DC400099940 /* FDESetupHelper.swift */,\n\t\t\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */,\n\t\t\t\t766D67772E96249A009CE2BF /* UsernamePassword.swift */,\n\t\t\t\t76EAAFD92CEFED3800A5FEE3 /* UserSecretManager.swift */,\n\t\t\t\t76EAAFD82CEFED3800A5FEE3 /* SecretKeeper.swift */,\n\t\t\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */,\n\t\t\t\t7632909B2876673500CF8857 /* DataExtension.swift */,\n\t\t\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */,\n\t\t\t\t766D66AF2E962231009CE2BF /* NSError+EasyError.h */,\n\t\t\t\t766D66B02E962231009CE2BF /* NSError+EasyError.m */,\n\t\t\t\t766D66612E961F8F009CE2BF /* CCIDCardReader.swift */,\n\t\t\t\t766D66862E96209F009CE2BF /* NetworkMonitor.swift */,\n\t\t\t\t766D66622E961F8F009CE2BF /* LoggerHelper.swift */,\n\t\t\t\t766D66632E961F8F009CE2BF /* NetworkManager.swift */,\n\t\t\t\t766D66642E961F8F009CE2BF /* NSAlert+showAlert.swift */,\n\t\t\t\t766D66652E961F8F009CE2BF /* NSBundle+FindBundlePath.swift */,\n\t\t\t\t766D66662E961F8F009CE2BF /* NSButton+Color.swift */,\n\t\t\t\t766D66672E961F8F009CE2BF /* NSData+HexString.h */,\n\t\t\t\t766D66682E961F8F009CE2BF /* NSData+HexString.m */,\n\t\t\t\t766D66692E961F8F009CE2BF /* NSData+SHA1.h */,\n\t\t\t\t766D666A2E961F8F009CE2BF /* NSData+SHA1.m */,\n\t\t\t\t766D666B2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.h */,\n\t\t\t\t766D666C2E961F8F009CE2BF /* NSFileManager+TCSRealHomeFolder.m */,\n\t\t\t\t766D666D2E961F8F009CE2BF /* NSImage+String.swift */,\n\t\t\t\t766D666F2E961F8F009CE2BF /* String+Base64URLEncoded.swift */,\n\t\t\t\t766D66702E961F8F009CE2BF /* TCSKeychain.h */,\n\t\t\t\t766D66712E961F8F009CE2BF /* TCSKeychain.m */,\n\t\t\t\t766D66722E961F8F009CE2BF /* TCSUnifiedLogger.h */,\n\t\t\t\t766D66732E961F8F009CE2BF /* TCSUnifiedLogger.m */,\n\t\t\t\t766D66742E961F8F009CE2BF /* TCTaskHelper.h */,\n\t\t\t\t766D66752E961F8F009CE2BF /* TCTaskHelper.m */,\n\t\t\t\t766D66762E961F8F009CE2BF /* TCTaskWrapperWithBlocks.h */,\n\t\t\t\t766D66772E961F8F009CE2BF /* TCTaskWrapperWithBlocks.m */,\n\t\t\t);\n\t\t\tname = tools;\n\t\t\tpath = tcsopensourcetools/TCSOpenSourceTools/tools;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */,\n\t\t\t\t76786F552A27C36A00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = auth_mech_fixup;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76A247562C22747400859E0A /* tap */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76A247572C22747400859E0A /* Token.swift */,\n\t\t\t\t76A247592C22747400859E0A /* TokenDriver.swift */,\n\t\t\t\t76A2475B2C22747400859E0A /* TokenSession.swift */,\n\t\t\t\t76A2475D2C22747400859E0A /* Info.plist */,\n\t\t\t\t76A2475E2C22747400859E0A /* tap.entitlements */,\n\t\t\t);\n\t\t\tpath = tap;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76634F362D05FFA3000A63E8 /* LogOnly.swift */,\n\t\t\t\t76EAAFD62CEFE22000A5FEE3 /* XCredsUserSetup.swift */,\n\t\t\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */,\n\t\t\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */,\n\t\t\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */,\n\t\t\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */,\n\t\t\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */,\n\t\t\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */,\n\t\t\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */,\n\t\t\t);\n\t\t\tpath = Mechanisms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F028724E520013E2A1 /* LoginWindow */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */,\n\t\t\t\t760418CF2A1332210051411B /* SignInWindowController.swift */,\n\t\t\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */,\n\t\t\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */,\n\t\t\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */,\n\t\t\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */,\n\t\t\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */,\n\t\t\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */,\n\t\t\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */,\n\t\t\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */,\n\t\t\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */,\n\t\t\t\t766355E128713C47002E3867 /* LoginWindow.swift */,\n\t\t\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */,\n\t\t\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */,\n\t\t\t\t76BEF7F128724EB60013E2A1 /* images */,\n\t\t\t);\n\t\t\tpath = LoginWindow;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F128724EB60013E2A1 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */,\n\t\t\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */,\n\t\t\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */,\n\t\t\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */,\n\t\t\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */,\n\t\t\t\t76BEF7E2287202080013E2A1 /* RestartX.png */,\n\t\t\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */,\n\t\t\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */,\n\t\t\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */,\n\t\t\t\t7657DED52B351A67003A23DB /* KerbUtil.h */,\n\t\t\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */,\n\t\t\t\t7657DEDC2B351BF9003A23DB /* headers */,\n\t\t\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */,\n\t\t\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */,\n\t\t\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */,\n\t\t\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */,\n\t\t\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */,\n\t\t\t\t7657DEBB2B35055F003A23DB /* Logger.swift */,\n\t\t\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */,\n\t\t\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */,\n\t\t\t\t76BE1DA02ED526AC001A4BE8 /* GoogleLDAP.swift */,\n\t\t\t);\n\t\t\tname = NoMAD;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */,\n\t\t\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */,\n\t\t\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */,\n\t\t\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */,\n\t\t\t\t76DC0A7628837028007C42B2 /* returnArrow.png */,\n\t\t\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */,\n\t\t\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */,\n\t\t\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */,\n\t\t\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds Login Overlay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D112859978F00A700ED /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76DD6D122859978F00A700ED /* OIDCLite */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D15285997F300A700ED /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */,\n\t\t\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */,\n\t\t\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */,\n\t\t\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */,\n\t\t\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */,\n\t\t\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */,\n\t\t\t\t766CC42129D3A320009BC526 /* Paddle.framework */,\n\t\t\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */,\n\t\t\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */,\n\t\t\t\t76A247542C22747400859E0A /* CryptoTokenKit.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069127FD1D00009E0F3A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76F0D8532EBBECFF001DAC01 /* TCSTKSmartCard.h */,\n\t\t\t\t76F0D8542EBBECFF001DAC01 /* TCSTKSmartCard.m */,\n\t\t\t\t76189C6F2E99FF8800BEF023 /* com.twocanoes.FileVaultLoginHelper.plist */,\n\t\t\t\t766D66782E961F8F009CE2BF /* tools */,\n\t\t\t\t760769C02D9120C1006A1F4E /* com.twocanoes.xcreds-launchagent.plist */,\n\t\t\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */,\n\t\t\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */,\n\t\t\t\t76C63A312A22872700810C53 /* History.md */,\n\t\t\t\t760418CC2A1331710051411B /* NomadLogin */,\n\t\t\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */,\n\t\t\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */,\n\t\t\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */,\n\t\t\t\t76833EF12D95D4B500375CA4 /* icon_64x64.png */,\n\t\t\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */,\n\t\t\t\t7675444428918CD100613840 /* Info.plist */,\n\t\t\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */,\n\t\t\t\t76A247562C22747400859E0A /* tap */,\n\t\t\t\t765348662E97361F00FECD7C /* FileVaultLogin */,\n\t\t\t\t765348772E97363900FECD7C /* FilevaultLoginHelper */,\n\t\t\t\t76DD6D15285997F300A700ED /* Frameworks */,\n\t\t\t\t76DD6D112859978F00A700ED /* Packages */,\n\t\t\t\t766355C72870D1B5002E3867 /* XCredsLogin */,\n\t\t\t\t76EE069C27FD1D00009E0F3A /* XCreds */,\n\t\t\t\t7631935E287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76EE069B27FD1D00009E0F3A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069B27FD1D00009E0F3A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */,\n\t\t\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */,\n\t\t\t\t7631935D287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */,\n\t\t\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */,\n\t\t\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */,\n\t\t\t\t76A247532C22747400859E0A /* xcredstap.appex */,\n\t\t\t\t765348762E97363900FECD7C /* FileVaultLoginHelper */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069C27FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t767916F02E994E2200D99062 /* HelperToolManager.swift */,\n\t\t\t\t767917062E994FE100D99062 /* FileVaultLogin.swift */,\n\t\t\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */,\n\t\t\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */,\n\t\t\t\t766C602C2D3F409D0033E274 /* XCredsAudit.swift */,\n\t\t\t\t766F1E552D495BBF00AA5637 /* com.twocanoes.xcreds.json */,\n\t\t\t\t766184B72DCE5DB5009D5A8C /* colorline.png */,\n\t\t\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */,\n\t\t\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */,\n\t\t\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */,\n\t\t\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */,\n\t\t\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */,\n\t\t\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */,\n\t\t\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */,\n\t\t\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */,\n\t\t\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */,\n\t\t\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */,\n\t\t\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */,\n\t\t\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */,\n\t\t\t\t764D8132284D14A500B3EE54 /* Credits.txt */,\n\t\t\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */,\n\t\t\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */,\n\t\t\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */,\n\t\t\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */,\n\t\t\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */,\n\t\t\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */,\n\t\t\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */,\n\t\t\t\t767B939B2A28279E0038935E /* View+Shake.swift */,\n\t\t\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */,\n\t\t\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */,\n\t\t\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */,\n\t\t\t\t766355E4287148C1002E3867 /* Tokens.swift */,\n\t\t\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */,\n\t\t\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */,\n\t\t\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */,\n\t\t\t\t764D812E284C06AB00B3EE54 /* defaults.plist */,\n\t\t\t\t767832732C234A6200E31295 /* tap-Bridging-Header.h */,\n\t\t\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */,\n\t\t\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */,\n\t\t\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */,\n\t\t\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */,\n\t\t\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */,\n\t\t\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */,\n\t\t\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */,\n\t\t\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */,\n\t\t\t\t767116B0284B021500CCD6FF /* MainController.swift */,\n\t\t\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */,\n\t\t\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */,\n\t\t\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */,\n\t\t\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */,\n\t\t\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */,\n\t\t\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */,\n\t\t\t);\n\t\t\tpath = XCreds;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291DC2C116E450075FBD8 /* Sources */,\n\t\t\t\t760291DD2C116E450075FBD8 /* Frameworks */,\n\t\t\t\t760291DE2C116E450075FBD8 /* Resources */,\n\t\t\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"XCreds Login Autofill\";\n\t\t\tproductName = \"XCreds AutoFill\";\n\t\t\tproductReference = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291F02C116EDB0075FBD8 /* Sources */,\n\t\t\t\t760291F12C116EDB0075FBD8 /* Frameworks */,\n\t\t\t\t760291F22C116EDB0075FBD8 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Password\";\n\t\t\tproductName = \"XCreds AutoFill Extension\";\n\t\t\tproductReference = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension\";\n\t\t};\n\t\t7631935C287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76319359287D22C700D36BF7 /* Sources */,\n\t\t\t\t7631935A287D22C700D36BF7 /* Frameworks */,\n\t\t\t\t7631935B287D22C700D36BF7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = authrights;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76AB89E02A12FAF900529D90 /* OIDCLite */,\n\t\t\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */,\n\t\t\t);\n\t\t\tproductName = authrights;\n\t\t\tproductReference = 7631935D287D22C700D36BF7 /* authrights */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t765348752E97363900FECD7C /* FileVaultLoginHelper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7653487A2E97363900FECD7C /* Build configuration list for PBXNativeTarget \"FileVaultLoginHelper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t765348722E97363900FECD7C /* Sources */,\n\t\t\t\t765348732E97363900FECD7C /* Frameworks */,\n\t\t\t\t765348742E97363900FECD7C /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tfileSystemSynchronizedGroups = (\n\t\t\t\t765348772E97363900FECD7C /* FilevaultLoginHelper */,\n\t\t\t);\n\t\t\tname = FileVaultLoginHelper;\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = FilevaultLoginHelper;\n\t\t\tproductReference = 765348762E97363900FECD7C /* FileVaultLoginHelper */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t766355B92870CA6A002E3867 /* Sources */,\n\t\t\t\t766355BA2870CA6A002E3867 /* Frameworks */,\n\t\t\t\t766355BB2870CA6A002E3867 /* Resources */,\n\t\t\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = XCredsLoginPlugin;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t766355CD2870E9D3002E3867 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = XCredsLoginPlugin;\n\t\t\tproductReference = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F4F2A27C36A00AA8DB9 /* Sources */,\n\t\t\t\t76786F502A27C36A00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = auth_mech_fixup;\n\t\t\tproductName = auth_mech_fixup;\n\t\t\tproductReference = 76786F532A27C36A00AA8DB9 /* auth_mech_fixup */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76A247522C22747400859E0A /* xcredstap */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76A247652C22747400859E0A /* Build configuration list for PBXNativeTarget \"xcredstap\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76A2474F2C22747400859E0A /* Sources */,\n\t\t\t\t76A247502C22747400859E0A /* Frameworks */,\n\t\t\t\t76A247512C22747400859E0A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = xcredstap;\n\t\t\tproductName = tapgo;\n\t\t\tproductReference = 76A247532C22747400859E0A /* xcredstap.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension\";\n\t\t};\n\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76DC0A6128836EB1007C42B2 /* Sources */,\n\t\t\t\t76DC0A6228836EB1007C42B2 /* Frameworks */,\n\t\t\t\t76DC0A6328836EB1007C42B2 /* Resources */,\n\t\t\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Overlay\";\n\t\t\tproductName = \"XCreds Login Overlay\";\n\t\t\tproductReference = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t76EE069927FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76EE069627FD1D00009E0F3A /* Sources */,\n\t\t\t\t76EE069727FD1D00009E0F3A /* Frameworks */,\n\t\t\t\t76EE069827FD1D00009E0F3A /* Resources */,\n\t\t\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */,\n\t\t\t\t76A247622C22747400859E0A /* Embed Foundation Extensions */,\n\t\t\t\t767916FD2E994E8C00D99062 /* Embed Helper Tools */,\n\t\t\t\t767916FF2E994EC300D99062 /* Copy LaunchDaemons Property Lists */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t767917032E994F0300D99062 /* PBXTargetDependency */,\n\t\t\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */,\n\t\t\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */,\n\t\t\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76319379287E204500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76A247602C22747400859E0A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = XCreds;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76DD6D16285997F300A700ED /* OIDCLite */,\n\t\t\t\t76319365287D24E100D36BF7 /* ArgumentParser */,\n\t\t\t\t76319368287D24F600D36BF7 /* ArgumentParser */,\n\t\t\t\t762177E52B7144460051B756 /* OIDCLite */,\n\t\t\t\t76477E032C626B5D00F01D56 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = xCreds;\n\t\t\tproductReference = 76EE069A27FD1D00009E0F3A /* XCreds.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t76EE069227FD1D00009E0F3A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1640;\n\t\t\t\tLastUpgradeCheck = 1330;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t760291DF2C116E450075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t760291F32C116EDB0075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t7631935C287D22C700D36BF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t765348752E97363900FECD7C = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 16.4;\n\t\t\t\t\t};\n\t\t\t\t\t766355BC2870CA6A002E3867 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1340;\n\t\t\t\t\t};\n\t\t\t\t\t76786F522A27C36A00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76A247522C22747400859E0A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t76DC0A6428836EB1007C42B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76EE069927FD1D00009E0F3A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 76EE069127FD1D00009E0F3A;\n\t\t\tpackageReferences = (\n\t\t\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */,\n\t\t\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 76EE069B27FD1D00009E0F3A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t76EE069927FD1D00009E0F3A /* XCreds */,\n\t\t\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */,\n\t\t\t\t7631935C287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */,\n\t\t\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */,\n\t\t\t\t76A247522C22747400859E0A /* xcredstap */,\n\t\t\t\t765348752E97363900FECD7C /* FileVaultLoginHelper */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t760291DE2C116E450075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76B83A662C75711E00709C17 /* Assets.xcassets in Resources */,\n\t\t\t\t760291EA2C116E470075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F22C116EDB0075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BB2870CA6A002E3867 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */,\n\t\t\t\t764297AE2D015AB800678928 /* SetupCardWindowController.xib in Resources */,\n\t\t\t\t766355D928711C51002E3867 /* defaults.plist in Resources */,\n\t\t\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */,\n\t\t\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */,\n\t\t\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t766184B92DCE5DB5009D5A8C /* colorline.png in Resources */,\n\t\t\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */,\n\t\t\t\t76833EF22D95D4B500375CA4 /* icon_64x64.png in Resources */,\n\t\t\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */,\n\t\t\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */,\n\t\t\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */,\n\t\t\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */,\n\t\t\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */,\n\t\t\t\t76C840882D03BFF400E41802 /* PinSetWindowController.xib in Resources */,\n\t\t\t\t76C661D82D3974910005F2CD /* PinPromptWindowController.xib in Resources */,\n\t\t\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */,\n\t\t\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */,\n\t\t\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */,\n\t\t\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */,\n\t\t\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76A247512C22747400859E0A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6328836EB1007C42B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */,\n\t\t\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */,\n\t\t\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */,\n\t\t\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */,\n\t\t\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */,\n\t\t\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069827FD1D00009E0F3A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t766F1E562D495BBF00AA5637 /* com.twocanoes.xcreds.json in Resources */,\n\t\t\t\t766184B82DCE5DB5009D5A8C /* colorline.png in Resources */,\n\t\t\t\t760769C12D9120C1006A1F4E /* com.twocanoes.xcreds-launchagent.plist in Resources */,\n\t\t\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */,\n\t\t\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */,\n\t\t\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */,\n\t\t\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */,\n\t\t\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */,\n\t\t\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */,\n\t\t\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */,\n\t\t\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */,\n\t\t\t\t76C8408A2D03BFF400E41802 /* PinSetWindowController.xib in Resources */,\n\t\t\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */,\n\t\t\t\t764297AB2D015AB800678928 /* SetupCardWindowController.xib in Resources */,\n\t\t\t\t763C039A2D965607000C061F /* icon_64x64.png in Resources */,\n\t\t\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */,\n\t\t\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */,\n\t\t\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */,\n\t\t\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */,\n\t\t\t\t76C63A322A22872700810C53 /* History.md in Resources */,\n\t\t\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */,\n\t\t\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */,\n\t\t\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */,\n\t\t\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */,\n\t\t\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t760291DC2C116E450075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t766D66A72E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */,\n\t\t\t\t766D66962E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */,\n\t\t\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t766D66802E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F02C116EDB0075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */,\n\t\t\t\t766D66A82E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */,\n\t\t\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t766D66972E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t766D66812E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t766D66AC2E962198009CE2BF /* TCTaskHelper.m in Sources */,\n\t\t\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76319359287D22C700D36BF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */,\n\t\t\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t766D66932E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t766D66A42E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t766D667D2E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t765348722E97363900FECD7C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t765348872E973B0800FECD7C /* LoggerHelper.swift in Sources */,\n\t\t\t\t765348882E973B0F00FECD7C /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t760D8D5A2EC5757B00252828 /* UserSecretManager.swift in Sources */,\n\t\t\t\t760D8D5C2EC5760E00252828 /* UsernamePassword.swift in Sources */,\n\t\t\t\t760D8D5B2EC575A100252828 /* SecretKeeper.swift in Sources */,\n\t\t\t\t760D8D5D2EC5769B00252828 /* DataExtension.swift in Sources */,\n\t\t\t\t760D8D5E2EC576B300252828 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t760B6B732EE890FE000C7E9B /* FDESetupHelper.swift in Sources */,\n\t\t\t\t765348962E973C7200FECD7C /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355B92870CA6A002E3867 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t766D669A2E962133009CE2BF /* NSImage+String.swift in Sources */,\n\t\t\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t766D66922E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */,\n\t\t\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t766D66B12E962231009CE2BF /* NSError+EasyError.m in Sources */,\n\t\t\t\t76F0D8562EBBEF2B001DAC01 /* TCSTKSmartCard.m in Sources */,\n\t\t\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t766D669F2E962157009CE2BF /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t766D668E2E9620F5009CE2BF /* NSData+SHA1.m in Sources */,\n\t\t\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */,\n\t\t\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */,\n\t\t\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */,\n\t\t\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */,\n\t\t\t\t766D66A12E96216E009CE2BF /* TCSKeychain.m in Sources */,\n\t\t\t\t766D66AE2E9621EC009CE2BF /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */,\n\t\t\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */,\n\t\t\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t766D66852E96203C009CE2BF /* NetworkManager.swift in Sources */,\n\t\t\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */,\n\t\t\t\t76C661D92D3974910005F2CD /* PinPromptWindowController.swift in Sources */,\n\t\t\t\t766D66AB2E962198009CE2BF /* TCTaskHelper.m in Sources */,\n\t\t\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t764297AD2D015AB800678928 /* SetupCardWindowController.swift in Sources */,\n\t\t\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */,\n\t\t\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t766D67782E96249A009CE2BF /* UsernamePassword.swift in Sources */,\n\t\t\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */,\n\t\t\t\t766C602E2D3F409D0033E274 /* XCredsAudit.swift in Sources */,\n\t\t\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */,\n\t\t\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t766D66902E9620FA009CE2BF /* NSData+HexString.m in Sources */,\n\t\t\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76EAAFD72CEFE22100A5FEE3 /* XCredsUserSetup.swift in Sources */,\n\t\t\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */,\n\t\t\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */,\n\t\t\t\t764446FD2CF80CD800E6289E /* StateFileHelper.swift in Sources */,\n\t\t\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */,\n\t\t\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t766D668C2E9620D9009CE2BF /* NSButton+Color.swift in Sources */,\n\t\t\t\t766D667C2E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76EAAFDA2CEFED3800A5FEE3 /* SecretKeeper.swift in Sources */,\n\t\t\t\t76EAAFDB2CEFED3800A5FEE3 /* UserSecretManager.swift in Sources */,\n\t\t\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */,\n\t\t\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */,\n\t\t\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t76BE1DA22ED526AC001A4BE8 /* GoogleLDAP.swift in Sources */,\n\t\t\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */,\n\t\t\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */,\n\t\t\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */,\n\t\t\t\t766D668A2E9620C6009CE2BF /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t766D66882E9620AC009CE2BF /* NetworkMonitor.swift in Sources */,\n\t\t\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */,\n\t\t\t\t76C840892D03BFF400E41802 /* PinSetWindowController.swift in Sources */,\n\t\t\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */,\n\t\t\t\t766D667A2E961FA9009CE2BF /* CCIDCardReader.swift in Sources */,\n\t\t\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */,\n\t\t\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */,\n\t\t\t\t764447142CF825C500E6289E /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76634F372D05FFA3000A63E8 /* LogOnly.swift in Sources */,\n\t\t\t\t76A35FD32EAC0DC400099940 /* FDESetupHelper.swift in Sources */,\n\t\t\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */,\n\t\t\t\t766D66A32E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F4F2A27C36A00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t766D66A62E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t766D667F2E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */,\n\t\t\t\t766D66952E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76A2474F2C22747400859E0A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76A2475C2C22747400859E0A /* TokenSession.swift in Sources */,\n\t\t\t\t766D66A92E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t766D66822E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t76A247582C22747400859E0A /* Token.swift in Sources */,\n\t\t\t\t76A2475A2C22747400859E0A /* TokenDriver.swift in Sources */,\n\t\t\t\t766D66982E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6128836EB1007C42B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t764447232CF830CB00E6289E /* DefaultsOverride.swift in Sources */,\n\t\t\t\t76A52FDB2CF625EC00591252 /* Logger.swift in Sources */,\n\t\t\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */,\n\t\t\t\t766D66A52E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t764447212CF8307200E6289E /* StateFileHelper.swift in Sources */,\n\t\t\t\t766D667E2E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t764447222CF830A700E6289E /* PrefKeys.swift in Sources */,\n\t\t\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */,\n\t\t\t\t766D66942E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069627FD1D00009E0F3A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t767917072E994FF200D99062 /* FileVaultLogin.swift in Sources */,\n\t\t\t\t766D66842E96203C009CE2BF /* NetworkManager.swift in Sources */,\n\t\t\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */,\n\t\t\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */,\n\t\t\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t76F0D8552EBBECFF001DAC01 /* TCSTKSmartCard.m in Sources */,\n\t\t\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */,\n\t\t\t\t766D66AD2E9621EC009CE2BF /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */,\n\t\t\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */,\n\t\t\t\t766D66892E9620C6009CE2BF /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */,\n\t\t\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */,\n\t\t\t\t766D66872E9620AC009CE2BF /* NetworkMonitor.swift in Sources */,\n\t\t\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t764447152CF825D500E6289E /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t766C602D2D3F409D0033E274 /* XCredsAudit.swift in Sources */,\n\t\t\t\t76C661DA2D3974F30005F2CD /* SetupCardWindowController.swift in Sources */,\n\t\t\t\t767917042E994F8D00D99062 /* HelperToolManager.swift in Sources */,\n\t\t\t\t76C8408B2D03BFF400E41802 /* PinSetWindowController.swift in Sources */,\n\t\t\t\t764446FE2CF80CD800E6289E /* StateFileHelper.swift in Sources */,\n\t\t\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */,\n\t\t\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */,\n\t\t\t\t766D66A02E96216E009CE2BF /* TCSKeychain.m in Sources */,\n\t\t\t\t766D669E2E962157009CE2BF /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */,\n\t\t\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */,\n\t\t\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t766D67792E96249A009CE2BF /* UsernamePassword.swift in Sources */,\n\t\t\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */,\n\t\t\t\t76EAAFDC2CEFED3800A5FEE3 /* SecretKeeper.swift in Sources */,\n\t\t\t\t76EAAFDD2CEFED3800A5FEE3 /* UserSecretManager.swift in Sources */,\n\t\t\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */,\n\t\t\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */,\n\t\t\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */,\n\t\t\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */,\n\t\t\t\t766D668B2E9620D9009CE2BF /* NSButton+Color.swift in Sources */,\n\t\t\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */,\n\t\t\t\t766D66912E962120009CE2BF /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */,\n\t\t\t\t76BE1DA12ED526AC001A4BE8 /* GoogleLDAP.swift in Sources */,\n\t\t\t\t766D66992E962133009CE2BF /* NSImage+String.swift in Sources */,\n\t\t\t\t76C661DB2D3975010005F2CD /* PinPromptWindowController.swift in Sources */,\n\t\t\t\t766D667B2E961FDB009CE2BF /* LoggerHelper.swift in Sources */,\n\t\t\t\t766D668F2E9620FA009CE2BF /* NSData+HexString.m in Sources */,\n\t\t\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */,\n\t\t\t\t766D668D2E9620F5009CE2BF /* NSData+SHA1.m in Sources */,\n\t\t\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */,\n\t\t\t\t766D66B22E962231009CE2BF /* NSError+EasyError.m in Sources */,\n\t\t\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */,\n\t\t\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */,\n\t\t\t\t766D66A22E962186009CE2BF /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t766D66AA2E962198009CE2BF /* TCTaskHelper.m in Sources */,\n\t\t\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */,\n\t\t\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t76A35FD22EAC0DC400099940 /* FDESetupHelper.swift in Sources */,\n\t\t\t\t766D66792E961FA9009CE2BF /* CCIDCardReader.swift in Sources */,\n\t\t\t\t766D66832E962019009CE2BF /* NSAlert+showAlert.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291F32C116EDB0075FBD8 /* XCreds Login Password */;\n\t\t\ttargetProxy = 760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291DF2C116E450075FBD8 /* XCreds Login Autofill */;\n\t\t\ttargetProxy = 760292052C116EEE0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 766355BC2870CA6A002E3867 /* XCredsLoginPlugin */;\n\t\t\ttargetProxy = 76319375287E19A500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319379287E204500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7631935C287D22C700D36BF7 /* authrights */;\n\t\t\ttargetProxy = 76319378287E204500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t767917032E994F0300D99062 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 765348752E97363900FECD7C /* FileVaultLoginHelper */;\n\t\t\ttargetProxy = 767917022E994F0300D99062 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76A247602C22747400859E0A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76A247522C22747400859E0A /* xcredstap */;\n\t\t\ttargetProxy = 76A2475F2C22747400859E0A /* PBXContainerItemProxy */;\n\t\t};\n\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */;\n\t\t\ttargetProxy = 76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t760291E82C116E470075FBD8 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E92C116E470075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291FA2C116EDB0075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = CredentialProviderViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76DC0A6C28836EB2007C42B2 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE06A227FD1D01009E0F3A /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t760291ED2C116E470075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_LSBackgroundOnly = YES;\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760291EE2C116E470075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_LSBackgroundOnly = YES;\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t760292022C116EDB0075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760292032C116EDB0075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76319361287D22C700D36BF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76319362287D22C700D36BF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7653487B2E97363900FECD7C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"FILEVAULTLOGINHELPER_TARGET=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7653487C2E97363900FECD7C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"FILEVAULTLOGINHELPER_TARGET=1\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766355BE2870CA6A002E3867 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2025 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSLocalNetworkUsageDescription = \"Detect if there is a connection to the internet\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766355BF2870CA6A002E3867 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2025 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSLocalNetworkUsageDescription = \"Detect if there is a connection to the internet\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F582A27C36A00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F592A27C36A00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76A247632C22747400859E0A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = tap/tap.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = tap/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = xcredstap;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds.tap;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/tap-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76A247642C22747400859E0A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = tap/tap.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = tap/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = xcredstap;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds.tap;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/tap-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76DC0A7028836EB2007C42B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76DC0A7128836EB2007C42B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A527FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"©  2025 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSLocalNetworkUsageDescription = \"Detect if there is a connection to the internets\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 5.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A627FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"©  2025 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSLocalNetworkUsageDescription = \"Detect if there is a connection to the internets\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 5.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A827FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A927FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 9059;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 5.8;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760291ED2C116E470075FBD8 /* Debug */,\n\t\t\t\t760291EE2C116E470075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760292022C116EDB0075FBD8 /* Debug */,\n\t\t\t\t760292032C116EDB0075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76319361287D22C700D36BF7 /* Debug */,\n\t\t\t\t76319362287D22C700D36BF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7653487A2E97363900FECD7C /* Build configuration list for PBXNativeTarget \"FileVaultLoginHelper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7653487B2E97363900FECD7C /* Debug */,\n\t\t\t\t7653487C2E97363900FECD7C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766355BE2870CA6A002E3867 /* Debug */,\n\t\t\t\t766355BF2870CA6A002E3867 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F582A27C36A00AA8DB9 /* Debug */,\n\t\t\t\t76786F592A27C36A00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76A247652C22747400859E0A /* Build configuration list for PBXNativeTarget \"xcredstap\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76A247632C22747400859E0A /* Debug */,\n\t\t\t\t76A247642C22747400859E0A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76DC0A7028836EB2007C42B2 /* Debug */,\n\t\t\t\t76DC0A7128836EB2007C42B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A527FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A627FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A827FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A927FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/apple/swift-argument-parser.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.0.0;\n\t\t\t};\n\t\t};\n\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/twocanoes/OIDCLite.git\";\n\t\t\trequirement = {\n\t\t\t\tbranch = develop;\n\t\t\t\tkind = branch;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t762177E52B7144460051B756 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76319365287D24E100D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76319368287D24F600D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76477E032C626B5D00F01D56 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t766355CD2870E9D3002E3867 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E02A12FAF900529D90 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76DD6D16285997F300A700ED /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 76EE069227FD1D00009E0F3A /* Project object */;\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"swift-argument-parser\",\n        \"repositoryURL\": \"https://github.com/apple/swift-argument-parser.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"309a47b2b1d9b5e991f36961c983ecec72275be3\",\n          \"version\": \"1.6.1\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcuserdata/tperfitt.xcuserdatad/Bookmarks/bookmarks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>top-level-items</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>destination</key>\n\t\t\t<dict>\n\t\t\t\t<key>rebasable-url</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>base</key>\n\t\t\t\t\t<string>workspace</string>\n\t\t\t\t\t<key>payload</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>relative-path</key>\n\t\t\t\t\t\t<string>XCredsLoginPlugIn/LoginWindow/NetworkMonitor.swift</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>type</key>\n\t\t\t\t<string>DVTDocumentLocation</string>\n\t\t\t</dict>\n\t\t\t<key>type</key>\n\t\t\t<string>bookmark</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcuserdata/tperfitt.xcuserdatad/IDEFindNavigatorScopes.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array/>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project.xcworkspace/xcuserdata/tperfitt.xcuserdatad/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildLocationStyle</key>\n\t<string>UseAppPreferences</string>\n\t<key>CustomBuildLocationType</key>\n\t<string>RelativeToDerivedData</string>\n\t<key>DerivedDataCustomLocation</key>\n\t<string>/Applications/Build</string>\n\t<key>DerivedDataLocationStyle</key>\n\t<string>AbsolutePath</string>\n\t<key>IssueFilterStyle</key>\n\t<string>ShowActiveSchemeOnly</string>\n\t<key>LiveSourceIssuesEnabled</key>\n\t<true/>\n\t<key>ShowSharedSchemesAutomaticallyEnabled</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCreds.xcodeproj/project_BACKUP_63385.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEBF288B75140063A644 /* XCredsCreateUser.swift */; };\n\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */; };\n\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */; };\n\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486B28A3575000C6A02B /* XCredsLoginDone.swift */; };\n\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 762177E52B7144460051B756 /* OIDCLite */; };\n\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */; };\n\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */; };\n\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7631935F287D22C700D36BF7 /* authrights.swift */; };\n\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319365287D24E100D36BF7 /* ArgumentParser */; };\n\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319368287D24F600D36BF7 /* ArgumentParser */; };\n\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */; };\n\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */ = {isa = PBXBuildFile; fileRef = 7631935D287D22C700D36BF7 /* authrights */; };\n\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */; };\n\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */; };\n\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */; };\n\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 763DDF192B4F1DD4000D48CC /* GSS.framework */; };\n\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76477E032C626B5D00F01D56 /* OIDCLite */; };\n\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */; };\n\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */; };\n\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */ = {isa = PBXBuildFile; fileRef = 764D8132284D14A500B3EE54 /* Credits.txt */; };\n\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDF62A1474330075980B /* LoginWebViewController.xib */; };\n\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */; };\n\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */; };\n\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 766355CD2870E9D3002E3867 /* OIDCLite */; };\n\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355D22870F29A002E3867 /* TestWindowController.swift */; };\n\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 766355D32870F29A002E3867 /* TestWindowController.xib */; };\n\t\t766355D928711C51002E3867 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */ = {isa = PBXBuildFile; fileRef = 766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */; };\n\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A6284AABC500CCD6FF /* NotifyManager.swift */; };\n\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */; };\n\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B0284B021500CCD6FF /* MainController.swift */; };\n\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908328908E40004E7085 /* WifiWindowController.swift */; };\n\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7677908528908E40004E7085 /* WifiWindowController.xib */; };\n\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F552A27C36A00AA8DB9 /* main.swift */; };\n\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F652A27C62D00AA8DB9 /* main.swift */; };\n\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */; };\n\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */; };\n\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */; };\n\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */; };\n\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E02A12FAF900529D90 /* OIDCLite */; };\n\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E22A12FB4900529D90 /* ArgumentParser */; };\n\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */; };\n\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E2287202080013E2A1 /* RestartX.png */; };\n\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E6287202AF0013E2A1 /* ShutdownX.png */; };\n\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */; };\n\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */; };\n\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */; };\n\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */; };\n\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */; };\n\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FF2872A3030013E2A1 /* loginwindow.png */; };\n\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C084092A9A2635008039FA /* ControlsViewController.xib */; };\n\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t76C63A322A22872700810C53 /* History.md in Resources */ = {isa = PBXBuildFile; fileRef = 76C63A312A22872700810C53 /* History.md */; };\n\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */ = {isa = PBXBuildFile; fileRef = 76CB907C288112AF00C70D0C /* xcreds_login.sh */; };\n\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */; };\n\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */; };\n\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A6728836EB1007C42B2 /* AppDelegate.swift */; };\n\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6928836EB2007C42B2 /* Assets.xcassets */; };\n\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6B28836EB2007C42B2 /* MainMenu.xib */; };\n\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */; };\n\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */; };\n\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */; };\n\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A7628837028007C42B2 /* returnArrow.png */; };\n\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76DD6D16285997F300A700ED /* OIDCLite */; };\n\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */; };\n\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE069D27FD1D00009E0F3A /* AppDelegate.swift */; };\n\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06A127FD1D01009E0F3A /* MainMenu.xib */; };\n\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */; };\n\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */; };\n\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */; };\n\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */; };\n\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */; };\n\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */; };\n\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t76319375287E19A500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 766355BC2870CA6A002E3867;\n\t\t\tremoteInfo = XCredsLoginPlugin;\n\t\t};\n\t\t76319378287E204500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7631935C287D22C700D36BF7;\n\t\t\tremoteInfo = authrights;\n\t\t};\n\t\t76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76DC0A6428836EB1007C42B2;\n\t\t\tremoteInfo = \"XCreds Login Overlay\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t7631935B287D22C700D36BF7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkMonitor.swift; path = XCredsLoginPlugIn/LoginWindow/NetworkMonitor.swift; sourceTree = SOURCE_ROOT; };\n\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSBundle+FindBundlePath.swift\"; sourceTree = \"<group>\"; };\n\t\t760418CE2A1332210051411B /* SignIn.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SignIn.xib; sourceTree = \"<group>\"; };\n\t\t760418CF2A1332210051411B /* SignInWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWindowController.swift; sourceTree = \"<group>\"; };\n\t\t760418D42A1332520051411B /* DS+AD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"DS+AD.swift\"; sourceTree = \"<group>\"; };\n\t\t760418D62A1332660051411B /* DSQueryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSQueryable.swift; sourceTree = \"<group>\"; };\n\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemInfoHelper.swift; sourceTree = \"<group>\"; };\n\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalCheckAndMigrate.swift; sourceTree = \"<group>\"; };\n\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoLoMechanism.swift; sourceTree = \"<group>\"; };\n\t\t760418DE2A1334D00051411B /* CheckAD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckAD.swift; sourceTree = \"<group>\"; };\n\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsCreateUser.swift; sourceTree = \"<group>\"; };\n\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsEnableFDE.swift; sourceTree = \"<group>\"; };\n\t\t7613FDF6289E114F00340CCD /* loadpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = loadpage.html; sourceTree = \"<group>\"; };\n\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = XCreds/Assets.xcassets/AppIcon.appiconset/icon_128x128.png; sourceTree = \"<group>\"; };\n\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoginProgressWindowController.xib; path = XCredsLoginPlugIn/LoginProgressWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginProgressWindowController.swift; path = XCredsLoginPlugIn/LoginProgressWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginDone.swift; sourceTree = \"<group>\"; };\n\t\t7631935D287D22C700D36BF7 /* authrights */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = authrights; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7631935F287D22C700D36BF7 /* authrights.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = authrights.swift; sourceTree = \"<group>\"; };\n\t\t7632909B2876673500CF8857 /* DataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataExtension.swift; sourceTree = \"<group>\"; };\n\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsKeychainAdd.swift; sourceTree = \"<group>\"; };\n\t\t7632E3A02873497C00E37923 /* LogShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogShim.swift; path = Mechanisms/LogShim.swift; sourceTree = \"<group>\"; };\n\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesktopLoginWindowController.swift; sourceTree = \"<group>\"; };\n\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitePopoverBackgroundView.swift; sourceTree = \"<group>\"; };\n\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounterMenu.swift; sourceTree = \"<group>\"; };\n\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = System/Library/Frameworks/GSS.framework; sourceTree = SDKROOT; };\n\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = xcredsmenuItemWindowBackgroundImage.png; sourceTree = \"<group>\"; };\n\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyLocalPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VerifyLocalPasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyOIDCPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerifyOIDCPassword.xib; sourceTree = \"<group>\"; };\n\t\t764D812E284C06AB00B3EE54 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = \"<group>\"; };\n\t\t764D8132284D14A500B3EE54 /* Credits.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.txt; sourceTree = \"<group>\"; };\n\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalUsersViewController.xib; sourceTree = \"<group>\"; };\n\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWebViewController.xib; sourceTree = \"<group>\"; };\n\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoMADSession.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRecord.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBB2B35055F003A23DB /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNSResolver.m; sourceTree = \"<group>\"; };\n\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolver.h; sourceTree = \"<group>\"; };\n\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ADLDAPPing.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlistUtil.swift; sourceTree = \"<group>\"; };\n\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DED22B350644003A23DB /* GSSItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GSSItem.h; sourceTree = \"<group>\"; };\n\t\t7657DED32B35064E003A23DB /* krb5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5.h; sourceTree = \"<group>\"; };\n\t\t7657DED52B351A67003A23DB /* KerbUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KerbUtil.h; sourceTree = \"<group>\"; };\n\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UNIXUtilities.swift; sourceTree = \"<group>\"; };\n\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DefaultBackground.png; sourceTree = \"<group>\"; };\n\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCredsLoginPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XCredsLoginPlugin.h; path = XCredsLoginPlugIn/XCredsLoginPlugin.h; sourceTree = SOURCE_ROOT; };\n\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XCredsLoginPlugin.m; path = XCredsLoginPlugIn/XCredsLoginPlugin.m; sourceTree = SOURCE_ROOT; };\n\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCredsLoginPlugin-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t766355D22870F29A002E3867 /* TestWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestWindowController.swift; path = XCredsLoginPlugIn/TestWindowController.swift; sourceTree = \"<group>\"; };\n\t\t766355D32870F29A002E3867 /* TestWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = TestWindowController.xib; path = XCredsLoginPlugIn/TestWindowController.xib; sourceTree = \"<group>\"; };\n\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginWebViewController.swift; path = XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift; sourceTree = SOURCE_ROOT; };\n\t\t766355E128713C47002E3867 /* LoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t766355E4287148C1002E3867 /* Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tokens.swift; path = Shared/Tokens.swift; sourceTree = SOURCE_ROOT; };\n\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseChecker.swift; sourceTree = \"<group>\"; };\n\t\t766CC42129D3A320009BC526 /* Paddle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paddle.framework; path = Carthage/Build/Mac/Paddle.framework; sourceTree = \"<group>\"; };\n\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ProductLicense.framework; path = Carthage/Build/Mac/ProductLicense.framework; sourceTree = \"<group>\"; };\n\t\t766CC43729D3AED2009BC526 /* errorpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorpage.html; sourceTree = \"<group>\"; };\n\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pleaseWaitGraphic.png; sourceTree = \"<group>\"; };\n\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsOverride.swift; sourceTree = \"<group>\"; };\n\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyManager.swift; sourceTree = \"<group>\"; };\n\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleManager.swift; sourceTree = \"<group>\"; };\n\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordUtils.swift; sourceTree = \"<group>\"; };\n\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityPrivateAPI.h; sourceTree = \"<group>\"; };\n\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCreds-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t767116B0284B021500CCD6FF /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = \"<group>\"; };\n\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainUtil.swift; sourceTree = \"<group>\"; };\n\t\t7675444428918CD100613840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = XCredsLoginPlugin/Info.plist; sourceTree = \"<group>\"; };\n\t\t7677908328908E40004E7085 /* WifiWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7677908428908E40004E7085 /* WifiManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiManager.swift; sourceTree = \"<group>\"; };\n\t\t7677908528908E40004E7085 /* WifiWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WifiWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthRightsHelper.swift; path = Shared/AuthRightsHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = auth_mech_fixup; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F552A27C36A00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F632A27C62D00AA8DB9 /* test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F652A27C62D00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = \"auth_mech_fixup-Bridging-Header.h\"; path = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\"; sourceTree = SOURCE_ROOT; };\n\t\t767B939B2A28279E0038935E /* View+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libinfo.tbd; path = usr/lib/libinfo.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsystem_info.tbd; path = usr/lib/system/libsystem_info.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; };\n\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutWindow.xib; sourceTree = \"<group>\"; };\n\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.twocanoes.xcreds.plist; path = \"Profile Manifest/com.twocanoes.xcreds.plist\"; sourceTree = \"<group>\"; };\n\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSImage+String.swift\"; sourceTree = \"<group>\"; };\n\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DefaultsHelper.swift; path = XCreds/DefaultsHelper.swift; sourceTree = \"<group>\"; };\n\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = \"Helper+JWTDecode.swift\"; path = \"XCreds/Helper+JWTDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSKeychain.m; sourceTree = \"<group>\"; };\n\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSKeychain.h; sourceTree = \"<group>\"; };\n\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+SHA1.m\"; sourceTree = \"<group>\"; };\n\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+SHA1.h\"; sourceTree = \"<group>\"; };\n\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+HexString.m\"; sourceTree = \"<group>\"; };\n\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+HexString.h\"; sourceTree = \"<group>\"; };\n\t\t76BEF7D42871F36C0013E2A1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSReturnWindow.m; sourceTree = \"<group>\"; };\n\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSReturnWindow.h; sourceTree = \"<group>\"; };\n\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7E2287202080013E2A1 /* RestartX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RestartX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"RestartX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ShutdownX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"ShutdownX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsBaseMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsPowerControlMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTaskWrapper.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextAndHintHandling.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthorizationDBManager.swift; path = XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift; sourceTree = SOURCE_ROOT; };\n\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"loginwindow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loginwindow.png; sourceTree = \"<group>\"; };\n\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControlsViewController.xib; sourceTree = \"<group>\"; };\n\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounter.swift; sourceTree = \"<group>\"; };\n\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };\n\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = System/Library/Frameworks/Kerberos.framework; sourceTree = SDKROOT; };\n\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KerbUtil.m; sourceTree = \"<group>\"; };\n\t\t76C63A312A22872700810C53 /* History.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = History.md; sourceTree = \"<group>\"; };\n\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+URLDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = xcreds_login.sh; sourceTree = \"<group>\"; };\n\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocalAccountWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SelectLocalAccountWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainLoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCTaskWrapperWithBlocks.h; sourceTree = \"<group>\"; };\n\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCTaskWrapperWithBlocks.m; sourceTree = \"<group>\"; };\n\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSUnifiedLogger.m; sourceTree = \"<group>\"; };\n\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSUnifiedLogger.h; sourceTree = \"<group>\"; };\n\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+TCSRealHomeFolder.m\"; sourceTree = \"<group>\"; };\n\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+TCSRealHomeFolder.h\"; sourceTree = \"<group>\"; };\n\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = get_pw.js; path = Javascript/get_pw/get_pw.js; sourceTree = \"<group>\"; };\n\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Overlay.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76DC0A6C28836EB2007C42B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_Login_Overlay.entitlements; sourceTree = \"<group>\"; };\n\t\t76DC0A7628837028007C42B2 /* returnArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = returnArrow.png; sourceTree = \"<group>\"; };\n\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-overlay.plist\"; sourceTree = \"<group>\"; };\n\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCSXCredsLoginOverlayWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = \"XCreds-Login-Overlay-Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t76DD6D122859978F00A700ED /* OIDCLite */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = OIDCLite; path = ../OIDCLite; sourceTree = \"<group>\"; };\n\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsMechanismProtocol.swift; sourceTree = \"<group>\"; };\n\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TCSLoginWindowUtilities.h; path = XCreds/TCSLoginWindowUtilities.h; sourceTree = \"<group>\"; };\n\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TCSLoginWindowUtilities.m; path = XCreds/TCSLoginWindowUtilities.m; sourceTree = \"<group>\"; };\n\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCreds.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76EE06A227FD1D01009E0F3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = xCreds.entitlements; sourceTree = \"<group>\"; };\n\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefKeys.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+ForceToFront.swift\"; sourceTree = \"<group>\"; };\n\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DesktopLoginWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = \"<group>\"; };\n\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerHelper.swift; sourceTree = \"<group>\"; };\n\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+Base64URLEncoded.swift\"; sourceTree = \"<group>\"; };\n\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainLoginWindowController.swift; path = XCreds/MainLoginWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainLoginWindowController.xib; path = XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusMenuWindowController.xib; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7631935A287D22C700D36BF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */,\n\t\t\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BA2870CA6A002E3867 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F502A27C36A00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F602A27C62D00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6228836EB1007C42B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069727FD1D00009E0F3A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */,\n\t\t\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */,\n\t\t\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t760418CC2A1331710051411B /* NomadLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418DE2A1334D00051411B /* CheckAD.swift */,\n\t\t\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */,\n\t\t\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */,\n\t\t\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */,\n\t\t\t\t760418D62A1332660051411B /* DSQueryable.swift */,\n\t\t\t\t760418D42A1332520051411B /* DS+AD.swift */,\n\t\t\t\t760418CD2A1332210051411B /* UI */,\n\t\t\t);\n\t\t\tpath = NomadLogin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CD2A1332210051411B /* UI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418CE2A1332210051411B /* SignIn.xib */,\n\t\t\t);\n\t\t\tpath = UI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7631935E287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */,\n\t\t\t\t7631935F287D22C700D36BF7 /* authrights.swift */,\n\t\t\t);\n\t\t\tpath = authrights;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7657DEDC2B351BF9003A23DB /* headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */,\n\t\t\t\t7657DED32B35064E003A23DB /* krb5.h */,\n\t\t\t\t7657DED22B350644003A23DB /* GSSItem.h */,\n\t\t\t);\n\t\t\tpath = headers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766355C72870D1B5002E3867 /* XCredsLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */,\n\t\t\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */,\n\t\t\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */,\n\t\t\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */,\n\t\t\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */,\n\t\t\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */,\n\t\t\t\t7613FDF6289E114F00340CCD /* loadpage.html */,\n\t\t\t\t766CC43729D3AED2009BC526 /* errorpage.html */,\n\t\t\t\t7677908428908E40004E7085 /* WifiManager.swift */,\n\t\t\t\t7677908328908E40004E7085 /* WifiWindowController.swift */,\n\t\t\t\t7677908528908E40004E7085 /* WifiWindowController.xib */,\n\t\t\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */,\n\t\t\t\t7632E3A02873497C00E37923 /* LogShim.swift */,\n\t\t\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */,\n\t\t\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */,\n\t\t\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */,\n\t\t\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */,\n\t\t\t\t76BEF7F028724E520013E2A1 /* LoginWindow */,\n\t\t\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */,\n\t\t\t);\n\t\t\tname = XCredsLogin;\n\t\t\tpath = XCredsLoginPlugIn;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */,\n\t\t\t\t76786F552A27C36A00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = auth_mech_fixup;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F642A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F652A27C62D00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76BEF7D42871F36C0013E2A1 /* main.swift */,\n\t\t\t);\n\t\t\tpath = FakeTrue;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */,\n\t\t\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */,\n\t\t\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */,\n\t\t\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */,\n\t\t\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */,\n\t\t\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */,\n\t\t\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */,\n\t\t\t);\n\t\t\tpath = Mechanisms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F028724E520013E2A1 /* LoginWindow */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */,\n\t\t\t\t760418CF2A1332210051411B /* SignInWindowController.swift */,\n\t\t\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */,\n\t\t\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */,\n\t\t\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */,\n\t\t\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */,\n\t\t\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */,\n\t\t\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */,\n\t\t\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */,\n\t\t\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */,\n\t\t\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */,\n\t\t\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */,\n\t\t\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */,\n\t\t\t\t766355E128713C47002E3867 /* LoginWindow.swift */,\n\t\t\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */,\n\t\t\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */,\n\t\t\t\t76BEF7F128724EB60013E2A1 /* images */,\n\t\t\t);\n\t\t\tpath = LoginWindow;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F128724EB60013E2A1 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */,\n\t\t\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */,\n\t\t\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */,\n\t\t\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */,\n\t\t\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */,\n\t\t\t\t76BEF7E2287202080013E2A1 /* RestartX.png */,\n\t\t\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */,\n\t\t\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */,\n\t\t\t\t7657DED52B351A67003A23DB /* KerbUtil.h */,\n\t\t\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */,\n\t\t\t\t7657DEDC2B351BF9003A23DB /* headers */,\n\t\t\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */,\n\t\t\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */,\n\t\t\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */,\n\t\t\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */,\n\t\t\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */,\n\t\t\t\t7657DEBB2B35055F003A23DB /* Logger.swift */,\n\t\t\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */,\n\t\t\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */,\n\t\t\t);\n\t\t\tname = NoMAD;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */,\n\t\t\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */,\n\t\t\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */,\n\t\t\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */,\n\t\t\t\t76DC0A7628837028007C42B2 /* returnArrow.png */,\n\t\t\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */,\n\t\t\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */,\n\t\t\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */,\n\t\t\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds Login Overlay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D112859978F00A700ED /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76DD6D122859978F00A700ED /* OIDCLite */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D15285997F300A700ED /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */,\n\t\t\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */,\n\t\t\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */,\n\t\t\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */,\n\t\t\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */,\n\t\t\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */,\n\t\t\t\t766CC42129D3A320009BC526 /* Paddle.framework */,\n\t\t\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069127FD1D00009E0F3A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */,\n\t\t\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */,\n\t\t\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */,\n\t\t\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */,\n\t\t\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */,\n\t\t\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */,\n\t\t\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */,\n\t\t\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */,\n\t\t\t\t76C63A312A22872700810C53 /* History.md */,\n\t\t\t\t760418CC2A1331710051411B /* NomadLogin */,\n\t\t\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */,\n\t\t\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */,\n\t\t\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */,\n\t\t\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */,\n\t\t\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */,\n\t\t\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */,\n\t\t\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */,\n\t\t\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */,\n\t\t\t\t7675444428918CD100613840 /* Info.plist */,\n\t\t\t\t76DD6D15285997F300A700ED /* Frameworks */,\n\t\t\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */,\n\t\t\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */,\n\t\t\t\t7632909B2876673500CF8857 /* DataExtension.swift */,\n\t\t\t\t766355D22870F29A002E3867 /* TestWindowController.swift */,\n\t\t\t\t766355D32870F29A002E3867 /* TestWindowController.xib */,\n\t\t\t\t76DD6D112859978F00A700ED /* Packages */,\n\t\t\t\t766355C72870D1B5002E3867 /* XCredsLogin */,\n\t\t\t\t76EE069C27FD1D00009E0F3A /* XCreds */,\n\t\t\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */,\n\t\t\t\t7631935E287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F642A27C62D00AA8DB9 /* test */,\n\t\t\t\t76EE069B27FD1D00009E0F3A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069B27FD1D00009E0F3A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */,\n\t\t\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */,\n\t\t\t\t7631935D287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */,\n\t\t\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F632A27C62D00AA8DB9 /* test */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069C27FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */,\n\t\t\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */,\n\t\t\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */,\n\t\t\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */,\n\t\t\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */,\n\t\t\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */,\n\t\t\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */,\n\t\t\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */,\n\t\t\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */,\n\t\t\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */,\n\t\t\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */,\n\t\t\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */,\n\t\t\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */,\n\t\t\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */,\n\t\t\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */,\n\t\t\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */,\n\t\t\t\t764D8132284D14A500B3EE54 /* Credits.txt */,\n\t\t\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */,\n\t\t\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */,\n\t\t\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */,\n\t\t\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */,\n\t\t\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */,\n\t\t\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */,\n\t\t\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */,\n\t\t\t\t767B939B2A28279E0038935E /* View+Shake.swift */,\n\t\t\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */,\n\t\t\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */,\n\t\t\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */,\n\t\t\t\t766355E4287148C1002E3867 /* Tokens.swift */,\n\t\t\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */,\n\t\t\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */,\n\t\t\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */,\n\t\t\t\t764D812E284C06AB00B3EE54 /* defaults.plist */,\n\t\t\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */,\n\t\t\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */,\n\t\t\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */,\n\t\t\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */,\n\t\t\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */,\n\t\t\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */,\n\t\t\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */,\n\t\t\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */,\n\t\t\t\t767116B0284B021500CCD6FF /* MainController.swift */,\n\t\t\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */,\n\t\t\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */,\n\t\t\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */,\n\t\t\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */,\n\t\t\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = XCreds;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXLegacyTarget section */\n\t\t766F4C4C2883B88F0021F548 /* Send To Test */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"app_to_test.sh mba.local\";\n\t\t\tbuildConfigurationList = 766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = /bin/bash;\n\t\t\tbuildWorkingDirectory = /Users/tperfitt/Documents/Projects/xcreds;\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Send To Test\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Send To Test\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXNativeTarget section */\n\t\t7631935C287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76319359287D22C700D36BF7 /* Sources */,\n\t\t\t\t7631935A287D22C700D36BF7 /* Frameworks */,\n\t\t\t\t7631935B287D22C700D36BF7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = authrights;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76AB89E02A12FAF900529D90 /* OIDCLite */,\n\t\t\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */,\n\t\t\t);\n\t\t\tproductName = authrights;\n\t\t\tproductReference = 7631935D287D22C700D36BF7 /* authrights */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t766355B92870CA6A002E3867 /* Sources */,\n\t\t\t\t766355BA2870CA6A002E3867 /* Frameworks */,\n\t\t\t\t766355BB2870CA6A002E3867 /* Resources */,\n\t\t\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = XCredsLoginPlugin;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t766355CD2870E9D3002E3867 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = XCredsLoginPlugin;\n\t\t\tproductReference = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F4F2A27C36A00AA8DB9 /* Sources */,\n\t\t\t\t76786F502A27C36A00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = auth_mech_fixup;\n\t\t\tproductName = auth_mech_fixup;\n\t\t\tproductReference = 76786F532A27C36A00AA8DB9 /* auth_mech_fixup */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76786F622A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F5F2A27C62D00AA8DB9 /* Sources */,\n\t\t\t\t76786F602A27C62D00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = test;\n\t\t\tproductName = test;\n\t\t\tproductReference = 76786F632A27C62D00AA8DB9 /* test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76DC0A6128836EB1007C42B2 /* Sources */,\n\t\t\t\t76DC0A6228836EB1007C42B2 /* Frameworks */,\n\t\t\t\t76DC0A6328836EB1007C42B2 /* Resources */,\n\t\t\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Overlay\";\n\t\t\tproductName = \"XCreds Login Overlay\";\n\t\t\tproductReference = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t76EE069927FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76EE069627FD1D00009E0F3A /* Sources */,\n\t\t\t\t76EE069727FD1D00009E0F3A /* Frameworks */,\n\t\t\t\t76EE069827FD1D00009E0F3A /* Resources */,\n\t\t\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */,\n\t\t\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76319379287E204500D36BF7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = XCreds;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76DD6D16285997F300A700ED /* OIDCLite */,\n\t\t\t\t76319365287D24E100D36BF7 /* ArgumentParser */,\n\t\t\t\t76319368287D24F600D36BF7 /* ArgumentParser */,\n\t\t\t\t762177E52B7144460051B756 /* OIDCLite */,\n\t\t\t\t76477E032C626B5D00F01D56 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = xCreds;\n\t\t\tproductReference = 76EE069A27FD1D00009E0F3A /* XCreds.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t76EE069227FD1D00009E0F3A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1430;\n\t\t\t\tLastUpgradeCheck = 1330;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7631935C287D22C700D36BF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t766355BC2870CA6A002E3867 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1340;\n\t\t\t\t\t};\n\t\t\t\t\t766F4C4C2883B88F0021F548 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76786F522A27C36A00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76786F622A27C62D00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76DC0A6428836EB1007C42B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76EE069927FD1D00009E0F3A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 76EE069127FD1D00009E0F3A;\n\t\t\tpackageReferences = (\n\t\t\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */,\n\t\t\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 76EE069B27FD1D00009E0F3A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t76EE069927FD1D00009E0F3A /* XCreds */,\n\t\t\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */,\n\t\t\t\t7631935C287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t766F4C4C2883B88F0021F548 /* Send To Test */,\n\t\t\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F622A27C62D00AA8DB9 /* test */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t766355BB2870CA6A002E3867 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */,\n\t\t\t\t766355D928711C51002E3867 /* defaults.plist in Resources */,\n\t\t\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */,\n\t\t\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */,\n\t\t\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */,\n\t\t\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */,\n\t\t\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */,\n\t\t\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */,\n\t\t\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */,\n\t\t\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */,\n\t\t\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */,\n\t\t\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */,\n\t\t\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */,\n\t\t\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */,\n\t\t\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */,\n\t\t\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */,\n\t\t\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */,\n\t\t\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6328836EB1007C42B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */,\n\t\t\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */,\n\t\t\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */,\n\t\t\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */,\n\t\t\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */,\n\t\t\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069827FD1D00009E0F3A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */,\n\t\t\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */,\n\t\t\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */,\n\t\t\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */,\n\t\t\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */,\n\t\t\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */,\n\t\t\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */,\n\t\t\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */,\n\t\t\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */,\n\t\t\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */,\n\t\t\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */,\n\t\t\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */,\n\t\t\t\t76C63A322A22872700810C53 /* History.md in Resources */,\n\t\t\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */,\n\t\t\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */,\n\t\t\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */,\n\t\t\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */,\n\t\t\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t76319359287D22C700D36BF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */,\n\t\t\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355B92870CA6A002E3867 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */,\n\t\t\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */,\n\t\t\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */,\n\t\t\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */,\n\t\t\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */,\n\t\t\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */,\n\t\t\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */,\n\t\t\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */,\n\t\t\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */,\n\t\t\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */,\n\t\t\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */,\n\t\t\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */,\n\t\t\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */,\n\t\t\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */,\n\t\t\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */,\n\t\t\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */,\n\t\t\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */,\n\t\t\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */,\n\t\t\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */,\n\t\t\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */,\n\t\t\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */,\n\t\t\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */,\n\t\t\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */,\n\t\t\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */,\n\t\t\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */,\n\t\t\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F4F2A27C36A00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F5F2A27C62D00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6128836EB1007C42B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */,\n\t\t\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069627FD1D00009E0F3A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */,\n\t\t\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */,\n\t\t\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */,\n\t\t\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */,\n\t\t\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */,\n\t\t\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */,\n\t\t\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */,\n\t\t\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */,\n\t\t\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */,\n\t\t\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */,\n\t\t\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */,\n\t\t\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */,\n\t\t\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */,\n\t\t\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */,\n\t\t\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */,\n\t\t\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */,\n\t\t\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */,\n\t\t\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */,\n\t\t\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */,\n\t\t\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */,\n\t\t\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */,\n\t\t\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */,\n\t\t\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */,\n\t\t\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */,\n\t\t\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 766355BC2870CA6A002E3867 /* XCredsLoginPlugin */;\n\t\t\ttargetProxy = 76319375287E19A500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319379287E204500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7631935C287D22C700D36BF7 /* authrights */;\n\t\t\ttargetProxy = 76319378287E204500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */;\n\t\t\ttargetProxy = 76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76DC0A6C28836EB2007C42B2 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE06A227FD1D01009E0F3A /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n<<<<<<< HEAD\n=======\n\t\t760291ED2C116E470075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760291EE2C116E470075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t760292022C116EDB0075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760292032C116EDB0075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n>>>>>>> develop\n\t\t76319361287D22C700D36BF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76319362287D22C700D36BF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766355BE2870CA6A002E3867 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766355BF2870CA6A002E3867 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766F4C4E2883B88F0021F548 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEBUGGING_SYMBOLS = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766F4C4F2883B88F0021F548 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F582A27C36A00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F592A27C36A00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F682A27C62D00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F692A27C62D00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76DC0A7028836EB2007C42B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76DC0A7128836EB2007C42B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A527FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A627FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A827FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A927FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<< HEAD\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n=======\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n>>>>>>> develop\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76319361287D22C700D36BF7 /* Debug */,\n\t\t\t\t76319362287D22C700D36BF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766355BE2870CA6A002E3867 /* Debug */,\n\t\t\t\t766355BF2870CA6A002E3867 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766F4C4E2883B88F0021F548 /* Debug */,\n\t\t\t\t766F4C4F2883B88F0021F548 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F582A27C36A00AA8DB9 /* Debug */,\n\t\t\t\t76786F592A27C36A00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F682A27C62D00AA8DB9 /* Debug */,\n\t\t\t\t76786F692A27C62D00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76DC0A7028836EB2007C42B2 /* Debug */,\n\t\t\t\t76DC0A7128836EB2007C42B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A527FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A627FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A827FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A927FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/apple/swift-argument-parser.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.0.0;\n\t\t\t};\n\t\t};\n\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/twocanoes/OIDCLite.git\";\n\t\t\trequirement = {\n\t\t\t\tbranch = main;\n\t\t\t\tkind = branch;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t762177E52B7144460051B756 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76319365287D24E100D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76319368287D24F600D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76477E032C626B5D00F01D56 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t766355CD2870E9D3002E3867 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E02A12FAF900529D90 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76DD6D16285997F300A700ED /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 76EE069227FD1D00009E0F3A /* Project object */;\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/project_BASE_63385.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 60;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E22C116E450075FBD8 /* AppDelegate.swift */; };\n\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E42C116E450075FBD8 /* ViewController.swift */; };\n\t\t760291E72C116E470075FBD8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 760291E62C116E470075FBD8 /* Assets.xcassets */; };\n\t\t760291EA2C116E470075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291E92C116E470075FBD8 /* Base */; };\n\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */ = {isa = PBXBuildFile; fileRef = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */; };\n\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 760291CB2C1166870075FBD8 /* AuthenticationServices.framework */; };\n\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */; };\n\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291FA2C116EDB0075FBD8 /* Base */; };\n\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t760292092C1175360075FBD8 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t7602920F2C1175DA0075FBD8 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t760292102C1175DA0075FBD8 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292162C1176A90075FBD8 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760292192C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t7602921A2C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEBF288B75140063A644 /* XCredsCreateUser.swift */; };\n\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */; };\n\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */; };\n\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486B28A3575000C6A02B /* XCredsLoginDone.swift */; };\n\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 762177E52B7144460051B756 /* OIDCLite */; };\n\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */; };\n\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */; };\n\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7631935F287D22C700D36BF7 /* authrights.swift */; };\n\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319365287D24E100D36BF7 /* ArgumentParser */; };\n\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319368287D24F600D36BF7 /* ArgumentParser */; };\n\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */; };\n\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */ = {isa = PBXBuildFile; fileRef = 7631935D287D22C700D36BF7 /* authrights */; };\n\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */; };\n\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */; };\n\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 763DDF192B4F1DD4000D48CC /* GSS.framework */; };\n\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */; };\n\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */; };\n\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */ = {isa = PBXBuildFile; fileRef = 764D8132284D14A500B3EE54 /* Credits.txt */; };\n\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDF62A1474330075980B /* LoginWebViewController.xib */; };\n\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */; };\n\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */; };\n\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 766355CD2870E9D3002E3867 /* OIDCLite */; };\n\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355D22870F29A002E3867 /* TestWindowController.swift */; };\n\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 766355D32870F29A002E3867 /* TestWindowController.xib */; };\n\t\t766355D928711C51002E3867 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */ = {isa = PBXBuildFile; fileRef = 766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */; };\n\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A6284AABC500CCD6FF /* NotifyManager.swift */; };\n\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */; };\n\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B0284B021500CCD6FF /* MainController.swift */; };\n\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908328908E40004E7085 /* WifiWindowController.swift */; };\n\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7677908528908E40004E7085 /* WifiWindowController.xib */; };\n\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F552A27C36A00AA8DB9 /* main.swift */; };\n\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F652A27C62D00AA8DB9 /* main.swift */; };\n\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */; };\n\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */; };\n\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */; };\n\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */; };\n\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E02A12FAF900529D90 /* OIDCLite */; };\n\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E22A12FB4900529D90 /* ArgumentParser */; };\n\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */; };\n\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E2287202080013E2A1 /* RestartX.png */; };\n\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E6287202AF0013E2A1 /* ShutdownX.png */; };\n\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */; };\n\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */; };\n\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */; };\n\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */; };\n\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */; };\n\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FF2872A3030013E2A1 /* loginwindow.png */; };\n\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C084092A9A2635008039FA /* ControlsViewController.xib */; };\n\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t76C63A322A22872700810C53 /* History.md in Resources */ = {isa = PBXBuildFile; fileRef = 76C63A312A22872700810C53 /* History.md */; };\n\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */ = {isa = PBXBuildFile; fileRef = 76CB907C288112AF00C70D0C /* xcreds_login.sh */; };\n\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */; };\n\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */; };\n\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A6728836EB1007C42B2 /* AppDelegate.swift */; };\n\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6928836EB2007C42B2 /* Assets.xcassets */; };\n\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6B28836EB2007C42B2 /* MainMenu.xib */; };\n\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */; };\n\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */; };\n\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */; };\n\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A7628837028007C42B2 /* returnArrow.png */; };\n\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76DD6D16285997F300A700ED /* OIDCLite */; };\n\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */; };\n\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE069D27FD1D00009E0F3A /* AppDelegate.swift */; };\n\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06A127FD1D01009E0F3A /* MainMenu.xib */; };\n\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */; };\n\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */; };\n\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */; };\n\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */; };\n\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */; };\n\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */; };\n\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291F32C116EDB0075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill Extension\";\n\t\t};\n\t\t760292052C116EEE0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291DF2C116E450075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill\";\n\t\t};\n\t\t76319375287E19A500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 766355BC2870CA6A002E3867;\n\t\t\tremoteInfo = XCredsLoginPlugin;\n\t\t};\n\t\t76319378287E204500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7631935C287D22C700D36BF7;\n\t\t\tremoteInfo = authrights;\n\t\t};\n\t\t76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76DC0A6428836EB1007C42B2;\n\t\t\tremoteInfo = \"XCreds Login Overlay\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed Foundation Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935B287D22C700D36BF7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkMonitor.swift; path = XCredsLoginPlugIn/LoginWindow/NetworkMonitor.swift; sourceTree = SOURCE_ROOT; };\n\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSBundle+FindBundlePath.swift\"; sourceTree = \"<group>\"; };\n\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = System/Library/Frameworks/AuthenticationServices.framework; sourceTree = SDKROOT; };\n\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Autofill.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t760291E42C116E450075FBD8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291E62C116E470075FBD8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t760291E92C116E470075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill.entitlements; sourceTree = \"<group>\"; };\n\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = \"XCreds Login Password.appex\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291FA2C116EDB0075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CredentialProviderViewController.xib; sourceTree = \"<group>\"; };\n\t\t760291FC2C116EDB0075FBD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill_Extension.entitlements; sourceTree = \"<group>\"; };\n\t\t760418CE2A1332210051411B /* SignIn.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SignIn.xib; sourceTree = \"<group>\"; };\n\t\t760418CF2A1332210051411B /* SignInWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWindowController.swift; sourceTree = \"<group>\"; };\n\t\t760418D42A1332520051411B /* DS+AD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"DS+AD.swift\"; sourceTree = \"<group>\"; };\n\t\t760418D62A1332660051411B /* DSQueryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSQueryable.swift; sourceTree = \"<group>\"; };\n\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemInfoHelper.swift; sourceTree = \"<group>\"; };\n\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalCheckAndMigrate.swift; sourceTree = \"<group>\"; };\n\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoLoMechanism.swift; sourceTree = \"<group>\"; };\n\t\t760418DE2A1334D00051411B /* CheckAD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckAD.swift; sourceTree = \"<group>\"; };\n\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsCreateUser.swift; sourceTree = \"<group>\"; };\n\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsEnableFDE.swift; sourceTree = \"<group>\"; };\n\t\t7613FDF6289E114F00340CCD /* loadpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = loadpage.html; sourceTree = \"<group>\"; };\n\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = XCreds/Assets.xcassets/AppIcon.appiconset/icon_128x128.png; sourceTree = \"<group>\"; };\n\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoginProgressWindowController.xib; path = XCredsLoginPlugIn/LoginProgressWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginProgressWindowController.swift; path = XCredsLoginPlugIn/LoginProgressWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginDone.swift; sourceTree = \"<group>\"; };\n\t\t7631935D287D22C700D36BF7 /* authrights */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = authrights; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7631935F287D22C700D36BF7 /* authrights.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = authrights.swift; sourceTree = \"<group>\"; };\n\t\t7632909B2876673500CF8857 /* DataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataExtension.swift; sourceTree = \"<group>\"; };\n\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsKeychainAdd.swift; sourceTree = \"<group>\"; };\n\t\t7632E3A02873497C00E37923 /* LogShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogShim.swift; path = Mechanisms/LogShim.swift; sourceTree = \"<group>\"; };\n\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesktopLoginWindowController.swift; sourceTree = \"<group>\"; };\n\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounterMenu.swift; sourceTree = \"<group>\"; };\n\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = System/Library/Frameworks/GSS.framework; sourceTree = SDKROOT; };\n\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = xcredsmenuItemWindowBackgroundImage.png; sourceTree = \"<group>\"; };\n\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyLocalPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VerifyLocalPasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyOIDCPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerifyOIDCPassword.xib; sourceTree = \"<group>\"; };\n\t\t764D812E284C06AB00B3EE54 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = \"<group>\"; };\n\t\t764D8132284D14A500B3EE54 /* Credits.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.txt; sourceTree = \"<group>\"; };\n\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalUsersViewController.xib; sourceTree = \"<group>\"; };\n\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWebViewController.xib; sourceTree = \"<group>\"; };\n\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoMADSession.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRecord.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBB2B35055F003A23DB /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNSResolver.m; sourceTree = \"<group>\"; };\n\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolver.h; sourceTree = \"<group>\"; };\n\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ADLDAPPing.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlistUtil.swift; sourceTree = \"<group>\"; };\n\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DED22B350644003A23DB /* GSSItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GSSItem.h; sourceTree = \"<group>\"; };\n\t\t7657DED32B35064E003A23DB /* krb5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5.h; sourceTree = \"<group>\"; };\n\t\t7657DED52B351A67003A23DB /* KerbUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KerbUtil.h; sourceTree = \"<group>\"; };\n\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UNIXUtilities.swift; sourceTree = \"<group>\"; };\n\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DefaultBackground.png; sourceTree = \"<group>\"; };\n\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCredsLoginPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XCredsLoginPlugin.h; path = XCredsLoginPlugIn/XCredsLoginPlugin.h; sourceTree = SOURCE_ROOT; };\n\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XCredsLoginPlugin.m; path = XCredsLoginPlugIn/XCredsLoginPlugin.m; sourceTree = SOURCE_ROOT; };\n\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCredsLoginPlugin-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t766355D22870F29A002E3867 /* TestWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestWindowController.swift; path = XCredsLoginPlugIn/TestWindowController.swift; sourceTree = \"<group>\"; };\n\t\t766355D32870F29A002E3867 /* TestWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = TestWindowController.xib; path = XCredsLoginPlugIn/TestWindowController.xib; sourceTree = \"<group>\"; };\n\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginWebViewController.swift; path = XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift; sourceTree = SOURCE_ROOT; };\n\t\t766355E128713C47002E3867 /* LoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t766355E4287148C1002E3867 /* Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tokens.swift; path = Shared/Tokens.swift; sourceTree = SOURCE_ROOT; };\n\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseChecker.swift; sourceTree = \"<group>\"; };\n\t\t766CC42129D3A320009BC526 /* Paddle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paddle.framework; path = Carthage/Build/Mac/Paddle.framework; sourceTree = \"<group>\"; };\n\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ProductLicense.framework; path = Carthage/Build/Mac/ProductLicense.framework; sourceTree = \"<group>\"; };\n\t\t766CC43729D3AED2009BC526 /* errorpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorpage.html; sourceTree = \"<group>\"; };\n\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pleaseWaitGraphic.png; sourceTree = \"<group>\"; };\n\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsOverride.swift; sourceTree = \"<group>\"; };\n\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyManager.swift; sourceTree = \"<group>\"; };\n\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleManager.swift; sourceTree = \"<group>\"; };\n\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordUtils.swift; sourceTree = \"<group>\"; };\n\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityPrivateAPI.h; sourceTree = \"<group>\"; };\n\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCreds-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t767116B0284B021500CCD6FF /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = \"<group>\"; };\n\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainUtil.swift; sourceTree = \"<group>\"; };\n\t\t7675444428918CD100613840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = XCredsLoginPlugin/Info.plist; sourceTree = \"<group>\"; };\n\t\t7677908328908E40004E7085 /* WifiWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7677908428908E40004E7085 /* WifiManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiManager.swift; sourceTree = \"<group>\"; };\n\t\t7677908528908E40004E7085 /* WifiWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WifiWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthRightsHelper.swift; path = Shared/AuthRightsHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = auth_mech_fixup; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F552A27C36A00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F632A27C62D00AA8DB9 /* test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F652A27C62D00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = \"auth_mech_fixup-Bridging-Header.h\"; path = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\"; sourceTree = SOURCE_ROOT; };\n\t\t767B939B2A28279E0038935E /* View+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libinfo.tbd; path = usr/lib/libinfo.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsystem_info.tbd; path = usr/lib/system/libsystem_info.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; };\n\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutWindow.xib; sourceTree = \"<group>\"; };\n\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.twocanoes.xcreds.plist; path = \"Profile Manifest/com.twocanoes.xcreds.plist\"; sourceTree = \"<group>\"; };\n\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSImage+String.swift\"; sourceTree = \"<group>\"; };\n\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DefaultsHelper.swift; path = XCreds/DefaultsHelper.swift; sourceTree = \"<group>\"; };\n\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = \"Helper+JWTDecode.swift\"; path = \"XCreds/Helper+JWTDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSKeychain.m; sourceTree = \"<group>\"; };\n\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSKeychain.h; sourceTree = \"<group>\"; };\n\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+SHA1.m\"; sourceTree = \"<group>\"; };\n\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+SHA1.h\"; sourceTree = \"<group>\"; };\n\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+HexString.m\"; sourceTree = \"<group>\"; };\n\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+HexString.h\"; sourceTree = \"<group>\"; };\n\t\t76BEF7D42871F36C0013E2A1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSReturnWindow.m; sourceTree = \"<group>\"; };\n\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSReturnWindow.h; sourceTree = \"<group>\"; };\n\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7E2287202080013E2A1 /* RestartX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RestartX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"RestartX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ShutdownX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"ShutdownX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsBaseMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsPowerControlMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTaskWrapper.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextAndHintHandling.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthorizationDBManager.swift; path = XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift; sourceTree = SOURCE_ROOT; };\n\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"loginwindow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loginwindow.png; sourceTree = \"<group>\"; };\n\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControlsViewController.xib; sourceTree = \"<group>\"; };\n\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounter.swift; sourceTree = \"<group>\"; };\n\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };\n\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = System/Library/Frameworks/Kerberos.framework; sourceTree = SDKROOT; };\n\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KerbUtil.m; sourceTree = \"<group>\"; };\n\t\t76C63A312A22872700810C53 /* History.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = History.md; sourceTree = \"<group>\"; };\n\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+URLDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = xcreds_login.sh; sourceTree = \"<group>\"; };\n\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocalAccountWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SelectLocalAccountWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainLoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCTaskWrapperWithBlocks.h; sourceTree = \"<group>\"; };\n\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCTaskWrapperWithBlocks.m; sourceTree = \"<group>\"; };\n\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSUnifiedLogger.m; sourceTree = \"<group>\"; };\n\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSUnifiedLogger.h; sourceTree = \"<group>\"; };\n\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+TCSRealHomeFolder.m\"; sourceTree = \"<group>\"; };\n\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+TCSRealHomeFolder.h\"; sourceTree = \"<group>\"; };\n\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = get_pw.js; path = Javascript/get_pw/get_pw.js; sourceTree = \"<group>\"; };\n\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Overlay.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76DC0A6C28836EB2007C42B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_Login_Overlay.entitlements; sourceTree = \"<group>\"; };\n\t\t76DC0A7628837028007C42B2 /* returnArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = returnArrow.png; sourceTree = \"<group>\"; };\n\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-overlay.plist\"; sourceTree = \"<group>\"; };\n\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCSXCredsLoginOverlayWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = \"XCreds-Login-Overlay-Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t76DD6D122859978F00A700ED /* OIDCLite */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = OIDCLite; path = ../OIDCLite; sourceTree = \"<group>\"; };\n\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsMechanismProtocol.swift; sourceTree = \"<group>\"; };\n\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TCSLoginWindowUtilities.h; path = XCreds/TCSLoginWindowUtilities.h; sourceTree = \"<group>\"; };\n\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TCSLoginWindowUtilities.m; path = XCreds/TCSLoginWindowUtilities.m; sourceTree = \"<group>\"; };\n\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCreds.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76EE06A227FD1D01009E0F3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = xCreds.entitlements; sourceTree = \"<group>\"; };\n\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefKeys.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+ForceToFront.swift\"; sourceTree = \"<group>\"; };\n\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DesktopLoginWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = \"<group>\"; };\n\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerHelper.swift; sourceTree = \"<group>\"; };\n\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+Base64URLEncoded.swift\"; sourceTree = \"<group>\"; };\n\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainLoginWindowController.swift; path = XCreds/MainLoginWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainLoginWindowController.xib; path = XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusMenuWindowController.xib; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t760291DD2C116E450075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F12C116EDB0075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935A287D22C700D36BF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */,\n\t\t\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BA2870CA6A002E3867 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F502A27C36A00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F602A27C62D00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6228836EB1007C42B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069727FD1D00009E0F3A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */,\n\t\t\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */,\n\t\t\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */,\n\t\t\t\t760291E42C116E450075FBD8 /* ViewController.swift */,\n\t\t\t\t760291E62C116E470075FBD8 /* Assets.xcassets */,\n\t\t\t\t760291E82C116E470075FBD8 /* Main.storyboard */,\n\t\t\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */,\n\t\t\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */,\n\t\t\t\t760291FC2C116EDB0075FBD8 /* Info.plist */,\n\t\t\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill Extension\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CC2A1331710051411B /* NomadLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418DE2A1334D00051411B /* CheckAD.swift */,\n\t\t\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */,\n\t\t\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */,\n\t\t\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */,\n\t\t\t\t760418D62A1332660051411B /* DSQueryable.swift */,\n\t\t\t\t760418D42A1332520051411B /* DS+AD.swift */,\n\t\t\t\t760418CD2A1332210051411B /* UI */,\n\t\t\t);\n\t\t\tpath = NomadLogin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CD2A1332210051411B /* UI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418CE2A1332210051411B /* SignIn.xib */,\n\t\t\t);\n\t\t\tpath = UI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7631935E287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */,\n\t\t\t\t7631935F287D22C700D36BF7 /* authrights.swift */,\n\t\t\t);\n\t\t\tpath = authrights;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7657DEDC2B351BF9003A23DB /* headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */,\n\t\t\t\t7657DED32B35064E003A23DB /* krb5.h */,\n\t\t\t\t7657DED22B350644003A23DB /* GSSItem.h */,\n\t\t\t);\n\t\t\tpath = headers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766355C72870D1B5002E3867 /* XCredsLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */,\n\t\t\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */,\n\t\t\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */,\n\t\t\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */,\n\t\t\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */,\n\t\t\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */,\n\t\t\t\t7613FDF6289E114F00340CCD /* loadpage.html */,\n\t\t\t\t766CC43729D3AED2009BC526 /* errorpage.html */,\n\t\t\t\t7677908428908E40004E7085 /* WifiManager.swift */,\n\t\t\t\t7677908328908E40004E7085 /* WifiWindowController.swift */,\n\t\t\t\t7677908528908E40004E7085 /* WifiWindowController.xib */,\n\t\t\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */,\n\t\t\t\t7632E3A02873497C00E37923 /* LogShim.swift */,\n\t\t\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */,\n\t\t\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */,\n\t\t\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */,\n\t\t\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */,\n\t\t\t\t76BEF7F028724E520013E2A1 /* LoginWindow */,\n\t\t\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */,\n\t\t\t);\n\t\t\tname = XCredsLogin;\n\t\t\tpath = XCredsLoginPlugIn;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */,\n\t\t\t\t76786F552A27C36A00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = auth_mech_fixup;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F642A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F652A27C62D00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76BEF7D42871F36C0013E2A1 /* main.swift */,\n\t\t\t);\n\t\t\tpath = FakeTrue;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */,\n\t\t\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */,\n\t\t\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */,\n\t\t\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */,\n\t\t\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */,\n\t\t\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */,\n\t\t\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */,\n\t\t\t);\n\t\t\tpath = Mechanisms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F028724E520013E2A1 /* LoginWindow */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */,\n\t\t\t\t760418CF2A1332210051411B /* SignInWindowController.swift */,\n\t\t\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */,\n\t\t\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */,\n\t\t\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */,\n\t\t\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */,\n\t\t\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */,\n\t\t\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */,\n\t\t\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */,\n\t\t\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */,\n\t\t\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */,\n\t\t\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */,\n\t\t\t\t766355E128713C47002E3867 /* LoginWindow.swift */,\n\t\t\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */,\n\t\t\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */,\n\t\t\t\t76BEF7F128724EB60013E2A1 /* images */,\n\t\t\t);\n\t\t\tpath = LoginWindow;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F128724EB60013E2A1 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */,\n\t\t\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */,\n\t\t\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */,\n\t\t\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */,\n\t\t\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */,\n\t\t\t\t76BEF7E2287202080013E2A1 /* RestartX.png */,\n\t\t\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */,\n\t\t\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */,\n\t\t\t\t7657DED52B351A67003A23DB /* KerbUtil.h */,\n\t\t\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */,\n\t\t\t\t7657DEDC2B351BF9003A23DB /* headers */,\n\t\t\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */,\n\t\t\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */,\n\t\t\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */,\n\t\t\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */,\n\t\t\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */,\n\t\t\t\t7657DEBB2B35055F003A23DB /* Logger.swift */,\n\t\t\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */,\n\t\t\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */,\n\t\t\t);\n\t\t\tname = NoMAD;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */,\n\t\t\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */,\n\t\t\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */,\n\t\t\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */,\n\t\t\t\t76DC0A7628837028007C42B2 /* returnArrow.png */,\n\t\t\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */,\n\t\t\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */,\n\t\t\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */,\n\t\t\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds Login Overlay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D112859978F00A700ED /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76DD6D122859978F00A700ED /* OIDCLite */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D15285997F300A700ED /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */,\n\t\t\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */,\n\t\t\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */,\n\t\t\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */,\n\t\t\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */,\n\t\t\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */,\n\t\t\t\t766CC42129D3A320009BC526 /* Paddle.framework */,\n\t\t\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */,\n\t\t\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069127FD1D00009E0F3A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */,\n\t\t\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */,\n\t\t\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */,\n\t\t\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */,\n\t\t\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */,\n\t\t\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */,\n\t\t\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */,\n\t\t\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */,\n\t\t\t\t76C63A312A22872700810C53 /* History.md */,\n\t\t\t\t760418CC2A1331710051411B /* NomadLogin */,\n\t\t\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */,\n\t\t\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */,\n\t\t\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */,\n\t\t\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */,\n\t\t\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */,\n\t\t\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */,\n\t\t\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */,\n\t\t\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */,\n\t\t\t\t7675444428918CD100613840 /* Info.plist */,\n\t\t\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */,\n\t\t\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */,\n\t\t\t\t76DD6D15285997F300A700ED /* Frameworks */,\n\t\t\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */,\n\t\t\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */,\n\t\t\t\t7632909B2876673500CF8857 /* DataExtension.swift */,\n\t\t\t\t766355D22870F29A002E3867 /* TestWindowController.swift */,\n\t\t\t\t766355D32870F29A002E3867 /* TestWindowController.xib */,\n\t\t\t\t76DD6D112859978F00A700ED /* Packages */,\n\t\t\t\t766355C72870D1B5002E3867 /* XCredsLogin */,\n\t\t\t\t76EE069C27FD1D00009E0F3A /* XCreds */,\n\t\t\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */,\n\t\t\t\t7631935E287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F642A27C62D00AA8DB9 /* test */,\n\t\t\t\t76EE069B27FD1D00009E0F3A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069B27FD1D00009E0F3A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */,\n\t\t\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */,\n\t\t\t\t7631935D287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */,\n\t\t\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F632A27C62D00AA8DB9 /* test */,\n\t\t\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */,\n\t\t\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069C27FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */,\n\t\t\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */,\n\t\t\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */,\n\t\t\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */,\n\t\t\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */,\n\t\t\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */,\n\t\t\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */,\n\t\t\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */,\n\t\t\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */,\n\t\t\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */,\n\t\t\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */,\n\t\t\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */,\n\t\t\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */,\n\t\t\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */,\n\t\t\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */,\n\t\t\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */,\n\t\t\t\t764D8132284D14A500B3EE54 /* Credits.txt */,\n\t\t\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */,\n\t\t\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */,\n\t\t\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */,\n\t\t\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */,\n\t\t\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */,\n\t\t\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */,\n\t\t\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */,\n\t\t\t\t767B939B2A28279E0038935E /* View+Shake.swift */,\n\t\t\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */,\n\t\t\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */,\n\t\t\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */,\n\t\t\t\t766355E4287148C1002E3867 /* Tokens.swift */,\n\t\t\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */,\n\t\t\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */,\n\t\t\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */,\n\t\t\t\t764D812E284C06AB00B3EE54 /* defaults.plist */,\n\t\t\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */,\n\t\t\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */,\n\t\t\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */,\n\t\t\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */,\n\t\t\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */,\n\t\t\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */,\n\t\t\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */,\n\t\t\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */,\n\t\t\t\t767116B0284B021500CCD6FF /* MainController.swift */,\n\t\t\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */,\n\t\t\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */,\n\t\t\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */,\n\t\t\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */,\n\t\t\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = XCreds;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXLegacyTarget section */\n\t\t766F4C4C2883B88F0021F548 /* Send To Test */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"app_to_test.sh mba.local\";\n\t\t\tbuildConfigurationList = 766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = /bin/bash;\n\t\t\tbuildWorkingDirectory = /Users/tperfitt/Documents/Projects/xcreds;\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Send To Test\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Send To Test\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXNativeTarget section */\n\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291DC2C116E450075FBD8 /* Sources */,\n\t\t\t\t760291DD2C116E450075FBD8 /* Frameworks */,\n\t\t\t\t760291DE2C116E450075FBD8 /* Resources */,\n\t\t\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"XCreds Login Autofill\";\n\t\t\tproductName = \"XCreds AutoFill\";\n\t\t\tproductReference = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291F02C116EDB0075FBD8 /* Sources */,\n\t\t\t\t760291F12C116EDB0075FBD8 /* Frameworks */,\n\t\t\t\t760291F22C116EDB0075FBD8 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Password\";\n\t\t\tproductName = \"XCreds AutoFill Extension\";\n\t\t\tproductReference = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension\";\n\t\t};\n\t\t7631935C287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76319359287D22C700D36BF7 /* Sources */,\n\t\t\t\t7631935A287D22C700D36BF7 /* Frameworks */,\n\t\t\t\t7631935B287D22C700D36BF7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = authrights;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76AB89E02A12FAF900529D90 /* OIDCLite */,\n\t\t\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */,\n\t\t\t);\n\t\t\tproductName = authrights;\n\t\t\tproductReference = 7631935D287D22C700D36BF7 /* authrights */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t766355B92870CA6A002E3867 /* Sources */,\n\t\t\t\t766355BA2870CA6A002E3867 /* Frameworks */,\n\t\t\t\t766355BB2870CA6A002E3867 /* Resources */,\n\t\t\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = XCredsLoginPlugin;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t766355CD2870E9D3002E3867 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = XCredsLoginPlugin;\n\t\t\tproductReference = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F4F2A27C36A00AA8DB9 /* Sources */,\n\t\t\t\t76786F502A27C36A00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = auth_mech_fixup;\n\t\t\tproductName = auth_mech_fixup;\n\t\t\tproductReference = 76786F532A27C36A00AA8DB9 /* auth_mech_fixup */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76786F622A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F5F2A27C62D00AA8DB9 /* Sources */,\n\t\t\t\t76786F602A27C62D00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = test;\n\t\t\tproductName = test;\n\t\t\tproductReference = 76786F632A27C62D00AA8DB9 /* test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76DC0A6128836EB1007C42B2 /* Sources */,\n\t\t\t\t76DC0A6228836EB1007C42B2 /* Frameworks */,\n\t\t\t\t76DC0A6328836EB1007C42B2 /* Resources */,\n\t\t\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Overlay\";\n\t\t\tproductName = \"XCreds Login Overlay\";\n\t\t\tproductReference = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t76EE069927FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76EE069627FD1D00009E0F3A /* Sources */,\n\t\t\t\t76EE069727FD1D00009E0F3A /* Frameworks */,\n\t\t\t\t76EE069827FD1D00009E0F3A /* Resources */,\n\t\t\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */,\n\t\t\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */,\n\t\t\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76319379287E204500D36BF7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = XCreds;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76DD6D16285997F300A700ED /* OIDCLite */,\n\t\t\t\t76319365287D24E100D36BF7 /* ArgumentParser */,\n\t\t\t\t76319368287D24F600D36BF7 /* ArgumentParser */,\n\t\t\t\t762177E52B7144460051B756 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = xCreds;\n\t\t\tproductReference = 76EE069A27FD1D00009E0F3A /* XCreds.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t76EE069227FD1D00009E0F3A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1540;\n\t\t\t\tLastUpgradeCheck = 1330;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t760291DF2C116E450075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t760291F32C116EDB0075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t7631935C287D22C700D36BF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t766355BC2870CA6A002E3867 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1340;\n\t\t\t\t\t};\n\t\t\t\t\t766F4C4C2883B88F0021F548 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76786F522A27C36A00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76786F622A27C62D00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76DC0A6428836EB1007C42B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76EE069927FD1D00009E0F3A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 76EE069127FD1D00009E0F3A;\n\t\t\tpackageReferences = (\n\t\t\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */,\n\t\t\t\t762177E42B7144460051B756 /* XCLocalSwiftPackageReference \"../OIDCLite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 76EE069B27FD1D00009E0F3A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t76EE069927FD1D00009E0F3A /* XCreds */,\n\t\t\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */,\n\t\t\t\t7631935C287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t766F4C4C2883B88F0021F548 /* Send To Test */,\n\t\t\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F622A27C62D00AA8DB9 /* test */,\n\t\t\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */,\n\t\t\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t760291DE2C116E450075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291E72C116E470075FBD8 /* Assets.xcassets in Resources */,\n\t\t\t\t760291EA2C116E470075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F22C116EDB0075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BB2870CA6A002E3867 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */,\n\t\t\t\t766355D928711C51002E3867 /* defaults.plist in Resources */,\n\t\t\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */,\n\t\t\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */,\n\t\t\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */,\n\t\t\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */,\n\t\t\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */,\n\t\t\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */,\n\t\t\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */,\n\t\t\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */,\n\t\t\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */,\n\t\t\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */,\n\t\t\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */,\n\t\t\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */,\n\t\t\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */,\n\t\t\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */,\n\t\t\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */,\n\t\t\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6328836EB1007C42B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */,\n\t\t\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */,\n\t\t\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */,\n\t\t\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */,\n\t\t\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */,\n\t\t\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069827FD1D00009E0F3A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */,\n\t\t\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */,\n\t\t\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */,\n\t\t\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */,\n\t\t\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */,\n\t\t\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */,\n\t\t\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */,\n\t\t\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */,\n\t\t\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */,\n\t\t\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */,\n\t\t\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */,\n\t\t\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */,\n\t\t\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */,\n\t\t\t\t76C63A322A22872700810C53 /* History.md in Resources */,\n\t\t\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */,\n\t\t\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */,\n\t\t\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */,\n\t\t\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */,\n\t\t\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t760291DC2C116E450075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */,\n\t\t\t\t760292162C1176A90075FBD8 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t760292192C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7602920F2C1175DA0075FBD8 /* LoggerHelper.swift in Sources */,\n\t\t\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */,\n\t\t\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F02C116EDB0075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */,\n\t\t\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */,\n\t\t\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t7602921A2C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t760292092C1175360075FBD8 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t760292102C1175DA0075FBD8 /* LoggerHelper.swift in Sources */,\n\t\t\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76319359287D22C700D36BF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */,\n\t\t\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355B92870CA6A002E3867 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */,\n\t\t\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */,\n\t\t\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */,\n\t\t\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */,\n\t\t\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */,\n\t\t\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */,\n\t\t\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */,\n\t\t\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */,\n\t\t\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */,\n\t\t\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */,\n\t\t\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */,\n\t\t\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */,\n\t\t\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */,\n\t\t\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */,\n\t\t\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */,\n\t\t\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */,\n\t\t\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */,\n\t\t\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */,\n\t\t\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */,\n\t\t\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */,\n\t\t\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */,\n\t\t\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */,\n\t\t\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */,\n\t\t\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */,\n\t\t\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */,\n\t\t\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F4F2A27C36A00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F5F2A27C62D00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6128836EB1007C42B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */,\n\t\t\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069627FD1D00009E0F3A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */,\n\t\t\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */,\n\t\t\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */,\n\t\t\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */,\n\t\t\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */,\n\t\t\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */,\n\t\t\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */,\n\t\t\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */,\n\t\t\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */,\n\t\t\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */,\n\t\t\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */,\n\t\t\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */,\n\t\t\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */,\n\t\t\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */,\n\t\t\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */,\n\t\t\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */,\n\t\t\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */,\n\t\t\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */,\n\t\t\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */,\n\t\t\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */,\n\t\t\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */,\n\t\t\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */,\n\t\t\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */,\n\t\t\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */,\n\t\t\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291F32C116EDB0075FBD8 /* XCreds Login Password */;\n\t\t\ttargetProxy = 760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291DF2C116E450075FBD8 /* XCreds Login Autofill */;\n\t\t\ttargetProxy = 760292052C116EEE0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 766355BC2870CA6A002E3867 /* XCredsLoginPlugin */;\n\t\t\ttargetProxy = 76319375287E19A500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319379287E204500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7631935C287D22C700D36BF7 /* authrights */;\n\t\t\ttargetProxy = 76319378287E204500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */;\n\t\t\ttargetProxy = 76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t760291E82C116E470075FBD8 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E92C116E470075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291FA2C116EDB0075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = CredentialProviderViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76DC0A6C28836EB2007C42B2 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE06A227FD1D01009E0F3A /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t760291ED2C116E470075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760291EE2C116E470075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t760292022C116EDB0075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760292032C116EDB0075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76319361287D22C700D36BF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76319362287D22C700D36BF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766355BE2870CA6A002E3867 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766355BF2870CA6A002E3867 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766F4C4E2883B88F0021F548 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEBUGGING_SYMBOLS = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766F4C4F2883B88F0021F548 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F582A27C36A00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F592A27C36A00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F682A27C62D00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F692A27C62D00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76DC0A7028836EB2007C42B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76DC0A7128836EB2007C42B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A527FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A627FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A827FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A927FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n<<<<<<<<< Temporary merge branch 1\n\t\t\t\tCURRENT_PROJECT_VERSION = 10;\n=========\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n>>>>>>>>> Temporary merge branch 2\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760291ED2C116E470075FBD8 /* Debug */,\n\t\t\t\t760291EE2C116E470075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760292022C116EDB0075FBD8 /* Debug */,\n\t\t\t\t760292032C116EDB0075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76319361287D22C700D36BF7 /* Debug */,\n\t\t\t\t76319362287D22C700D36BF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766355BE2870CA6A002E3867 /* Debug */,\n\t\t\t\t766355BF2870CA6A002E3867 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766F4C4E2883B88F0021F548 /* Debug */,\n\t\t\t\t766F4C4F2883B88F0021F548 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F582A27C36A00AA8DB9 /* Debug */,\n\t\t\t\t76786F592A27C36A00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F682A27C62D00AA8DB9 /* Debug */,\n\t\t\t\t76786F692A27C62D00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76DC0A7028836EB2007C42B2 /* Debug */,\n\t\t\t\t76DC0A7128836EB2007C42B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A527FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A627FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A827FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A927FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCLocalSwiftPackageReference section */\n\t\t762177E42B7144460051B756 /* XCLocalSwiftPackageReference \"../OIDCLite\" */ = {\n\t\t\tisa = XCLocalSwiftPackageReference;\n\t\t\trelativePath = ../OIDCLite;\n\t\t};\n/* End XCLocalSwiftPackageReference section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/apple/swift-argument-parser.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.0.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t762177E52B7144460051B756 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76319365287D24E100D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76319368287D24F600D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t766355CD2870E9D3002E3867 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E02A12FAF900529D90 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76DD6D16285997F300A700ED /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 76EE069227FD1D00009E0F3A /* Project object */;\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/project_LOCAL_63385.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 60;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEBF288B75140063A644 /* XCredsCreateUser.swift */; };\n\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */; };\n\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */; };\n\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486B28A3575000C6A02B /* XCredsLoginDone.swift */; };\n\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 762177E52B7144460051B756 /* OIDCLite */; };\n\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */; };\n\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */; };\n\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7631935F287D22C700D36BF7 /* authrights.swift */; };\n\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319365287D24E100D36BF7 /* ArgumentParser */; };\n\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319368287D24F600D36BF7 /* ArgumentParser */; };\n\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */; };\n\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */ = {isa = PBXBuildFile; fileRef = 7631935D287D22C700D36BF7 /* authrights */; };\n\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */; };\n\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */; };\n\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 763DDF192B4F1DD4000D48CC /* GSS.framework */; };\n\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */; };\n\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */; };\n\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */ = {isa = PBXBuildFile; fileRef = 764D8132284D14A500B3EE54 /* Credits.txt */; };\n\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDF62A1474330075980B /* LoginWebViewController.xib */; };\n\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */; };\n\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */; };\n\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 766355CD2870E9D3002E3867 /* OIDCLite */; };\n\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355D22870F29A002E3867 /* TestWindowController.swift */; };\n\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 766355D32870F29A002E3867 /* TestWindowController.xib */; };\n\t\t766355D928711C51002E3867 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */ = {isa = PBXBuildFile; fileRef = 766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */; };\n\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A6284AABC500CCD6FF /* NotifyManager.swift */; };\n\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */; };\n\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B0284B021500CCD6FF /* MainController.swift */; };\n\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908328908E40004E7085 /* WifiWindowController.swift */; };\n\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7677908528908E40004E7085 /* WifiWindowController.xib */; };\n\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F552A27C36A00AA8DB9 /* main.swift */; };\n\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F652A27C62D00AA8DB9 /* main.swift */; };\n\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */; };\n\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */; };\n\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */; };\n\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */; };\n\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E02A12FAF900529D90 /* OIDCLite */; };\n\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E22A12FB4900529D90 /* ArgumentParser */; };\n\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */; };\n\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E2287202080013E2A1 /* RestartX.png */; };\n\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E6287202AF0013E2A1 /* ShutdownX.png */; };\n\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */; };\n\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */; };\n\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */; };\n\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */; };\n\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */; };\n\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FF2872A3030013E2A1 /* loginwindow.png */; };\n\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C084092A9A2635008039FA /* ControlsViewController.xib */; };\n\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t76C63A322A22872700810C53 /* History.md in Resources */ = {isa = PBXBuildFile; fileRef = 76C63A312A22872700810C53 /* History.md */; };\n\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */ = {isa = PBXBuildFile; fileRef = 76CB907C288112AF00C70D0C /* xcreds_login.sh */; };\n\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */; };\n\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */; };\n\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A6728836EB1007C42B2 /* AppDelegate.swift */; };\n\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6928836EB2007C42B2 /* Assets.xcassets */; };\n\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6B28836EB2007C42B2 /* MainMenu.xib */; };\n\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */; };\n\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */; };\n\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */; };\n\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A7628837028007C42B2 /* returnArrow.png */; };\n\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76DD6D16285997F300A700ED /* OIDCLite */; };\n\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */; };\n\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE069D27FD1D00009E0F3A /* AppDelegate.swift */; };\n\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06A127FD1D01009E0F3A /* MainMenu.xib */; };\n\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */; };\n\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */; };\n\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */; };\n\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */; };\n\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */; };\n\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */; };\n\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t76319375287E19A500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 766355BC2870CA6A002E3867;\n\t\t\tremoteInfo = XCredsLoginPlugin;\n\t\t};\n\t\t76319378287E204500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7631935C287D22C700D36BF7;\n\t\t\tremoteInfo = authrights;\n\t\t};\n\t\t76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76DC0A6428836EB1007C42B2;\n\t\t\tremoteInfo = \"XCreds Login Overlay\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t7631935B287D22C700D36BF7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkMonitor.swift; path = XCredsLoginPlugIn/LoginWindow/NetworkMonitor.swift; sourceTree = SOURCE_ROOT; };\n\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSBundle+FindBundlePath.swift\"; sourceTree = \"<group>\"; };\n\t\t760418CE2A1332210051411B /* SignIn.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SignIn.xib; sourceTree = \"<group>\"; };\n\t\t760418CF2A1332210051411B /* SignInWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWindowController.swift; sourceTree = \"<group>\"; };\n\t\t760418D42A1332520051411B /* DS+AD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"DS+AD.swift\"; sourceTree = \"<group>\"; };\n\t\t760418D62A1332660051411B /* DSQueryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSQueryable.swift; sourceTree = \"<group>\"; };\n\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemInfoHelper.swift; sourceTree = \"<group>\"; };\n\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalCheckAndMigrate.swift; sourceTree = \"<group>\"; };\n\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoLoMechanism.swift; sourceTree = \"<group>\"; };\n\t\t760418DE2A1334D00051411B /* CheckAD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckAD.swift; sourceTree = \"<group>\"; };\n\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsCreateUser.swift; sourceTree = \"<group>\"; };\n\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsEnableFDE.swift; sourceTree = \"<group>\"; };\n\t\t7613FDF6289E114F00340CCD /* loadpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = loadpage.html; sourceTree = \"<group>\"; };\n\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = XCreds/Assets.xcassets/AppIcon.appiconset/icon_128x128.png; sourceTree = \"<group>\"; };\n\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoginProgressWindowController.xib; path = XCredsLoginPlugIn/LoginProgressWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginProgressWindowController.swift; path = XCredsLoginPlugIn/LoginProgressWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginDone.swift; sourceTree = \"<group>\"; };\n\t\t7631935D287D22C700D36BF7 /* authrights */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = authrights; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7631935F287D22C700D36BF7 /* authrights.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = authrights.swift; sourceTree = \"<group>\"; };\n\t\t7632909B2876673500CF8857 /* DataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataExtension.swift; sourceTree = \"<group>\"; };\n\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsKeychainAdd.swift; sourceTree = \"<group>\"; };\n\t\t7632E3A02873497C00E37923 /* LogShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogShim.swift; path = Mechanisms/LogShim.swift; sourceTree = \"<group>\"; };\n\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesktopLoginWindowController.swift; sourceTree = \"<group>\"; };\n\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounterMenu.swift; sourceTree = \"<group>\"; };\n\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = System/Library/Frameworks/GSS.framework; sourceTree = SDKROOT; };\n\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = xcredsmenuItemWindowBackgroundImage.png; sourceTree = \"<group>\"; };\n\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyLocalPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VerifyLocalPasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyOIDCPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerifyOIDCPassword.xib; sourceTree = \"<group>\"; };\n\t\t764D812E284C06AB00B3EE54 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = \"<group>\"; };\n\t\t764D8132284D14A500B3EE54 /* Credits.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.txt; sourceTree = \"<group>\"; };\n\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalUsersViewController.xib; sourceTree = \"<group>\"; };\n\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWebViewController.xib; sourceTree = \"<group>\"; };\n\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoMADSession.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRecord.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBB2B35055F003A23DB /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNSResolver.m; sourceTree = \"<group>\"; };\n\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolver.h; sourceTree = \"<group>\"; };\n\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ADLDAPPing.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlistUtil.swift; sourceTree = \"<group>\"; };\n\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DED22B350644003A23DB /* GSSItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GSSItem.h; sourceTree = \"<group>\"; };\n\t\t7657DED32B35064E003A23DB /* krb5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5.h; sourceTree = \"<group>\"; };\n\t\t7657DED52B351A67003A23DB /* KerbUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KerbUtil.h; sourceTree = \"<group>\"; };\n\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UNIXUtilities.swift; sourceTree = \"<group>\"; };\n\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DefaultBackground.png; sourceTree = \"<group>\"; };\n\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCredsLoginPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XCredsLoginPlugin.h; path = XCredsLoginPlugIn/XCredsLoginPlugin.h; sourceTree = SOURCE_ROOT; };\n\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XCredsLoginPlugin.m; path = XCredsLoginPlugIn/XCredsLoginPlugin.m; sourceTree = SOURCE_ROOT; };\n\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCredsLoginPlugin-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t766355D22870F29A002E3867 /* TestWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestWindowController.swift; path = XCredsLoginPlugIn/TestWindowController.swift; sourceTree = \"<group>\"; };\n\t\t766355D32870F29A002E3867 /* TestWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = TestWindowController.xib; path = XCredsLoginPlugIn/TestWindowController.xib; sourceTree = \"<group>\"; };\n\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginWebViewController.swift; path = XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift; sourceTree = SOURCE_ROOT; };\n\t\t766355E128713C47002E3867 /* LoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t766355E4287148C1002E3867 /* Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tokens.swift; path = Shared/Tokens.swift; sourceTree = SOURCE_ROOT; };\n\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseChecker.swift; sourceTree = \"<group>\"; };\n\t\t766CC42129D3A320009BC526 /* Paddle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paddle.framework; path = Carthage/Build/Mac/Paddle.framework; sourceTree = \"<group>\"; };\n\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ProductLicense.framework; path = Carthage/Build/Mac/ProductLicense.framework; sourceTree = \"<group>\"; };\n\t\t766CC43729D3AED2009BC526 /* errorpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorpage.html; sourceTree = \"<group>\"; };\n\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pleaseWaitGraphic.png; sourceTree = \"<group>\"; };\n\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsOverride.swift; sourceTree = \"<group>\"; };\n\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyManager.swift; sourceTree = \"<group>\"; };\n\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleManager.swift; sourceTree = \"<group>\"; };\n\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordUtils.swift; sourceTree = \"<group>\"; };\n\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityPrivateAPI.h; sourceTree = \"<group>\"; };\n\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCreds-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t767116B0284B021500CCD6FF /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = \"<group>\"; };\n\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainUtil.swift; sourceTree = \"<group>\"; };\n\t\t7675444428918CD100613840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = XCredsLoginPlugin/Info.plist; sourceTree = \"<group>\"; };\n\t\t7677908328908E40004E7085 /* WifiWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7677908428908E40004E7085 /* WifiManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiManager.swift; sourceTree = \"<group>\"; };\n\t\t7677908528908E40004E7085 /* WifiWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WifiWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthRightsHelper.swift; path = Shared/AuthRightsHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = auth_mech_fixup; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F552A27C36A00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F632A27C62D00AA8DB9 /* test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F652A27C62D00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = \"auth_mech_fixup-Bridging-Header.h\"; path = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\"; sourceTree = SOURCE_ROOT; };\n\t\t767B939B2A28279E0038935E /* View+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libinfo.tbd; path = usr/lib/libinfo.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsystem_info.tbd; path = usr/lib/system/libsystem_info.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; };\n\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutWindow.xib; sourceTree = \"<group>\"; };\n\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.twocanoes.xcreds.plist; path = \"Profile Manifest/com.twocanoes.xcreds.plist\"; sourceTree = \"<group>\"; };\n\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSImage+String.swift\"; sourceTree = \"<group>\"; };\n\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DefaultsHelper.swift; path = XCreds/DefaultsHelper.swift; sourceTree = \"<group>\"; };\n\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = \"Helper+JWTDecode.swift\"; path = \"XCreds/Helper+JWTDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSKeychain.m; sourceTree = \"<group>\"; };\n\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSKeychain.h; sourceTree = \"<group>\"; };\n\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+SHA1.m\"; sourceTree = \"<group>\"; };\n\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+SHA1.h\"; sourceTree = \"<group>\"; };\n\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+HexString.m\"; sourceTree = \"<group>\"; };\n\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+HexString.h\"; sourceTree = \"<group>\"; };\n\t\t76BEF7D42871F36C0013E2A1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSReturnWindow.m; sourceTree = \"<group>\"; };\n\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSReturnWindow.h; sourceTree = \"<group>\"; };\n\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7E2287202080013E2A1 /* RestartX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RestartX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"RestartX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ShutdownX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"ShutdownX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsBaseMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsPowerControlMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTaskWrapper.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextAndHintHandling.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthorizationDBManager.swift; path = XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift; sourceTree = SOURCE_ROOT; };\n\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"loginwindow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loginwindow.png; sourceTree = \"<group>\"; };\n\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControlsViewController.xib; sourceTree = \"<group>\"; };\n\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounter.swift; sourceTree = \"<group>\"; };\n\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };\n\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = System/Library/Frameworks/Kerberos.framework; sourceTree = SDKROOT; };\n\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KerbUtil.m; sourceTree = \"<group>\"; };\n\t\t76C63A312A22872700810C53 /* History.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = History.md; sourceTree = \"<group>\"; };\n\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+URLDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = xcreds_login.sh; sourceTree = \"<group>\"; };\n\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocalAccountWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SelectLocalAccountWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainLoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCTaskWrapperWithBlocks.h; sourceTree = \"<group>\"; };\n\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCTaskWrapperWithBlocks.m; sourceTree = \"<group>\"; };\n\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSUnifiedLogger.m; sourceTree = \"<group>\"; };\n\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSUnifiedLogger.h; sourceTree = \"<group>\"; };\n\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+TCSRealHomeFolder.m\"; sourceTree = \"<group>\"; };\n\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+TCSRealHomeFolder.h\"; sourceTree = \"<group>\"; };\n\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = get_pw.js; path = Javascript/get_pw/get_pw.js; sourceTree = \"<group>\"; };\n\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Overlay.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76DC0A6C28836EB2007C42B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_Login_Overlay.entitlements; sourceTree = \"<group>\"; };\n\t\t76DC0A7628837028007C42B2 /* returnArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = returnArrow.png; sourceTree = \"<group>\"; };\n\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-overlay.plist\"; sourceTree = \"<group>\"; };\n\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCSXCredsLoginOverlayWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = \"XCreds-Login-Overlay-Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t76DD6D122859978F00A700ED /* OIDCLite */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = OIDCLite; path = ../OIDCLite; sourceTree = \"<group>\"; };\n\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsMechanismProtocol.swift; sourceTree = \"<group>\"; };\n\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TCSLoginWindowUtilities.h; path = XCreds/TCSLoginWindowUtilities.h; sourceTree = \"<group>\"; };\n\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TCSLoginWindowUtilities.m; path = XCreds/TCSLoginWindowUtilities.m; sourceTree = \"<group>\"; };\n\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCreds.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76EE06A227FD1D01009E0F3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = xCreds.entitlements; sourceTree = \"<group>\"; };\n\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefKeys.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+ForceToFront.swift\"; sourceTree = \"<group>\"; };\n\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DesktopLoginWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = \"<group>\"; };\n\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerHelper.swift; sourceTree = \"<group>\"; };\n\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+Base64URLEncoded.swift\"; sourceTree = \"<group>\"; };\n\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainLoginWindowController.swift; path = XCreds/MainLoginWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainLoginWindowController.xib; path = XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusMenuWindowController.xib; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7631935A287D22C700D36BF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */,\n\t\t\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BA2870CA6A002E3867 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F502A27C36A00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F602A27C62D00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6228836EB1007C42B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069727FD1D00009E0F3A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */,\n\t\t\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */,\n\t\t\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t760418CC2A1331710051411B /* NomadLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418DE2A1334D00051411B /* CheckAD.swift */,\n\t\t\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */,\n\t\t\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */,\n\t\t\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */,\n\t\t\t\t760418D62A1332660051411B /* DSQueryable.swift */,\n\t\t\t\t760418D42A1332520051411B /* DS+AD.swift */,\n\t\t\t\t760418CD2A1332210051411B /* UI */,\n\t\t\t);\n\t\t\tpath = NomadLogin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CD2A1332210051411B /* UI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418CE2A1332210051411B /* SignIn.xib */,\n\t\t\t);\n\t\t\tpath = UI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7631935E287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */,\n\t\t\t\t7631935F287D22C700D36BF7 /* authrights.swift */,\n\t\t\t);\n\t\t\tpath = authrights;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7657DEDC2B351BF9003A23DB /* headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */,\n\t\t\t\t7657DED32B35064E003A23DB /* krb5.h */,\n\t\t\t\t7657DED22B350644003A23DB /* GSSItem.h */,\n\t\t\t);\n\t\t\tpath = headers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766355C72870D1B5002E3867 /* XCredsLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */,\n\t\t\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */,\n\t\t\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */,\n\t\t\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */,\n\t\t\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */,\n\t\t\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */,\n\t\t\t\t7613FDF6289E114F00340CCD /* loadpage.html */,\n\t\t\t\t766CC43729D3AED2009BC526 /* errorpage.html */,\n\t\t\t\t7677908428908E40004E7085 /* WifiManager.swift */,\n\t\t\t\t7677908328908E40004E7085 /* WifiWindowController.swift */,\n\t\t\t\t7677908528908E40004E7085 /* WifiWindowController.xib */,\n\t\t\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */,\n\t\t\t\t7632E3A02873497C00E37923 /* LogShim.swift */,\n\t\t\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */,\n\t\t\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */,\n\t\t\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */,\n\t\t\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */,\n\t\t\t\t76BEF7F028724E520013E2A1 /* LoginWindow */,\n\t\t\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */,\n\t\t\t);\n\t\t\tname = XCredsLogin;\n\t\t\tpath = XCredsLoginPlugIn;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */,\n\t\t\t\t76786F552A27C36A00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = auth_mech_fixup;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F642A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F652A27C62D00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76BEF7D42871F36C0013E2A1 /* main.swift */,\n\t\t\t);\n\t\t\tpath = FakeTrue;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */,\n\t\t\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */,\n\t\t\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */,\n\t\t\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */,\n\t\t\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */,\n\t\t\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */,\n\t\t\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */,\n\t\t\t);\n\t\t\tpath = Mechanisms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F028724E520013E2A1 /* LoginWindow */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */,\n\t\t\t\t760418CF2A1332210051411B /* SignInWindowController.swift */,\n\t\t\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */,\n\t\t\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */,\n\t\t\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */,\n\t\t\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */,\n\t\t\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */,\n\t\t\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */,\n\t\t\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */,\n\t\t\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */,\n\t\t\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */,\n\t\t\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */,\n\t\t\t\t766355E128713C47002E3867 /* LoginWindow.swift */,\n\t\t\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */,\n\t\t\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */,\n\t\t\t\t76BEF7F128724EB60013E2A1 /* images */,\n\t\t\t);\n\t\t\tpath = LoginWindow;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F128724EB60013E2A1 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */,\n\t\t\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */,\n\t\t\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */,\n\t\t\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */,\n\t\t\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */,\n\t\t\t\t76BEF7E2287202080013E2A1 /* RestartX.png */,\n\t\t\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */,\n\t\t\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */,\n\t\t\t\t7657DED52B351A67003A23DB /* KerbUtil.h */,\n\t\t\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */,\n\t\t\t\t7657DEDC2B351BF9003A23DB /* headers */,\n\t\t\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */,\n\t\t\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */,\n\t\t\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */,\n\t\t\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */,\n\t\t\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */,\n\t\t\t\t7657DEBB2B35055F003A23DB /* Logger.swift */,\n\t\t\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */,\n\t\t\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */,\n\t\t\t);\n\t\t\tname = NoMAD;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */,\n\t\t\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */,\n\t\t\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */,\n\t\t\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */,\n\t\t\t\t76DC0A7628837028007C42B2 /* returnArrow.png */,\n\t\t\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */,\n\t\t\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */,\n\t\t\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */,\n\t\t\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds Login Overlay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D112859978F00A700ED /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76DD6D122859978F00A700ED /* OIDCLite */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D15285997F300A700ED /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */,\n\t\t\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */,\n\t\t\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */,\n\t\t\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */,\n\t\t\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */,\n\t\t\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */,\n\t\t\t\t766CC42129D3A320009BC526 /* Paddle.framework */,\n\t\t\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069127FD1D00009E0F3A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */,\n\t\t\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */,\n\t\t\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */,\n\t\t\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */,\n\t\t\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */,\n\t\t\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */,\n\t\t\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */,\n\t\t\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */,\n\t\t\t\t76C63A312A22872700810C53 /* History.md */,\n\t\t\t\t760418CC2A1331710051411B /* NomadLogin */,\n\t\t\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */,\n\t\t\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */,\n\t\t\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */,\n\t\t\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */,\n\t\t\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */,\n\t\t\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */,\n\t\t\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */,\n\t\t\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */,\n\t\t\t\t7675444428918CD100613840 /* Info.plist */,\n\t\t\t\t76DD6D15285997F300A700ED /* Frameworks */,\n\t\t\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */,\n\t\t\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */,\n\t\t\t\t7632909B2876673500CF8857 /* DataExtension.swift */,\n\t\t\t\t766355D22870F29A002E3867 /* TestWindowController.swift */,\n\t\t\t\t766355D32870F29A002E3867 /* TestWindowController.xib */,\n\t\t\t\t76DD6D112859978F00A700ED /* Packages */,\n\t\t\t\t766355C72870D1B5002E3867 /* XCredsLogin */,\n\t\t\t\t76EE069C27FD1D00009E0F3A /* XCreds */,\n\t\t\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */,\n\t\t\t\t7631935E287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F642A27C62D00AA8DB9 /* test */,\n\t\t\t\t76EE069B27FD1D00009E0F3A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069B27FD1D00009E0F3A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */,\n\t\t\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */,\n\t\t\t\t7631935D287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */,\n\t\t\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F632A27C62D00AA8DB9 /* test */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069C27FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */,\n\t\t\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */,\n\t\t\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */,\n\t\t\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */,\n\t\t\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */,\n\t\t\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */,\n\t\t\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */,\n\t\t\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */,\n\t\t\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */,\n\t\t\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */,\n\t\t\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */,\n\t\t\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */,\n\t\t\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */,\n\t\t\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */,\n\t\t\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */,\n\t\t\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */,\n\t\t\t\t764D8132284D14A500B3EE54 /* Credits.txt */,\n\t\t\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */,\n\t\t\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */,\n\t\t\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */,\n\t\t\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */,\n\t\t\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */,\n\t\t\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */,\n\t\t\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */,\n\t\t\t\t767B939B2A28279E0038935E /* View+Shake.swift */,\n\t\t\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */,\n\t\t\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */,\n\t\t\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */,\n\t\t\t\t766355E4287148C1002E3867 /* Tokens.swift */,\n\t\t\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */,\n\t\t\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */,\n\t\t\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */,\n\t\t\t\t764D812E284C06AB00B3EE54 /* defaults.plist */,\n\t\t\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */,\n\t\t\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */,\n\t\t\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */,\n\t\t\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */,\n\t\t\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */,\n\t\t\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */,\n\t\t\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */,\n\t\t\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */,\n\t\t\t\t767116B0284B021500CCD6FF /* MainController.swift */,\n\t\t\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */,\n\t\t\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */,\n\t\t\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */,\n\t\t\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */,\n\t\t\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = XCreds;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXLegacyTarget section */\n\t\t766F4C4C2883B88F0021F548 /* Send To Test */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"app_to_test.sh mba.local\";\n\t\t\tbuildConfigurationList = 766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = /bin/bash;\n\t\t\tbuildWorkingDirectory = /Users/tperfitt/Documents/Projects/xcreds;\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Send To Test\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Send To Test\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXNativeTarget section */\n\t\t7631935C287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76319359287D22C700D36BF7 /* Sources */,\n\t\t\t\t7631935A287D22C700D36BF7 /* Frameworks */,\n\t\t\t\t7631935B287D22C700D36BF7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = authrights;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76AB89E02A12FAF900529D90 /* OIDCLite */,\n\t\t\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */,\n\t\t\t);\n\t\t\tproductName = authrights;\n\t\t\tproductReference = 7631935D287D22C700D36BF7 /* authrights */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t766355B92870CA6A002E3867 /* Sources */,\n\t\t\t\t766355BA2870CA6A002E3867 /* Frameworks */,\n\t\t\t\t766355BB2870CA6A002E3867 /* Resources */,\n\t\t\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = XCredsLoginPlugin;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t766355CD2870E9D3002E3867 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = XCredsLoginPlugin;\n\t\t\tproductReference = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F4F2A27C36A00AA8DB9 /* Sources */,\n\t\t\t\t76786F502A27C36A00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = auth_mech_fixup;\n\t\t\tproductName = auth_mech_fixup;\n\t\t\tproductReference = 76786F532A27C36A00AA8DB9 /* auth_mech_fixup */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76786F622A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F5F2A27C62D00AA8DB9 /* Sources */,\n\t\t\t\t76786F602A27C62D00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = test;\n\t\t\tproductName = test;\n\t\t\tproductReference = 76786F632A27C62D00AA8DB9 /* test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76DC0A6128836EB1007C42B2 /* Sources */,\n\t\t\t\t76DC0A6228836EB1007C42B2 /* Frameworks */,\n\t\t\t\t76DC0A6328836EB1007C42B2 /* Resources */,\n\t\t\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Overlay\";\n\t\t\tproductName = \"XCreds Login Overlay\";\n\t\t\tproductReference = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t76EE069927FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76EE069627FD1D00009E0F3A /* Sources */,\n\t\t\t\t76EE069727FD1D00009E0F3A /* Frameworks */,\n\t\t\t\t76EE069827FD1D00009E0F3A /* Resources */,\n\t\t\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */,\n\t\t\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76319379287E204500D36BF7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = XCreds;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76DD6D16285997F300A700ED /* OIDCLite */,\n\t\t\t\t76319365287D24E100D36BF7 /* ArgumentParser */,\n\t\t\t\t76319368287D24F600D36BF7 /* ArgumentParser */,\n\t\t\t\t762177E52B7144460051B756 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = xCreds;\n\t\t\tproductReference = 76EE069A27FD1D00009E0F3A /* XCreds.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t76EE069227FD1D00009E0F3A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1430;\n\t\t\t\tLastUpgradeCheck = 1330;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7631935C287D22C700D36BF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t766355BC2870CA6A002E3867 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1340;\n\t\t\t\t\t};\n\t\t\t\t\t766F4C4C2883B88F0021F548 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76786F522A27C36A00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76786F622A27C62D00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76DC0A6428836EB1007C42B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76EE069927FD1D00009E0F3A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 76EE069127FD1D00009E0F3A;\n\t\t\tpackageReferences = (\n\t\t\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */,\n\t\t\t\t762177E42B7144460051B756 /* XCLocalSwiftPackageReference \"../OIDCLite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 76EE069B27FD1D00009E0F3A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t76EE069927FD1D00009E0F3A /* XCreds */,\n\t\t\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */,\n\t\t\t\t7631935C287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t766F4C4C2883B88F0021F548 /* Send To Test */,\n\t\t\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F622A27C62D00AA8DB9 /* test */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t766355BB2870CA6A002E3867 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */,\n\t\t\t\t766355D928711C51002E3867 /* defaults.plist in Resources */,\n\t\t\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */,\n\t\t\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */,\n\t\t\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */,\n\t\t\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */,\n\t\t\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */,\n\t\t\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */,\n\t\t\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */,\n\t\t\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */,\n\t\t\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */,\n\t\t\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */,\n\t\t\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */,\n\t\t\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */,\n\t\t\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */,\n\t\t\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */,\n\t\t\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */,\n\t\t\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6328836EB1007C42B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */,\n\t\t\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */,\n\t\t\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */,\n\t\t\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */,\n\t\t\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */,\n\t\t\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069827FD1D00009E0F3A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */,\n\t\t\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */,\n\t\t\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */,\n\t\t\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */,\n\t\t\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */,\n\t\t\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */,\n\t\t\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */,\n\t\t\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */,\n\t\t\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */,\n\t\t\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */,\n\t\t\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */,\n\t\t\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */,\n\t\t\t\t76C63A322A22872700810C53 /* History.md in Resources */,\n\t\t\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */,\n\t\t\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */,\n\t\t\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */,\n\t\t\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */,\n\t\t\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t76319359287D22C700D36BF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */,\n\t\t\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355B92870CA6A002E3867 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */,\n\t\t\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */,\n\t\t\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */,\n\t\t\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */,\n\t\t\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */,\n\t\t\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */,\n\t\t\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */,\n\t\t\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */,\n\t\t\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */,\n\t\t\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */,\n\t\t\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */,\n\t\t\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */,\n\t\t\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */,\n\t\t\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */,\n\t\t\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */,\n\t\t\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */,\n\t\t\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */,\n\t\t\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */,\n\t\t\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */,\n\t\t\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */,\n\t\t\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */,\n\t\t\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */,\n\t\t\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */,\n\t\t\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */,\n\t\t\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */,\n\t\t\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F4F2A27C36A00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F5F2A27C62D00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6128836EB1007C42B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */,\n\t\t\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069627FD1D00009E0F3A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */,\n\t\t\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */,\n\t\t\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */,\n\t\t\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */,\n\t\t\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */,\n\t\t\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */,\n\t\t\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */,\n\t\t\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */,\n\t\t\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */,\n\t\t\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */,\n\t\t\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */,\n\t\t\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */,\n\t\t\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */,\n\t\t\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */,\n\t\t\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */,\n\t\t\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */,\n\t\t\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */,\n\t\t\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */,\n\t\t\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */,\n\t\t\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */,\n\t\t\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */,\n\t\t\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */,\n\t\t\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */,\n\t\t\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */,\n\t\t\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 766355BC2870CA6A002E3867 /* XCredsLoginPlugin */;\n\t\t\ttargetProxy = 76319375287E19A500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319379287E204500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7631935C287D22C700D36BF7 /* authrights */;\n\t\t\ttargetProxy = 76319378287E204500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */;\n\t\t\ttargetProxy = 76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76DC0A6C28836EB2007C42B2 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE06A227FD1D01009E0F3A /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t76319361287D22C700D36BF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76319362287D22C700D36BF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766355BE2870CA6A002E3867 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766355BF2870CA6A002E3867 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766F4C4E2883B88F0021F548 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEBUGGING_SYMBOLS = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766F4C4F2883B88F0021F548 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F582A27C36A00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F592A27C36A00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F682A27C62D00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F692A27C62D00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76DC0A7028836EB2007C42B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76DC0A7128836EB2007C42B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A527FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A627FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A827FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A927FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 6409;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 4.2;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76319361287D22C700D36BF7 /* Debug */,\n\t\t\t\t76319362287D22C700D36BF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766355BE2870CA6A002E3867 /* Debug */,\n\t\t\t\t766355BF2870CA6A002E3867 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766F4C4E2883B88F0021F548 /* Debug */,\n\t\t\t\t766F4C4F2883B88F0021F548 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F582A27C36A00AA8DB9 /* Debug */,\n\t\t\t\t76786F592A27C36A00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F682A27C62D00AA8DB9 /* Debug */,\n\t\t\t\t76786F692A27C62D00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76DC0A7028836EB2007C42B2 /* Debug */,\n\t\t\t\t76DC0A7128836EB2007C42B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A527FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A627FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A827FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A927FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCLocalSwiftPackageReference section */\n\t\t762177E42B7144460051B756 /* XCLocalSwiftPackageReference \"../OIDCLite\" */ = {\n\t\t\tisa = XCLocalSwiftPackageReference;\n\t\t\trelativePath = ../OIDCLite;\n\t\t};\n/* End XCLocalSwiftPackageReference section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/apple/swift-argument-parser.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.0.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t762177E52B7144460051B756 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76319365287D24E100D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76319368287D24F600D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t766355CD2870E9D3002E3867 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E02A12FAF900529D90 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76DD6D16285997F300A700ED /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 76EE069227FD1D00009E0F3A /* Project object */;\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/project_REMOTE_63385.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089B22F02AFAED280006B6BC /* NetworkMonitor.swift */; };\n\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C4BABA2B353B4B007B2C57 /* KerbUtil.m */; };\n\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */; };\n\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E22C116E450075FBD8 /* AppDelegate.swift */; };\n\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291E42C116E450075FBD8 /* ViewController.swift */; };\n\t\t760291E72C116E470075FBD8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 760291E62C116E470075FBD8 /* Assets.xcassets */; };\n\t\t760291EA2C116E470075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291E92C116E470075FBD8 /* Base */; };\n\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */ = {isa = PBXBuildFile; fileRef = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */; };\n\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 760291CB2C1166870075FBD8 /* AuthenticationServices.framework */; };\n\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */; };\n\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 760291FA2C116EDB0075FBD8 /* Base */; };\n\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t760292092C1175360075FBD8 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t7602920F2C1175DA0075FBD8 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t760292102C1175DA0075FBD8 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t760292162C1176A90075FBD8 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t760292192C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t7602921A2C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D62A1332660051411B /* DSQueryable.swift */; };\n\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418CF2A1332210051411B /* SignInWindowController.swift */; };\n\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D82A1332770051411B /* SystemInfoHelper.swift */; };\n\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418D42A1332520051411B /* DS+AD.swift */; };\n\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEBF288B75140063A644 /* XCredsCreateUser.swift */; };\n\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */; };\n\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */; };\n\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486B28A3575000C6A02B /* XCredsLoginDone.swift */; };\n\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 762177E52B7144460051B756 /* OIDCLite */; };\n\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */; };\n\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */; };\n\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = 7614D03B2B181A5D006EAF36 /* icon_128x128.png */; };\n\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7631935F287D22C700D36BF7 /* authrights.swift */; };\n\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319365287D24E100D36BF7 /* ArgumentParser */; };\n\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76319368287D24F600D36BF7 /* ArgumentParser */; };\n\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */; };\n\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */ = {isa = PBXBuildFile; fileRef = 7631935D287D22C700D36BF7 /* authrights */; };\n\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632909B2876673500CF8857 /* DataExtension.swift */; };\n\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */; };\n\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */; };\n\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */; };\n\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 763DDF192B4F1DD4000D48CC /* GSS.framework */; };\n\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76477E032C626B5D00F01D56 /* OIDCLite */; };\n\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */; };\n\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */; };\n\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */ = {isa = PBXBuildFile; fileRef = 764D8132284D14A500B3EE54 /* Credits.txt */; };\n\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDF62A1474330075980B /* LoginWebViewController.xib */; };\n\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEAE2B3503BF003A23DB /* SessionManager.swift */; };\n\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB22B350476003A23DB /* NoMADSession.swift */; };\n\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEB52B3504A6003A23DB /* UserRecord.swift */; };\n\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBB2B35055F003A23DB /* Logger.swift */; };\n\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */; };\n\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC52B3505EB003A23DB /* Extensions.swift */; };\n\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DECB2B35061E003A23DB /* SiteManager.swift */; };\n\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */; };\n\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */; };\n\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 766355CD2870E9D3002E3867 /* OIDCLite */; };\n\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */; };\n\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355D22870F29A002E3867 /* TestWindowController.swift */; };\n\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 766355D32870F29A002E3867 /* TestWindowController.xib */; };\n\t\t766355D928711C51002E3867 /* defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 764D812E284C06AB00B3EE54 /* defaults.plist */; };\n\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B327FD1E5F009E0F3A /* WebViewController.swift */; };\n\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E4287148C1002E3867 /* Tokens.swift */; };\n\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76673CD429D3D5F500452848 /* LicenseChecker.swift */; };\n\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; };\n\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42229D3A321009BC526 /* ProductLicense.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; };\n\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 766CC42129D3A320009BC526 /* Paddle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 766CC43729D3AED2009BC526 /* errorpage.html */; };\n\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */ = {isa = PBXBuildFile; fileRef = 766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */; };\n\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A6284AABC500CCD6FF /* NotifyManager.swift */; };\n\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */; };\n\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B0284B021500CCD6FF /* MainController.swift */; };\n\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116B2284B045800CCD6FF /* KeychainUtil.swift */; };\n\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908328908E40004E7085 /* WifiWindowController.swift */; };\n\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7677908528908E40004E7085 /* WifiWindowController.xib */; };\n\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F552A27C36A00AA8DB9 /* main.swift */; };\n\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F652A27C62D00AA8DB9 /* main.swift */; };\n\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767B939B2A28279E0038935E /* View+Shake.swift */; };\n\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */; };\n\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */; };\n\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */; };\n\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */; };\n\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */; };\n\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683973029A854EC003D9B9F /* NSImage+String.swift */; };\n\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7677908428908E40004E7085 /* WifiManager.swift */; };\n\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76873E2E2A107736001418A9 /* DefaultsHelper.swift */; };\n\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E02A12FAF900529D90 /* OIDCLite */; };\n\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = 76AB89E22A12FB4900529D90 /* ArgumentParser */; };\n\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B040A328EFC788002A289B /* Helper+JWTDecode.swift */; };\n\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882A829CCFD7900BB8186 /* TCSKeychain.m */; };\n\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */; };\n\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B882B029CCFDBA00BB8186 /* NSData+HexString.m */; };\n\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */; };\n\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E2287202080013E2A1 /* RestartX.png */; };\n\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E6287202AF0013E2A1 /* ShutdownX.png */; };\n\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */; };\n\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */; };\n\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */; };\n\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */; };\n\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */; };\n\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7FF2872A3030013E2A1 /* loginwindow.png */; };\n\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76C084092A9A2635008039FA /* ControlsViewController.xib */; };\n\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEC82B350606003A23DB /* KlistUtil.swift */; };\n\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7657DEBE2B3505A3003A23DB /* DNSResolver.m */; };\n\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB22B353AD7007B2C57 /* libresolv.tbd */; };\n\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C4BAB52B353AF7007B2C57 /* Kerberos.framework */; };\n\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7657DED82B351B5B003A23DB /* UNIXUtilities.swift */; };\n\t\t76C63A322A22872700810C53 /* History.md in Resources */ = {isa = PBXBuildFile; fileRef = 76C63A312A22872700810C53 /* History.md */; };\n\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */; };\n\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632E3A02873497C00E37923 /* LogShim.swift */; };\n\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */ = {isa = PBXBuildFile; fileRef = 76CB907C288112AF00C70D0C /* xcreds_login.sh */; };\n\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */; };\n\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7651EDEC2A1451590075980B /* LocalUsersViewController.xib */; };\n\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */; };\n\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */; };\n\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */ = {isa = PBXBuildFile; fileRef = 76DB5CF32A09AE9A0014F8E1 /* get_pw.js */; };\n\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A6728836EB1007C42B2 /* AppDelegate.swift */; };\n\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6928836EB2007C42B2 /* Assets.xcassets */; };\n\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6B28836EB2007C42B2 /* MainMenu.xib */; };\n\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */; };\n\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 76BEF7E3287202080013E2A1 /* RestartX@2x.png */; };\n\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */; };\n\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */; };\n\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */; };\n\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 76DC0A7628837028007C42B2 /* returnArrow.png */; };\n\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */; };\n\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */; };\n\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */; };\n\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */; };\n\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */ = {isa = PBXBuildFile; productRef = 76DD6D16285997F300A700ED /* OIDCLite */; };\n\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */; };\n\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */; };\n\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */; };\n\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */; };\n\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */; };\n\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */; };\n\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */; };\n\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355DA287132E9002E3867 /* LoginWebViewController.swift */; };\n\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */; };\n\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */; };\n\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE069D27FD1D00009E0F3A /* AppDelegate.swift */; };\n\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EE069F27FD1D01009E0F3A /* Assets.xcassets */; };\n\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06A127FD1D01009E0F3A /* MainMenu.xib */; };\n\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AB27FD1D92009E0F3A /* TokenManager.swift */; };\n\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */; };\n\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */; };\n\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */; };\n\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */; };\n\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */; };\n\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */; };\n\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767116AB284AB4C000CCD6FF /* PasswordUtils.swift */; };\n\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */; };\n\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */; };\n\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764D8128284BCAB100B3EE54 /* Window+Shake.swift */; };\n\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECCFF2875135900483C66 /* LoggerHelper.swift */; };\n\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766355E128713C47002E3867 /* LoginWindow.swift */; };\n\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */; };\n\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */ = {isa = PBXBuildFile; fileRef = 7613FDF6289E114F00340CCD /* loadpage.html */; };\n\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */; };\n\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */; };\n\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */; };\n\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291F32C116EDB0075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill Extension\";\n\t\t};\n\t\t760292052C116EEE0075FBD8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 760291DF2C116E450075FBD8;\n\t\t\tremoteInfo = \"XCreds AutoFill\";\n\t\t};\n\t\t76319375287E19A500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 766355BC2870CA6A002E3867;\n\t\t\tremoteInfo = XCredsLoginPlugin;\n\t\t};\n\t\t76319378287E204500D36BF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7631935C287D22C700D36BF7;\n\t\t\tremoteInfo = authrights;\n\t\t};\n\t\t76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 76EE069227FD1D00009E0F3A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 76DC0A6428836EB1007C42B2;\n\t\t\tremoteInfo = \"XCreds Login Overlay\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t760292002C116EDB0075FBD8 /* XCreds Login Password.appex in Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed Foundation Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935B287D22C700D36BF7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC42B29D3A3DC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42929D3A3DC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43029D3A3EC009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC42E29D3A3EC009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t766CC43529D3A3F8009BC526 /* Paddle.framework in Embed Frameworks */,\n\t\t\t\t766CC43329D3A3F8009BC526 /* ProductLicense.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkMonitor.swift; path = XCredsLoginPlugIn/LoginWindow/NetworkMonitor.swift; sourceTree = SOURCE_ROOT; };\n\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSBundle+FindBundlePath.swift\"; sourceTree = \"<group>\"; };\n\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = System/Library/Frameworks/AuthenticationServices.framework; sourceTree = SDKROOT; };\n\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Autofill.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t760291E42C116E450075FBD8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291E62C116E470075FBD8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t760291E92C116E470075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill.entitlements; sourceTree = \"<group>\"; };\n\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = \"XCreds Login Password.appex\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderViewController.swift; sourceTree = \"<group>\"; };\n\t\t760291FA2C116EDB0075FBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CredentialProviderViewController.xib; sourceTree = \"<group>\"; };\n\t\t760291FC2C116EDB0075FBD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_AutoFill_Extension.entitlements; sourceTree = \"<group>\"; };\n\t\t760418CE2A1332210051411B /* SignIn.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SignIn.xib; sourceTree = \"<group>\"; };\n\t\t760418CF2A1332210051411B /* SignInWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWindowController.swift; sourceTree = \"<group>\"; };\n\t\t760418D42A1332520051411B /* DS+AD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"DS+AD.swift\"; sourceTree = \"<group>\"; };\n\t\t760418D62A1332660051411B /* DSQueryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSQueryable.swift; sourceTree = \"<group>\"; };\n\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemInfoHelper.swift; sourceTree = \"<group>\"; };\n\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalCheckAndMigrate.swift; sourceTree = \"<group>\"; };\n\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoLoMechanism.swift; sourceTree = \"<group>\"; };\n\t\t760418DE2A1334D00051411B /* CheckAD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckAD.swift; sourceTree = \"<group>\"; };\n\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsCreateUser.swift; sourceTree = \"<group>\"; };\n\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsEnableFDE.swift; sourceTree = \"<group>\"; };\n\t\t7613FDF6289E114F00340CCD /* loadpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = loadpage.html; sourceTree = \"<group>\"; };\n\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = XCreds/Assets.xcassets/AppIcon.appiconset/icon_128x128.png; sourceTree = \"<group>\"; };\n\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoginProgressWindowController.xib; path = XCredsLoginPlugIn/LoginProgressWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginProgressWindowController.swift; path = XCredsLoginPlugIn/LoginProgressWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginDone.swift; sourceTree = \"<group>\"; };\n\t\t7631935D287D22C700D36BF7 /* authrights */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = authrights; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7631935F287D22C700D36BF7 /* authrights.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = authrights.swift; sourceTree = \"<group>\"; };\n\t\t7632909B2876673500CF8857 /* DataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataExtension.swift; sourceTree = \"<group>\"; };\n\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsKeychainAdd.swift; sourceTree = \"<group>\"; };\n\t\t7632E3A02873497C00E37923 /* LogShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogShim.swift; path = Mechanisms/LogShim.swift; sourceTree = \"<group>\"; };\n\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesktopLoginWindowController.swift; sourceTree = \"<group>\"; };\n\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitePopoverBackgroundView.swift; sourceTree = \"<group>\"; };\n\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounterMenu.swift; sourceTree = \"<group>\"; };\n\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = System/Library/Frameworks/GSS.framework; sourceTree = SDKROOT; };\n\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = xcredsmenuItemWindowBackgroundImage.png; sourceTree = \"<group>\"; };\n\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyLocalPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VerifyLocalPasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyOIDCPasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerifyOIDCPassword.xib; sourceTree = \"<group>\"; };\n\t\t764D812E284C06AB00B3EE54 /* defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = defaults.plist; sourceTree = \"<group>\"; };\n\t\t764D8132284D14A500B3EE54 /* Credits.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.txt; sourceTree = \"<group>\"; };\n\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalUsersViewController.xib; sourceTree = \"<group>\"; };\n\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginWebViewController.xib; sourceTree = \"<group>\"; };\n\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoMADSession.swift; sourceTree = \"<group>\"; };\n\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRecord.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBB2B35055F003A23DB /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DNSResolver.m; sourceTree = \"<group>\"; };\n\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolver.h; sourceTree = \"<group>\"; };\n\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ADLDAPPing.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlistUtil.swift; sourceTree = \"<group>\"; };\n\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteManager.swift; sourceTree = \"<group>\"; };\n\t\t7657DED22B350644003A23DB /* GSSItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GSSItem.h; sourceTree = \"<group>\"; };\n\t\t7657DED32B35064E003A23DB /* krb5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = krb5.h; sourceTree = \"<group>\"; };\n\t\t7657DED52B351A67003A23DB /* KerbUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KerbUtil.h; sourceTree = \"<group>\"; };\n\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UNIXUtilities.swift; sourceTree = \"<group>\"; };\n\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DefaultBackground.png; sourceTree = \"<group>\"; };\n\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCredsLoginPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = XCredsLoginPlugin.h; path = XCredsLoginPlugIn/XCredsLoginPlugin.h; sourceTree = SOURCE_ROOT; };\n\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = XCredsLoginPlugin.m; path = XCredsLoginPlugIn/XCredsLoginPlugin.m; sourceTree = SOURCE_ROOT; };\n\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCredsLoginPlugin-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t766355D22870F29A002E3867 /* TestWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestWindowController.swift; path = XCredsLoginPlugIn/TestWindowController.swift; sourceTree = \"<group>\"; };\n\t\t766355D32870F29A002E3867 /* TestWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = TestWindowController.xib; path = XCredsLoginPlugIn/TestWindowController.xib; sourceTree = \"<group>\"; };\n\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginWebViewController.swift; path = XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift; sourceTree = SOURCE_ROOT; };\n\t\t766355E128713C47002E3867 /* LoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t766355E4287148C1002E3867 /* Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tokens.swift; path = Shared/Tokens.swift; sourceTree = SOURCE_ROOT; };\n\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseChecker.swift; sourceTree = \"<group>\"; };\n\t\t766CC42129D3A320009BC526 /* Paddle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paddle.framework; path = Carthage/Build/Mac/Paddle.framework; sourceTree = \"<group>\"; };\n\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ProductLicense.framework; path = Carthage/Build/Mac/ProductLicense.framework; sourceTree = \"<group>\"; };\n\t\t766CC43729D3AED2009BC526 /* errorpage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorpage.html; sourceTree = \"<group>\"; };\n\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pleaseWaitGraphic.png; sourceTree = \"<group>\"; };\n\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsOverride.swift; sourceTree = \"<group>\"; };\n\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifyManager.swift; sourceTree = \"<group>\"; };\n\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleManager.swift; sourceTree = \"<group>\"; };\n\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordUtils.swift; sourceTree = \"<group>\"; };\n\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityPrivateAPI.h; sourceTree = \"<group>\"; };\n\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"XCreds-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t767116B0284B021500CCD6FF /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = \"<group>\"; };\n\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainUtil.swift; sourceTree = \"<group>\"; };\n\t\t7675444428918CD100613840 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = XCredsLoginPlugin/Info.plist; sourceTree = \"<group>\"; };\n\t\t7677908328908E40004E7085 /* WifiWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7677908428908E40004E7085 /* WifiManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WifiManager.swift; sourceTree = \"<group>\"; };\n\t\t7677908528908E40004E7085 /* WifiWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WifiWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthRightsHelper.swift; path = Shared/AuthRightsHelper.swift; sourceTree = SOURCE_ROOT; };\n\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = auth_mech_fixup; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F552A27C36A00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F632A27C62D00AA8DB9 /* test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76786F652A27C62D00AA8DB9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = \"auth_mech_fixup-Bridging-Header.h\"; path = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\"; sourceTree = SOURCE_ROOT; };\n\t\t767B939B2A28279E0038935E /* View+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+Shake.swift\"; sourceTree = \"<group>\"; };\n\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libinfo.tbd; path = usr/lib/libinfo.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsystem_info.tbd; path = usr/lib/system/libsystem_info.tbd; sourceTree = SDKROOT; };\n\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; };\n\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = \"<group>\"; };\n\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutWindow.xib; sourceTree = \"<group>\"; };\n\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.twocanoes.xcreds.plist; path = \"Profile Manifest/com.twocanoes.xcreds.plist\"; sourceTree = \"<group>\"; };\n\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NSImage+String.swift\"; sourceTree = \"<group>\"; };\n\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DefaultsHelper.swift; path = XCreds/DefaultsHelper.swift; sourceTree = \"<group>\"; };\n\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = \"Helper+JWTDecode.swift\"; path = \"XCreds/Helper+JWTDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSKeychain.m; sourceTree = \"<group>\"; };\n\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSKeychain.h; sourceTree = \"<group>\"; };\n\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+SHA1.m\"; sourceTree = \"<group>\"; };\n\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+SHA1.h\"; sourceTree = \"<group>\"; };\n\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+HexString.m\"; sourceTree = \"<group>\"; };\n\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+HexString.h\"; sourceTree = \"<group>\"; };\n\t\t76BEF7D42871F36C0013E2A1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSReturnWindow.m; sourceTree = \"<group>\"; };\n\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSReturnWindow.h; sourceTree = \"<group>\"; };\n\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7E2287202080013E2A1 /* RestartX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RestartX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"RestartX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ShutdownX.png; sourceTree = \"<group>\"; };\n\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"ShutdownX@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsLoginMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsBaseMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCredsPowerControlMechanism.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTaskWrapper.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContextAndHintHandling.swift; sourceTree = \"<group>\"; };\n\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AuthorizationDBManager.swift; path = XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift; sourceTree = SOURCE_ROOT; };\n\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"loginwindow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loginwindow.png; sourceTree = \"<group>\"; };\n\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControlsViewController.xib; sourceTree = \"<group>\"; };\n\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareMounter.swift; sourceTree = \"<group>\"; };\n\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };\n\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = System/Library/Frameworks/Kerberos.framework; sourceTree = SDKROOT; };\n\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KerbUtil.m; sourceTree = \"<group>\"; };\n\t\t76C63A312A22872700810C53 /* History.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = History.md; sourceTree = \"<group>\"; };\n\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Helper+URLDecode.swift\"; sourceTree = \"<group>\"; };\n\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = xcreds_login.sh; sourceTree = \"<group>\"; };\n\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocalAccountWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SelectLocalAccountWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainLoginWindow.swift; sourceTree = \"<group>\"; };\n\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCTaskWrapperWithBlocks.h; sourceTree = \"<group>\"; };\n\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCTaskWrapperWithBlocks.m; sourceTree = \"<group>\"; };\n\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TCSUnifiedLogger.m; sourceTree = \"<group>\"; };\n\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCSUnifiedLogger.h; sourceTree = \"<group>\"; };\n\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+TCSRealHomeFolder.m\"; sourceTree = \"<group>\"; };\n\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+TCSRealHomeFolder.h\"; sourceTree = \"<group>\"; };\n\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = get_pw.js; path = Javascript/get_pw/get_pw.js; sourceTree = \"<group>\"; };\n\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"XCreds Login Overlay.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76DC0A6C28836EB2007C42B2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCreds_Login_Overlay.entitlements; sourceTree = \"<group>\"; };\n\t\t76DC0A7628837028007C42B2 /* returnArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = returnArrow.png; sourceTree = \"<group>\"; };\n\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"com.twocanoes.xcreds-overlay.plist\"; sourceTree = \"<group>\"; };\n\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCSXCredsLoginOverlayWindow.swift; sourceTree = \"<group>\"; };\n\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = \"XCreds-Login-Overlay-Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t76DD6D122859978F00A700ED /* OIDCLite */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = OIDCLite; path = ../OIDCLite; sourceTree = \"<group>\"; };\n\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCredsMechanismProtocol.swift; sourceTree = \"<group>\"; };\n\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TCSLoginWindowUtilities.h; path = XCreds/TCSLoginWindowUtilities.h; sourceTree = \"<group>\"; };\n\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TCSLoginWindowUtilities.m; path = XCreds/TCSLoginWindowUtilities.m; sourceTree = \"<group>\"; };\n\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCreds.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t76EE06A227FD1D01009E0F3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = xCreds.entitlements; sourceTree = \"<group>\"; };\n\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenManager.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefKeys.swift; sourceTree = \"<group>\"; };\n\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Window+ForceToFront.swift\"; sourceTree = \"<group>\"; };\n\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DesktopLoginWindowController.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = \"<group>\"; };\n\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuController.swift; sourceTree = \"<group>\"; };\n\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerHelper.swift; sourceTree = \"<group>\"; };\n\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+Base64URLEncoded.swift\"; sourceTree = \"<group>\"; };\n\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainLoginWindowController.swift; path = XCreds/MainLoginWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainLoginWindowController.xib; path = XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuWindowController.swift; sourceTree = SOURCE_ROOT; };\n\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusMenuWindowController.xib; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t760291DD2C116E450075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F12C116EDB0075FBD8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F52C116EDB0075FBD8 /* AuthenticationServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7631935A287D22C700D36BF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76AB89E32A12FB4900529D90 /* ArgumentParser in Frameworks */,\n\t\t\t\t76AB89E12A12FAF900529D90 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BA2870CA6A002E3867 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76C4BAB62B353AF7007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t76C4BAB42B353ADD007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t766CC42D29D3A3EC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42F29D3A3EC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766355CE2870E9D3002E3867 /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F502A27C36A00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F602A27C62D00AA8DB9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6228836EB1007C42B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t766CC43429D3A3F8009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t766CC43229D3A3F8009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069727FD1D00009E0F3A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76477E042C626B5D00F01D56 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB72B353AFD007B2C57 /* Kerberos.framework in Frameworks */,\n\t\t\t\t762177E62B7144460051B756 /* OIDCLite in Frameworks */,\n\t\t\t\t76C4BAB32B353AD7007B2C57 /* libresolv.tbd in Frameworks */,\n\t\t\t\t763DDF1A2B4F1DD4000D48CC /* GSS.framework in Frameworks */,\n\t\t\t\t766CC42829D3A3DC009BC526 /* ProductLicense.framework in Frameworks */,\n\t\t\t\t766CC42A29D3A3DC009BC526 /* Paddle.framework in Frameworks */,\n\t\t\t\t767CB2D02B13B92B006CA2AC /* OpenDirectory.framework in Frameworks */,\n\t\t\t\t76319369287D24F600D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76319366287D24E100D36BF7 /* ArgumentParser in Frameworks */,\n\t\t\t\t76DD6D17285997F300A700ED /* OIDCLite in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E22C116E450075FBD8 /* AppDelegate.swift */,\n\t\t\t\t760291E42C116E450075FBD8 /* ViewController.swift */,\n\t\t\t\t760291E62C116E470075FBD8 /* Assets.xcassets */,\n\t\t\t\t760291E82C116E470075FBD8 /* Main.storyboard */,\n\t\t\t\t760291EB2C116E470075FBD8 /* XCreds_AutoFill.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760291F72C116EDB0075FBD8 /* CredentialProviderViewController.swift */,\n\t\t\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */,\n\t\t\t\t760291FC2C116EDB0075FBD8 /* Info.plist */,\n\t\t\t\t760291FD2C116EDB0075FBD8 /* XCreds_AutoFill_Extension.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds AutoFill Extension\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CC2A1331710051411B /* NomadLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418DE2A1334D00051411B /* CheckAD.swift */,\n\t\t\t\t760418DC2A1334210051411B /* NoLoMechanism.swift */,\n\t\t\t\t760418DA2A13328C0051411B /* LocalCheckAndMigrate.swift */,\n\t\t\t\t760418D82A1332770051411B /* SystemInfoHelper.swift */,\n\t\t\t\t760418D62A1332660051411B /* DSQueryable.swift */,\n\t\t\t\t760418D42A1332520051411B /* DS+AD.swift */,\n\t\t\t\t760418CD2A1332210051411B /* UI */,\n\t\t\t);\n\t\t\tpath = NomadLogin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760418CD2A1332210051411B /* UI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t760418CE2A1332210051411B /* SignIn.xib */,\n\t\t\t);\n\t\t\tpath = UI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7631935E287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F4E2A27C31400AA8DB9 /* AuthRightsHelper.swift */,\n\t\t\t\t7631935F287D22C700D36BF7 /* authrights.swift */,\n\t\t\t);\n\t\t\tpath = authrights;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7657DEDC2B351BF9003A23DB /* headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEBF2B3505A3003A23DB /* DNSResolver.h */,\n\t\t\t\t7657DED32B35064E003A23DB /* krb5.h */,\n\t\t\t\t7657DED22B350644003A23DB /* GSSItem.h */,\n\t\t\t);\n\t\t\tpath = headers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t766355C72870D1B5002E3867 /* XCredsLogin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76B882B129CCFDBA00BB8186 /* NSData+HexString.h */,\n\t\t\t\t76B882B029CCFDBA00BB8186 /* NSData+HexString.m */,\n\t\t\t\t76B882AD29CCFDAE00BB8186 /* NSData+SHA1.h */,\n\t\t\t\t76B882AC29CCFDAE00BB8186 /* NSData+SHA1.m */,\n\t\t\t\t76B882A929CCFD7A00BB8186 /* TCSKeychain.h */,\n\t\t\t\t76B882A829CCFD7900BB8186 /* TCSKeychain.m */,\n\t\t\t\t7613FDF6289E114F00340CCD /* loadpage.html */,\n\t\t\t\t766CC43729D3AED2009BC526 /* errorpage.html */,\n\t\t\t\t7677908428908E40004E7085 /* WifiManager.swift */,\n\t\t\t\t7677908328908E40004E7085 /* WifiWindowController.swift */,\n\t\t\t\t7677908528908E40004E7085 /* WifiWindowController.xib */,\n\t\t\t\t76EECD0328753C7F00483C66 /* String+Base64URLEncoded.swift */,\n\t\t\t\t7632E3A02873497C00E37923 /* LogShim.swift */,\n\t\t\t\t76BEF7F72872504C0013E2A1 /* ContextAndHintHandling.swift */,\n\t\t\t\t76BEF7F528724FA80013E2A1 /* NSTaskWrapper.swift */,\n\t\t\t\t766355C12870CB6F002E3867 /* XCredsLoginPlugin.h */,\n\t\t\t\t766355C22870CB6F002E3867 /* XCredsLoginPlugin.m */,\n\t\t\t\t76BEF7F028724E520013E2A1 /* LoginWindow */,\n\t\t\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */,\n\t\t\t);\n\t\t\tname = XCredsLogin;\n\t\t\tpath = XCredsLoginPlugIn;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F6A2A27C72900AA8DB9 /* auth_mech_fixup-Bridging-Header.h */,\n\t\t\t\t76786F552A27C36A00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = auth_mech_fixup;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76786F642A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76786F652A27C62D00AA8DB9 /* main.swift */,\n\t\t\t);\n\t\t\tpath = test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76BEF7D42871F36C0013E2A1 /* main.swift */,\n\t\t\t);\n\t\t\tpath = FakeTrue;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7EF28724E280013E2A1 /* Mechanisms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t761B486B28A3575000C6A02B /* XCredsLoginDone.swift */,\n\t\t\t\t7611CEC1288B96760063A644 /* XCredsEnableFDE.swift */,\n\t\t\t\t7611CEBF288B75140063A644 /* XCredsCreateUser.swift */,\n\t\t\t\t7632E39E287347C100E37923 /* XCredsKeychainAdd.swift */,\n\t\t\t\t76BEF7F228724F120013E2A1 /* XCredsPowerControlMechanism.swift */,\n\t\t\t\t76BEF7EA28724A0B0013E2A1 /* XCredsLoginMechanism.swift */,\n\t\t\t\t76BEF7EB28724A0B0013E2A1 /* XCredsBaseMechanism.swift */,\n\t\t\t);\n\t\t\tpath = Mechanisms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F028724E520013E2A1 /* LoginWindow */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766355DA287132E9002E3867 /* LoginWebViewController.swift */,\n\t\t\t\t760418CF2A1332210051411B /* SignInWindowController.swift */,\n\t\t\t\t761B486828A34CC900C6A02B /* LoginProgressWindowController.swift */,\n\t\t\t\t089B22F02AFAED280006B6BC /* NetworkMonitor.swift */,\n\t\t\t\t761B486728A34CC900C6A02B /* LoginProgressWindowController.xib */,\n\t\t\t\t76FDC5D52B22D47A0035D61E /* MainLoginWindowController.xib */,\n\t\t\t\t76CB907C288112AF00C70D0C /* xcreds_login.sh */,\n\t\t\t\t76BEF7F928726C700013E2A1 /* AuthorizationDBManager.swift */,\n\t\t\t\t76BEF7DC2871F5F00013E2A1 /* TCSReturnWindow.h */,\n\t\t\t\t76BEF7DB2871F5F00013E2A1 /* TCSReturnWindow.m */,\n\t\t\t\t76C084092A9A2635008039FA /* ControlsViewController.xib */,\n\t\t\t\t763AEFDE2C156E1E0059A83D /* WhitePopoverBackgroundView.swift */,\n\t\t\t\t76BEF7E02871F74D0013E2A1 /* ControlsViewController.swift */,\n\t\t\t\t766355E128713C47002E3867 /* LoginWindow.swift */,\n\t\t\t\t7651EDEC2A1451590075980B /* LocalUsersViewController.xib */,\n\t\t\t\t76D1757D2B24096C00E64A62 /* MainLoginWindow.swift */,\n\t\t\t\t76BEF7F128724EB60013E2A1 /* images */,\n\t\t\t);\n\t\t\tpath = LoginWindow;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76BEF7F128724EB60013E2A1 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7649056E2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png */,\n\t\t\t\t76BEF7FF2872A3030013E2A1 /* loginwindow.png */,\n\t\t\t\t76BEF7FE2872A3030013E2A1 /* loginwindow@2x.png */,\n\t\t\t\t76BEF7E6287202AF0013E2A1 /* ShutdownX.png */,\n\t\t\t\t76BEF7E7287202AF0013E2A1 /* ShutdownX@2x.png */,\n\t\t\t\t76BEF7E2287202080013E2A1 /* RestartX.png */,\n\t\t\t\t76BEF7E3287202080013E2A1 /* RestartX@2x.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7657DEAE2B3503BF003A23DB /* SessionManager.swift */,\n\t\t\t\t7657DED82B351B5B003A23DB /* UNIXUtilities.swift */,\n\t\t\t\t7657DED52B351A67003A23DB /* KerbUtil.h */,\n\t\t\t\t76C4BABA2B353B4B007B2C57 /* KerbUtil.m */,\n\t\t\t\t7657DEDC2B351BF9003A23DB /* headers */,\n\t\t\t\t7657DECB2B35061E003A23DB /* SiteManager.swift */,\n\t\t\t\t7657DEC82B350606003A23DB /* KlistUtil.swift */,\n\t\t\t\t7657DEC52B3505EB003A23DB /* Extensions.swift */,\n\t\t\t\t7657DEC22B3505CB003A23DB /* ADLDAPPing.swift */,\n\t\t\t\t7657DEBE2B3505A3003A23DB /* DNSResolver.m */,\n\t\t\t\t7657DEBB2B35055F003A23DB /* Logger.swift */,\n\t\t\t\t7657DEB52B3504A6003A23DB /* UserRecord.swift */,\n\t\t\t\t7657DEB22B350476003A23DB /* NoMADSession.swift */,\n\t\t\t);\n\t\t\tname = NoMAD;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t766F4C4A2883AFD90021F548 /* pleaseWaitGraphic.png */,\n\t\t\t\t76DC0A7F2883785A007C42B2 /* XCreds-Login-Overlay-Info.plist */,\n\t\t\t\t76DC0A7D288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift */,\n\t\t\t\t76DC0A78288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist */,\n\t\t\t\t76DC0A7628837028007C42B2 /* returnArrow.png */,\n\t\t\t\t76DC0A6728836EB1007C42B2 /* AppDelegate.swift */,\n\t\t\t\t76DC0A6928836EB2007C42B2 /* Assets.xcassets */,\n\t\t\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */,\n\t\t\t\t76DC0A6E28836EB2007C42B2 /* XCreds_Login_Overlay.entitlements */,\n\t\t\t);\n\t\t\tpath = \"XCreds Login Overlay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D112859978F00A700ED /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76DD6D122859978F00A700ED /* OIDCLite */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DD6D15285997F300A700ED /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t763DDF192B4F1DD4000D48CC /* GSS.framework */,\n\t\t\t\t76C4BAB52B353AF7007B2C57 /* Kerberos.framework */,\n\t\t\t\t76C4BAB22B353AD7007B2C57 /* libresolv.tbd */,\n\t\t\t\t767CB2CF2B13B92B006CA2AC /* OpenDirectory.framework */,\n\t\t\t\t767CB2CE2B13B913006CA2AC /* libsystem_info.tbd */,\n\t\t\t\t767CB2CC2B13B8EB006CA2AC /* libinfo.tbd */,\n\t\t\t\t766CC42129D3A320009BC526 /* Paddle.framework */,\n\t\t\t\t766CC42229D3A321009BC526 /* ProductLicense.framework */,\n\t\t\t\t760291CB2C1166870075FBD8 /* AuthenticationServices.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069127FD1D00009E0F3A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76D4726B2B43B8FA0064380C /* TCTaskWrapperWithBlocks.h */,\n\t\t\t\t76D4726C2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m */,\n\t\t\t\t763DDF152B4F100D000D48CC /* ShareMounterMenu.swift */,\n\t\t\t\t76C4ACBE2B3D0F8D003B3605 /* ShareMounter.swift */,\n\t\t\t\t76C4BAB92B353B3F007B2C57 /* NoMAD */,\n\t\t\t\t760148A82B23639D00E119A2 /* NSBundle+FindBundlePath.swift */,\n\t\t\t\t7614D03B2B181A5D006EAF36 /* icon_128x128.png */,\n\t\t\t\t7681FEC82A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist */,\n\t\t\t\t76C63A312A22872700810C53 /* History.md */,\n\t\t\t\t760418CC2A1331710051411B /* NomadLogin */,\n\t\t\t\t76873E2E2A107736001418A9 /* DefaultsHelper.swift */,\n\t\t\t\t76E9CE6E2A0DC6E30060220C /* TCSLoginWindowUtilities.h */,\n\t\t\t\t76E9CE6F2A0DC6E30060220C /* TCSLoginWindowUtilities.m */,\n\t\t\t\t76673CD429D3D5F500452848 /* LicenseChecker.swift */,\n\t\t\t\t7683973029A854EC003D9B9F /* NSImage+String.swift */,\n\t\t\t\t76DB5CF32A09AE9A0014F8E1 /* get_pw.js */,\n\t\t\t\t7659CA06298E1BB6005D1AA3 /* DefaultBackground.png */,\n\t\t\t\t766FD60C2A1B06AC00C8F244 /* DefaultsOverride.swift */,\n\t\t\t\t7675444428918CD100613840 /* Info.plist */,\n\t\t\t\t760291E12C116E450075FBD8 /* XCreds AutoFill */,\n\t\t\t\t760291F62C116EDB0075FBD8 /* XCreds AutoFill Extension */,\n\t\t\t\t76DD6D15285997F300A700ED /* Frameworks */,\n\t\t\t\t76CB9076287FBEEA00C70D0C /* Helper+URLDecode.swift */,\n\t\t\t\t76B040A328EFC788002A289B /* Helper+JWTDecode.swift */,\n\t\t\t\t7632909B2876673500CF8857 /* DataExtension.swift */,\n\t\t\t\t766355D22870F29A002E3867 /* TestWindowController.swift */,\n\t\t\t\t766355D32870F29A002E3867 /* TestWindowController.xib */,\n\t\t\t\t76DD6D112859978F00A700ED /* Packages */,\n\t\t\t\t766355C72870D1B5002E3867 /* XCredsLogin */,\n\t\t\t\t76EE069C27FD1D00009E0F3A /* XCreds */,\n\t\t\t\t76BEF7D32871F36C0013E2A1 /* FakeTrue */,\n\t\t\t\t7631935E287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6628836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t76786F542A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F642A27C62D00AA8DB9 /* test */,\n\t\t\t\t76EE069B27FD1D00009E0F3A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069B27FD1D00009E0F3A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE069A27FD1D00009E0F3A /* XCreds.app */,\n\t\t\t\t766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */,\n\t\t\t\t7631935D287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */,\n\t\t\t\t76786F532A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F632A27C62D00AA8DB9 /* test */,\n\t\t\t\t760291E02C116E450075FBD8 /* XCreds Login Autofill.app */,\n\t\t\t\t760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE069C27FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76FDC5D42B22D47A0035D61E /* MainLoginWindowController.swift */,\n\t\t\t\t764D8125284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib */,\n\t\t\t\t76CCF5432B12E478003F85E9 /* SelectLocalAccountWindowController.xib */,\n\t\t\t\t76CCF5422B12E478003F85E9 /* SelectLocalAccountWindowController.swift */,\n\t\t\t\t76FDC5D92B235A4F0035D61E /* StatusMenuWindowController.xib */,\n\t\t\t\t76E466652B1A4C16006529B6 /* UpdatePasswordWindowController.xib */,\n\t\t\t\t7651EDF62A1474330075980B /* LoginWebViewController.xib */,\n\t\t\t\t764D812B284BCC7400B3EE54 /* VerifyOIDCPassword.xib */,\n\t\t\t\t76FDC5D82B235A4F0035D61E /* StatusMenuWindowController.swift */,\n\t\t\t\t76D7ADFD284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.h */,\n\t\t\t\t76D7ADFC284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m */,\n\t\t\t\t76D7ADFA284EB15100332EBC /* TCSUnifiedLogger.h */,\n\t\t\t\t76D7ADF9284EB15000332EBC /* TCSUnifiedLogger.m */,\n\t\t\t\t76EECCFF2875135900483C66 /* LoggerHelper.swift */,\n\t\t\t\t764D812A284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift */,\n\t\t\t\t764D8124284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift */,\n\t\t\t\t764D8132284D14A500B3EE54 /* Credits.txt */,\n\t\t\t\t76E466642B1A4C16006529B6 /* UpdatePasswordWindowController.swift */,\n\t\t\t\t767116B2284B045800CCD6FF /* KeychainUtil.swift */,\n\t\t\t\t767116AD284AB59400CCD6FF /* SecurityPrivateAPI.h */,\n\t\t\t\t76EE06AB27FD1D92009E0F3A /* TokenManager.swift */,\n\t\t\t\t76E74DCE2B3902F0004C6429 /* XCredsMechanismProtocol.swift */,\n\t\t\t\t76EE06AD27FD1DC3009E0F3A /* PrefKeys.swift */,\n\t\t\t\t764D8128284BCAB100B3EE54 /* Window+Shake.swift */,\n\t\t\t\t767B939B2A28279E0038935E /* View+Shake.swift */,\n\t\t\t\t76EE06B127FD1E24009E0F3A /* DesktopLoginWindowController.xib */,\n\t\t\t\t76342E592B282653007D4F29 /* DesktopLoginWindowController.swift */,\n\t\t\t\t76EE06B327FD1E5F009E0F3A /* WebViewController.swift */,\n\t\t\t\t766355E4287148C1002E3867 /* Tokens.swift */,\n\t\t\t\t7681FEC62A4C8BC800F91CD1 /* AboutWindow.xib */,\n\t\t\t\t767116AB284AB4C000CCD6FF /* PasswordUtils.swift */,\n\t\t\t\t76EE06B527FD1E79009E0F3A /* PreferencesWindow.xib */,\n\t\t\t\t764D812E284C06AB00B3EE54 /* defaults.plist */,\n\t\t\t\t767116AE284AB5D900CCD6FF /* XCreds-Bridging-Header.h */,\n\t\t\t\t76EE06B727FD1EB7009E0F3A /* PreferencesWindowController.swift */,\n\t\t\t\t7681FEC42A4C8B9000F91CD1 /* AboutWindowController.swift */,\n\t\t\t\t76EE06AF27FD1DD8009E0F3A /* Window+ForceToFront.swift */,\n\t\t\t\t767116A8284AAE2B00CCD6FF /* ScheduleManager.swift */,\n\t\t\t\t76EE06C127FD1F50009E0F3A /* StatusMenuController.swift */,\n\t\t\t\t76EE06AA27FD1D66009E0F3A /* Info.plist */,\n\t\t\t\t76EE069D27FD1D00009E0F3A /* AppDelegate.swift */,\n\t\t\t\t767116B0284B021500CCD6FF /* MainController.swift */,\n\t\t\t\t767116A6284AABC500CCD6FF /* NotifyManager.swift */,\n\t\t\t\t76EE069F27FD1D01009E0F3A /* Assets.xcassets */,\n\t\t\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */,\n\t\t\t\t76EE06A427FD1D01009E0F3A /* xCreds.entitlements */,\n\t\t\t\t766355C42870CCC3002E3867 /* XCredsLoginPlugin-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = XCreds;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXLegacyTarget section */\n\t\t766F4C4C2883B88F0021F548 /* Send To Test */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"app_to_test.sh mba.local\";\n\t\t\tbuildConfigurationList = 766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = /bin/bash;\n\t\t\tbuildWorkingDirectory = /Users/tperfitt/Documents/Projects/xcreds;\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Send To Test\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Send To Test\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXNativeTarget section */\n\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291DC2C116E450075FBD8 /* Sources */,\n\t\t\t\t760291DD2C116E450075FBD8 /* Frameworks */,\n\t\t\t\t760291DE2C116E450075FBD8 /* Resources */,\n\t\t\t\t760292042C116EDB0075FBD8 /* Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"XCreds Login Autofill\";\n\t\t\tproductName = \"XCreds AutoFill\";\n\t\t\tproductReference = 760291E02C116E450075FBD8 /* XCreds Login Autofill.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t760291F02C116EDB0075FBD8 /* Sources */,\n\t\t\t\t760291F12C116EDB0075FBD8 /* Frameworks */,\n\t\t\t\t760291F22C116EDB0075FBD8 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Password\";\n\t\t\tproductName = \"XCreds AutoFill Extension\";\n\t\t\tproductReference = 760291F42C116EDB0075FBD8 /* XCreds Login Password.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension\";\n\t\t};\n\t\t7631935C287D22C700D36BF7 /* authrights */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76319359287D22C700D36BF7 /* Sources */,\n\t\t\t\t7631935A287D22C700D36BF7 /* Frameworks */,\n\t\t\t\t7631935B287D22C700D36BF7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = authrights;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76AB89E02A12FAF900529D90 /* OIDCLite */,\n\t\t\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */,\n\t\t\t);\n\t\t\tproductName = authrights;\n\t\t\tproductReference = 7631935D287D22C700D36BF7 /* authrights */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t766355B92870CA6A002E3867 /* Sources */,\n\t\t\t\t766355BA2870CA6A002E3867 /* Frameworks */,\n\t\t\t\t766355BB2870CA6A002E3867 /* Resources */,\n\t\t\t\t766CC43129D3A3EC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = XCredsLoginPlugin;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t766355CD2870E9D3002E3867 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = XCredsLoginPlugin;\n\t\t\tproductReference = 766355BD2870CA6A002E3867 /* XCredsLoginPlugin.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F4F2A27C36A00AA8DB9 /* Sources */,\n\t\t\t\t76786F502A27C36A00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F512A27C36A00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = auth_mech_fixup;\n\t\t\tproductName = auth_mech_fixup;\n\t\t\tproductReference = 76786F532A27C36A00AA8DB9 /* auth_mech_fixup */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76786F622A27C62D00AA8DB9 /* test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76786F5F2A27C62D00AA8DB9 /* Sources */,\n\t\t\t\t76786F602A27C62D00AA8DB9 /* Frameworks */,\n\t\t\t\t76786F612A27C62D00AA8DB9 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = test;\n\t\t\tproductName = test;\n\t\t\tproductReference = 76786F632A27C62D00AA8DB9 /* test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76DC0A6128836EB1007C42B2 /* Sources */,\n\t\t\t\t76DC0A6228836EB1007C42B2 /* Frameworks */,\n\t\t\t\t76DC0A6328836EB1007C42B2 /* Resources */,\n\t\t\t\t766CC43629D3A3F8009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"XCreds Login Overlay\";\n\t\t\tproductName = \"XCreds Login Overlay\";\n\t\t\tproductReference = 76DC0A6528836EB1007C42B2 /* XCreds Login Overlay.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t76EE069927FD1D00009E0F3A /* XCreds */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76EE069627FD1D00009E0F3A /* Sources */,\n\t\t\t\t76EE069727FD1D00009E0F3A /* Frameworks */,\n\t\t\t\t76EE069827FD1D00009E0F3A /* Resources */,\n\t\t\t\t766CC42C29D3A3DC009BC526 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */,\n\t\t\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */,\n\t\t\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */,\n\t\t\t\t76319379287E204500D36BF7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = XCreds;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t76DD6D16285997F300A700ED /* OIDCLite */,\n\t\t\t\t76319365287D24E100D36BF7 /* ArgumentParser */,\n\t\t\t\t76319368287D24F600D36BF7 /* ArgumentParser */,\n\t\t\t\t762177E52B7144460051B756 /* OIDCLite */,\n\t\t\t\t76477E032C626B5D00F01D56 /* OIDCLite */,\n\t\t\t);\n\t\t\tproductName = xCreds;\n\t\t\tproductReference = 76EE069A27FD1D00009E0F3A /* XCreds.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t76EE069227FD1D00009E0F3A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1540;\n\t\t\t\tLastUpgradeCheck = 1330;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t760291DF2C116E450075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t760291F32C116EDB0075FBD8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\t7631935C287D22C700D36BF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t766355BC2870CA6A002E3867 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1340;\n\t\t\t\t\t};\n\t\t\t\t\t766F4C4C2883B88F0021F548 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76786F522A27C36A00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76786F622A27C62D00AA8DB9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.3;\n\t\t\t\t\t};\n\t\t\t\t\t76DC0A6428836EB1007C42B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.4.1;\n\t\t\t\t\t};\n\t\t\t\t\t76EE069927FD1D00009E0F3A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 76EE069127FD1D00009E0F3A;\n\t\t\tpackageReferences = (\n\t\t\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */,\n\t\t\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 76EE069B27FD1D00009E0F3A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t76EE069927FD1D00009E0F3A /* XCreds */,\n\t\t\t\t766355BC2870CA6A002E3867 /* XCredsLoginPlugin */,\n\t\t\t\t7631935C287D22C700D36BF7 /* authrights */,\n\t\t\t\t76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */,\n\t\t\t\t766F4C4C2883B88F0021F548 /* Send To Test */,\n\t\t\t\t76786F522A27C36A00AA8DB9 /* auth_mech_fixup */,\n\t\t\t\t76786F622A27C62D00AA8DB9 /* test */,\n\t\t\t\t760291DF2C116E450075FBD8 /* XCreds Login Autofill */,\n\t\t\t\t760291F32C116EDB0075FBD8 /* XCreds Login Password */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t760291DE2C116E450075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291E72C116E470075FBD8 /* Assets.xcassets in Resources */,\n\t\t\t\t760291EA2C116E470075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F22C116EDB0075FBD8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291FB2C116EDB0075FBD8 /* Base in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355BB2870CA6A002E3867 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76BEF8002872A3030013E2A1 /* loginwindow@2x.png in Resources */,\n\t\t\t\t766355D928711C51002E3867 /* defaults.plist in Resources */,\n\t\t\t\t7613FDF7289E114F00340CCD /* loadpage.html in Resources */,\n\t\t\t\t7659CA07298E1BB6005D1AA3 /* DefaultBackground.png in Resources */,\n\t\t\t\t766355D52870F29A002E3867 /* TestWindowController.xib in Resources */,\n\t\t\t\t76CCF5452B12E478003F85E9 /* SelectLocalAccountWindowController.xib in Resources */,\n\t\t\t\t7651EDED2A1451590075980B /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t761B486928A34CC900C6A02B /* LoginProgressWindowController.xib in Resources */,\n\t\t\t\t766CC43829D3AED2009BC526 /* errorpage.html in Resources */,\n\t\t\t\t7614D03C2B181A5D006EAF36 /* icon_128x128.png in Resources */,\n\t\t\t\t76BEF7E4287202090013E2A1 /* RestartX.png in Resources */,\n\t\t\t\t76D925D32894ADB4005C3245 /* Assets.xcassets in Resources */,\n\t\t\t\t76BEF8012872A3030013E2A1 /* loginwindow.png in Resources */,\n\t\t\t\t766355D12870EBAD002E3867 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76EECCFC2873E6E200483C66 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76BEF7E8287202AF0013E2A1 /* ShutdownX.png in Resources */,\n\t\t\t\t76FDC5D72B22D47A0035D61E /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76E466672B1A4C16006529B6 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t76C0840B2A9A311E008039FA /* ControlsViewController.xib in Resources */,\n\t\t\t\t76BEF7E5287202090013E2A1 /* RestartX@2x.png in Resources */,\n\t\t\t\t7651EDF72A1474330075980B /* LoginWebViewController.xib in Resources */,\n\t\t\t\t7677908828908E40004E7085 /* WifiWindowController.xib in Resources */,\n\t\t\t\t76DB5CF52A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t76BEF7E9287202AF0013E2A1 /* ShutdownX@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6328836EB1007C42B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A83288382D2007C42B2 /* returnArrow.png in Resources */,\n\t\t\t\t76DC0A6A28836EB2007C42B2 /* Assets.xcassets in Resources */,\n\t\t\t\t76DC0A6D28836EB2007C42B2 /* MainMenu.xib in Resources */,\n\t\t\t\t76DC0A79288370BA007C42B2 /* com.twocanoes.xcreds-overlay.plist in Resources */,\n\t\t\t\t76DC0A7428836F45007C42B2 /* RestartX@2x.png in Resources */,\n\t\t\t\t766F4C4B2883AFD90021F548 /* pleaseWaitGraphic.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069827FD1D00009E0F3A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291EF2C116E5F0075FBD8 /* XCreds Login Autofill.app in Resources */,\n\t\t\t\t76DC0A7C28837158007C42B2 /* XCreds Login Overlay.app in Resources */,\n\t\t\t\t76DB5CF42A09AE9A0014F8E1 /* get_pw.js in Resources */,\n\t\t\t\t762761602B294A7C0067D1D4 /* icon_128x128.png in Resources */,\n\t\t\t\t76CB907E288112C200C70D0C /* xcreds_login.sh in Resources */,\n\t\t\t\t76319377287E1FAF00D36BF7 /* authrights in Resources */,\n\t\t\t\t76319374287E198C00D36BF7 /* XCredsLoginPlugin.bundle in Resources */,\n\t\t\t\t76D175742B23C57500E64A62 /* LocalUsersViewController.xib in Resources */,\n\t\t\t\t76EE06B627FD1E79009E0F3A /* PreferencesWindow.xib in Resources */,\n\t\t\t\t76EE06A027FD1D01009E0F3A /* Assets.xcassets in Resources */,\n\t\t\t\t764D812F284C06AB00B3EE54 /* defaults.plist in Resources */,\n\t\t\t\t764D8133284D14A500B3EE54 /* Credits.txt in Resources */,\n\t\t\t\t7681FEC72A4C8BC800F91CD1 /* AboutWindow.xib in Resources */,\n\t\t\t\t76673CD229D3CFF900452848 /* errorpage.html in Resources */,\n\t\t\t\t764D812D284BCC7400B3EE54 /* VerifyOIDCPassword.xib in Resources */,\n\t\t\t\t76FDC5DB2B235A4F0035D61E /* StatusMenuWindowController.xib in Resources */,\n\t\t\t\t76C63A322A22872700810C53 /* History.md in Resources */,\n\t\t\t\t764D8127284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.xib in Resources */,\n\t\t\t\t76DF7FD52B50FA9A00B3B543 /* UpdatePasswordWindowController.xib in Resources */,\n\t\t\t\t7649056F2B6CADA9008B552F /* xcredsmenuItemWindowBackgroundImage.png in Resources */,\n\t\t\t\t76EE06A327FD1D01009E0F3A /* MainMenu.xib in Resources */,\n\t\t\t\t76D1756A2B23C28700E64A62 /* MainLoginWindowController.xib in Resources */,\n\t\t\t\t76EE06B227FD1E24009E0F3A /* DesktopLoginWindowController.xib in Resources */,\n\t\t\t\t7681FEC92A4CFEA200F91CD1 /* com.twocanoes.xcreds.plist in Resources */,\n\t\t\t\t76F0B6E02B421FC8008F7D71 /* loadpage.html in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t760291DC2C116E450075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760292132C11763B0075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t760292142C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t7602921C2C117B400075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760291E52C116E450075FBD8 /* ViewController.swift in Sources */,\n\t\t\t\t760292162C1176A90075FBD8 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7602921D2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t760292192C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7602920F2C1175DA0075FBD8 /* LoggerHelper.swift in Sources */,\n\t\t\t\t760291E32C116E450075FBD8 /* AppDelegate.swift in Sources */,\n\t\t\t\t760292112C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t760292172C1176BE0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t7602920E2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t760291F02C116EDB0075FBD8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760291F82C116EDB0075FBD8 /* CredentialProviderViewController.swift in Sources */,\n\t\t\t\t7602920B2C1175620075FBD8 /* PrefKeys.swift in Sources */,\n\t\t\t\t7602921B2C117B3F0075FBD8 /* PasswordUtils.swift in Sources */,\n\t\t\t\t760292072C11751E0075FBD8 /* KeychainUtil.swift in Sources */,\n\t\t\t\t760292152C1176450075FBD8 /* LogShim.swift in Sources */,\n\t\t\t\t7602921E2C117B490075FBD8 /* DSQueryable.swift in Sources */,\n\t\t\t\t7602921A2C1178090075FBD8 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t760292092C1175360075FBD8 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7602920D2C1175D20075FBD8 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t760292102C1175DA0075FBD8 /* LoggerHelper.swift in Sources */,\n\t\t\t\t760292182C1176BF0075FBD8 /* DataExtension.swift in Sources */,\n\t\t\t\t760292122C1176010075FBD8 /* UNIXUtilities.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76319359287D22C700D36BF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76319360287D22C700D36BF7 /* authrights.swift in Sources */,\n\t\t\t\t7631936D287D2A6200D36BF7 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7631936C287D29B700D36BF7 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t7631936E287D2AB100D36BF7 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76319370287DE24D00D36BF7 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t766355B92870CA6A002E3867 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7632E3A32873581100E37923 /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CCF5442B12E478003F85E9 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t76B882AB29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t54848E8F2B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76BEF7DD2871F5F00013E2A1 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76EECCFB2873DFFB00483C66 /* PasswordUtils.swift in Sources */,\n\t\t\t\t76DF50B62A1C5EFF007BC708 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t7657DEB02B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7657DEB72B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t7632E3A12873497C00E37923 /* LogShim.swift in Sources */,\n\t\t\t\t760418D52A1332520051411B /* DS+AD.swift in Sources */,\n\t\t\t\t76FDC5D62B22D47A0035D61E /* MainLoginWindowController.swift in Sources */,\n\t\t\t\t76C4BAB12B353A3A007B2C57 /* DNSResolver.m in Sources */,\n\t\t\t\t76BEF7ED28724A0C0013E2A1 /* XCredsBaseMechanism.swift in Sources */,\n\t\t\t\t766355CF2870E9E7002E3867 /* PrefKeys.swift in Sources */,\n\t\t\t\t7657DEB42B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t7657DEC42B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t760418D72A1332660051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76DF1D5B2A2AD42C00770690 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t761B486C28A3575000C6A02B /* XCredsLoginDone.swift in Sources */,\n\t\t\t\t7657DEC72B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t76BEF7F328724F120013E2A1 /* XCredsPowerControlMechanism.swift in Sources */,\n\t\t\t\t76873E302A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76B040A528EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t7632909D2876674100CF8857 /* DataExtension.swift in Sources */,\n\t\t\t\t7683973229A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t761B486A28A34CC900C6A02B /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7677908628908E40004E7085 /* WifiWindowController.swift in Sources */,\n\t\t\t\t76E466662B1A4C16006529B6 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t76EECCFD2873E9ED00483C66 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76D4726E2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t76BEF7EC28724A0B0013E2A1 /* XCredsLoginMechanism.swift in Sources */,\n\t\t\t\t766355CA2870DCF5002E3867 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76C4BAB02B353A30007B2C57 /* KlistUtil.swift in Sources */,\n\t\t\t\t76CB9078287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t766355E328713C4A002E3867 /* LoginWindow.swift in Sources */,\n\t\t\t\t76B882AF29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t\t76BEF7F82872504C0013E2A1 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t766355E6287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t766355CC2870E9AD002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t760418D92A1332770051411B /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t76673CD629D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t767B939D2A28289E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t760418D22A1332210051411B /* SignInWindowController.swift in Sources */,\n\t\t\t\t7611CEC0288B75140063A644 /* XCredsCreateUser.swift in Sources */,\n\t\t\t\t764859F22B2FA2E800507C16 /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t766355D42870F29A002E3867 /* TestWindowController.swift in Sources */,\n\t\t\t\t766355C32870CB6F002E3867 /* XCredsLoginPlugin.m in Sources */,\n\t\t\t\t766355CB2870E5E9002E3867 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t7632E39F287347C100E37923 /* XCredsKeychainAdd.swift in Sources */,\n\t\t\t\t76D1757E2B24096C00E64A62 /* MainLoginWindow.swift in Sources */,\n\t\t\t\t7677908728908E40004E7085 /* WifiManager.swift in Sources */,\n\t\t\t\t76BEF7FA28726C700013E2A1 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76BEF7E12871F74D0013E2A1 /* ControlsViewController.swift in Sources */,\n\t\t\t\t76EECD012875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t7611CEC2288B96760063A644 /* XCredsEnableFDE.swift in Sources */,\n\t\t\t\t7657DEBD2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t76EECCFE2873EA6500483C66 /* Window+Shake.swift in Sources */,\n\t\t\t\t76B882B329CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7632E3A2287357CC00E37923 /* TokenManager.swift in Sources */,\n\t\t\t\t76BEF7F628724FA80013E2A1 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EECD0528753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DECD2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t760148A92B23639D00E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD02B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t766355DB287132E9002E3867 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t7657DEDA2B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t089B22F12AFAED280006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t763AEFDF2C156E1E0059A83D /* WhitePopoverBackgroundView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F4F2A27C36A00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F5E2A27C60800AA8DB9 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76786F5A2A27C37100AA8DB9 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76786F6B2A27C79100AA8DB9 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76786F5D2A27C3B300AA8DB9 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76786F5B2A27C38800AA8DB9 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76786F562A27C36A00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76786F5F2A27C62D00AA8DB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76786F662A27C62D00AA8DB9 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76DC0A6128836EB1007C42B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76DC0A8528838467007C42B2 /* LoggerHelper.swift in Sources */,\n\t\t\t\t76DC0A7328836EFE007C42B2 /* TCSReturnWindow.m in Sources */,\n\t\t\t\t76DC0A88288387D8007C42B2 /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76DC0A8428838375007C42B2 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t76DC0A8628838656007C42B2 /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t76DC0A7E288376BC007C42B2 /* TCSXCredsLoginOverlayWindow.swift in Sources */,\n\t\t\t\t767C42842AC6645700542099 /* AuthRightsHelper.swift in Sources */,\n\t\t\t\t76DC0A87288386FA007C42B2 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76C4BABC2B3544C6007B2C57 /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76DC0A6828836EB1007C42B2 /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t76EE069627FD1D00009E0F3A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t760148AA2B2365F100E119A2 /* NSBundle+FindBundlePath.swift in Sources */,\n\t\t\t\t76E74DD32B390358004C6429 /* LoginWebViewController.swift in Sources */,\n\t\t\t\t089B22F22AFAED810006B6BC /* NetworkMonitor.swift in Sources */,\n\t\t\t\t76EECD0228752C1F00483C66 /* LoginWindow.swift in Sources */,\n\t\t\t\t76673CD529D3D5F500452848 /* LicenseChecker.swift in Sources */,\n\t\t\t\t761121B82B3D26F5005F7D02 /* LocalCheckAndMigrate.swift in Sources */,\n\t\t\t\t76E74DD22B39034B004C6429 /* SelectLocalAccountWindowController.swift in Sources */,\n\t\t\t\t767116A7284AABC500CCD6FF /* NotifyManager.swift in Sources */,\n\t\t\t\t76EE06B827FD1EB7009E0F3A /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t76A8A4E32A0DF7C700AA6054 /* NSTaskWrapper.swift in Sources */,\n\t\t\t\t76EE06AE27FD1DC3009E0F3A /* PrefKeys.swift in Sources */,\n\t\t\t\t767116B3284B045800CCD6FF /* KeychainUtil.swift in Sources */,\n\t\t\t\t76CB907B2880E41E00C70D0C /* LogShim.swift in Sources */,\n\t\t\t\t7657DEC92B350606003A23DB /* KlistUtil.swift in Sources */,\n\t\t\t\t764D812C284BCC7400B3EE54 /* VerifyOIDCPasswordWindowController.swift in Sources */,\n\t\t\t\t76E74DD42B39037A004C6429 /* LoginProgressWindowController.swift in Sources */,\n\t\t\t\t7623384D2B53029D00F2D714 /* ShareMounter.swift in Sources */,\n\t\t\t\t7657DEB32B350476003A23DB /* NoMADSession.swift in Sources */,\n\t\t\t\t760418E02A133A370051411B /* DSQueryable.swift in Sources */,\n\t\t\t\t76319373287E18BF00D36BF7 /* DataExtension.swift in Sources */,\n\t\t\t\t76E74DD12B390327004C6429 /* ContextAndHintHandling.swift in Sources */,\n\t\t\t\t76EECD002875135900483C66 /* LoggerHelper.swift in Sources */,\n\t\t\t\t54848E902B47336D000DF420 /* KerbUtil.m in Sources */,\n\t\t\t\t76873E2F2A107736001418A9 /* DefaultsHelper.swift in Sources */,\n\t\t\t\t76D175772B23C62A00E64A62 /* UpdatePasswordWindowController.swift in Sources */,\n\t\t\t\t7683973129A854EC003D9B9F /* NSImage+String.swift in Sources */,\n\t\t\t\t76FDC5DA2B235A4F0035D61E /* StatusMenuWindowController.swift in Sources */,\n\t\t\t\t761121B92B3D26FB005F7D02 /* DS+AD.swift in Sources */,\n\t\t\t\t76CB9077287FBEEA00C70D0C /* Helper+URLDecode.swift in Sources */,\n\t\t\t\t764D8129284BCAB100B3EE54 /* Window+Shake.swift in Sources */,\n\t\t\t\t764D8126284BC1C300B3EE54 /* VerifyLocalPasswordWindowController.swift in Sources */,\n\t\t\t\t76EE069E27FD1D00009E0F3A /* AppDelegate.swift in Sources */,\n\t\t\t\t76D7ADFB284EB15100332EBC /* TCSUnifiedLogger.m in Sources */,\n\t\t\t\t7657DEBC2B35055F003A23DB /* Logger.swift in Sources */,\n\t\t\t\t7657DEB62B3504A6003A23DB /* UserRecord.swift in Sources */,\n\t\t\t\t761121B62B3D24FE005F7D02 /* SignInWindowController.swift in Sources */,\n\t\t\t\t761121B72B3D26EE005F7D02 /* SystemInfoHelper.swift in Sources */,\n\t\t\t\t7657DEAF2B3503BF003A23DB /* SessionManager.swift in Sources */,\n\t\t\t\t7681FEC52A4C8B9000F91CD1 /* AboutWindowController.swift in Sources */,\n\t\t\t\t768633D92AFC4908004065E5 /* WifiManager.swift in Sources */,\n\t\t\t\t7657DED92B351B5B003A23DB /* UNIXUtilities.swift in Sources */,\n\t\t\t\t76E74DCF2B3902F0004C6429 /* XCredsMechanismProtocol.swift in Sources */,\n\t\t\t\t76EE06C227FD1F50009E0F3A /* StatusMenuController.swift in Sources */,\n\t\t\t\t76EE06B027FD1DD8009E0F3A /* Window+ForceToFront.swift in Sources */,\n\t\t\t\t76D4726D2B43B8FB0064380C /* TCTaskWrapperWithBlocks.m in Sources */,\n\t\t\t\t767116B1284B021500CCD6FF /* MainController.swift in Sources */,\n\t\t\t\t7657DECC2B35061E003A23DB /* SiteManager.swift in Sources */,\n\t\t\t\t76B040A428EFC788002A289B /* Helper+JWTDecode.swift in Sources */,\n\t\t\t\t767116A9284AAE2B00CCD6FF /* ScheduleManager.swift in Sources */,\n\t\t\t\t766FD60D2A1B06AC00C8F244 /* DefaultsOverride.swift in Sources */,\n\t\t\t\t767116AC284AB4C000CCD6FF /* PasswordUtils.swift in Sources */,\n\t\t\t\t76B882AA29CCFD7A00BB8186 /* TCSKeychain.m in Sources */,\n\t\t\t\t766355E5287148C1002E3867 /* Tokens.swift in Sources */,\n\t\t\t\t7657DEC32B3505CB003A23DB /* ADLDAPPing.swift in Sources */,\n\t\t\t\t76EE06AC27FD1D92009E0F3A /* TokenManager.swift in Sources */,\n\t\t\t\t76B882B229CCFDBA00BB8186 /* NSData+HexString.m in Sources */,\n\t\t\t\t7623384C2B53029D00F2D714 /* ShareMounterMenu.swift in Sources */,\n\t\t\t\t7657DEC02B3505A3003A23DB /* DNSResolver.m in Sources */,\n\t\t\t\t76E9CE702A0DC6E30060220C /* TCSLoginWindowUtilities.m in Sources */,\n\t\t\t\t76342E5A2B282653007D4F29 /* DesktopLoginWindowController.swift in Sources */,\n\t\t\t\t76D7ADFE284EB18600332EBC /* NSFileManager+TCSRealHomeFolder.m in Sources */,\n\t\t\t\t76EECD0428753C7F00483C66 /* String+Base64URLEncoded.swift in Sources */,\n\t\t\t\t7657DEC62B3505EB003A23DB /* Extensions.swift in Sources */,\n\t\t\t\t766355DC287133C7002E3867 /* WebViewController.swift in Sources */,\n\t\t\t\t76D175712B23C2DB00E64A62 /* AuthorizationDBManager.swift in Sources */,\n\t\t\t\t767B939C2A28279E0038935E /* View+Shake.swift in Sources */,\n\t\t\t\t76B882AE29CCFDAE00BB8186 /* NSData+SHA1.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t760291FF2C116EDB0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291F32C116EDB0075FBD8 /* XCreds Login Password */;\n\t\t\ttargetProxy = 760291FE2C116EDB0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t760292062C116EEE0075FBD8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 760291DF2C116E450075FBD8 /* XCreds Login Autofill */;\n\t\t\ttargetProxy = 760292052C116EEE0075FBD8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319376287E19A500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 766355BC2870CA6A002E3867 /* XCredsLoginPlugin */;\n\t\t\ttargetProxy = 76319375287E19A500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76319379287E204500D36BF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7631935C287D22C700D36BF7 /* authrights */;\n\t\t\ttargetProxy = 76319378287E204500D36BF7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t76DC0A7B28837152007C42B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 76DC0A6428836EB1007C42B2 /* XCreds Login Overlay */;\n\t\t\ttargetProxy = 76DC0A7A28837152007C42B2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t760291E82C116E470075FBD8 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291E92C116E470075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t760291F92C116EDB0075FBD8 /* CredentialProviderViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t760291FA2C116EDB0075FBD8 /* Base */,\n\t\t\t);\n\t\t\tname = CredentialProviderViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76DC0A6B28836EB2007C42B2 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76DC0A6C28836EB2007C42B2 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t76EE06A127FD1D01009E0F3A /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t76EE06A227FD1D01009E0F3A /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t760291ED2C116E470075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760291EE2C116E470075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill/XCreds_AutoFill.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t760292022C116EDB0075FBD8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"AUTOFILL_TARGET=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t760292032C116EDB0075FBD8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds AutoFill Extension/XCreds_AutoFill_Extension.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"AUTOFILL_TARGET=1\";\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds AutoFill Extension/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"XCreds AutoFill Extension\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@executable_path/../../../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.xcreds.XCreds-AutoFill.XCreds-AutoFill-Extension\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76319361287D22C700D36BF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76319362287D22C700D36BF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766355BE2870CA6A002E3867 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766355BF2870CA6A002E3867 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCredsLoginPlugin/Info.plist;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = \"\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.XCredsLoginPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCredsLoginPlugin-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t766F4C4E2883B88F0021F548 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEBUGGING_SYMBOLS = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tGCC_GENERATE_DEBUGGING_SYMBOLS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t766F4C4F2883B88F0021F548 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F582A27C36A00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F592A27C36A00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"auth_mech_fixup/auth_mech_fixup-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76786F682A27C62D00AA8DB9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76786F692A27C62D00AA8DB9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.3;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76DC0A7028836EB2007C42B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76DC0A7128836EB2007C42B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"XCreds Login Overlay/XCreds_Login_Overlay.entitlements\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"XCreds-Login-Overlay-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.twocanoes.XCreds-Login-Overlay\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A527FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A627FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t76EE06A827FD1D01009E0F3A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t76EE06A927FD1D01009E0F3A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = XCreds/xCreds.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 7144;\n\t\t\t\tDEVELOPMENT_TEAM = UXP6YEHSPW;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SRCROOT)/Carthage/Build/Mac\\\"\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = headers;\n\t\t\t\tINFOPLIST_FILE = XCreds/Info.plist;\n\t\t\t\tINFOPLIST_KEY_LSUIElement = YES;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"© 2022 Twocanoes Software, Inc\";\n\t\t\t\tINFOPLIST_KEY_NSMainNibFile = MainMenu;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMARKETING_VERSION = 5.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.twocanoes.xcreds;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"XCreds/XCreds-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t760291EC2C116E470075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Autofill\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760291ED2C116E470075FBD8 /* Debug */,\n\t\t\t\t760291EE2C116E470075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t760292012C116EDB0075FBD8 /* Build configuration list for PBXNativeTarget \"XCreds Login Password\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t760292022C116EDB0075FBD8 /* Debug */,\n\t\t\t\t760292032C116EDB0075FBD8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76319363287D22C700D36BF7 /* Build configuration list for PBXNativeTarget \"authrights\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76319361287D22C700D36BF7 /* Debug */,\n\t\t\t\t76319362287D22C700D36BF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766355C02870CA6A002E3867 /* Build configuration list for PBXNativeTarget \"XCredsLoginPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766355BE2870CA6A002E3867 /* Debug */,\n\t\t\t\t766355BF2870CA6A002E3867 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t766F4C4D2883B88F0021F548 /* Build configuration list for PBXLegacyTarget \"Send To Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t766F4C4E2883B88F0021F548 /* Debug */,\n\t\t\t\t766F4C4F2883B88F0021F548 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F572A27C36A00AA8DB9 /* Build configuration list for PBXNativeTarget \"auth_mech_fixup\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F582A27C36A00AA8DB9 /* Debug */,\n\t\t\t\t76786F592A27C36A00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76786F672A27C62D00AA8DB9 /* Build configuration list for PBXNativeTarget \"test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76786F682A27C62D00AA8DB9 /* Debug */,\n\t\t\t\t76786F692A27C62D00AA8DB9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76DC0A6F28836EB2007C42B2 /* Build configuration list for PBXNativeTarget \"XCreds Login Overlay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76DC0A7028836EB2007C42B2 /* Debug */,\n\t\t\t\t76DC0A7128836EB2007C42B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE069527FD1D00009E0F3A /* Build configuration list for PBXProject \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A527FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A627FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76EE06A727FD1D01009E0F3A /* Build configuration list for PBXNativeTarget \"XCreds\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t76EE06A827FD1D01009E0F3A /* Debug */,\n\t\t\t\t76EE06A927FD1D01009E0F3A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/apple/swift-argument-parser.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 1.0.0;\n\t\t\t};\n\t\t};\n\t\t76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/twocanoes/OIDCLite.git\";\n\t\t\trequirement = {\n\t\t\t\tbranch = main;\n\t\t\t\tkind = branch;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t762177E52B7144460051B756 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76319365287D24E100D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76319368287D24F600D36BF7 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76477E032C626B5D00F01D56 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76477E022C626B5D00F01D56 /* XCRemoteSwiftPackageReference \"OIDCLite\" */;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t766355CD2870E9D3002E3867 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E02A12FAF900529D90 /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n\t\t76AB89E22A12FB4900529D90 /* ArgumentParser */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 76319364287D24E100D36BF7 /* XCRemoteSwiftPackageReference \"swift-argument-parser\" */;\n\t\t\tproductName = ArgumentParser;\n\t\t};\n\t\t76DD6D16285997F300A700ED /* OIDCLite */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = OIDCLite;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 76EE069227FD1D00009E0F3A /* Project object */;\n}\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/Send To Test.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <PostActions>\n         <ExecutionAction\n            ActionType = \"Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction\">\n            <ActionContent\n               title = \"Run Script\"\n               scriptText = \"touch /tmp/xcreds_done&#10;\">\n            </ActionContent>\n         </ExecutionAction>\n      </PostActions>\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n               BuildableName = \"XCreds.app\"\n               BlueprintName = \"XCreds\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"766F4C4C2883B88F0021F548\"\n               BuildableName = \"Send To Test\"\n               BlueprintName = \"Send To Test\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <PathRunnable\n         runnableDebuggingMode = \"0\"\n         FilePath = \"/usr/bin/true\">\n      </PathRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"766F4C4C2883B88F0021F548\"\n            BuildableName = \"Send To Test\"\n            BlueprintName = \"Send To Test\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCreds Login Autofill.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\"\n      buildArchitectures = \"Automatic\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n               BuildableName = \"XCreds Login Autofill.app\"\n               BlueprintName = \"XCreds Login Autofill\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      shouldAutocreateTestPlan = \"YES\">\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n            BuildableName = \"XCreds Login Autofill.app\"\n            BlueprintName = \"XCreds Login Autofill\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <CommandLineArguments>\n         <CommandLineArgument\n            argument = \"-r\"\n            isEnabled = \"YES\">\n         </CommandLineArgument>\n      </CommandLineArguments>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n            BuildableName = \"XCreds Login Autofill.app\"\n            BlueprintName = \"XCreds Login Autofill\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCreds Login Overlay.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76DC0A6428836EB1007C42B2\"\n               BuildableName = \"XCreds Login Overlay.app\"\n               BlueprintName = \"XCreds Login Overlay\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      debugAsWhichUser = \"root\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76DC0A6428836EB1007C42B2\"\n            BuildableName = \"XCreds Login Overlay.app\"\n            BlueprintName = \"XCreds Login Overlay\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76DC0A6428836EB1007C42B2\"\n            BuildableName = \"XCreds Login Overlay.app\"\n            BlueprintName = \"XCreds Login Overlay\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCreds Login Password.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   wasCreatedForAppExtension = \"YES\"\n   version = \"2.0\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\"\n      buildArchitectures = \"Automatic\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"760291F32C116EDB0075FBD8\"\n               BuildableName = \"XCreds Login Password.appex\"\n               BlueprintName = \"XCreds Login Password\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n               BuildableName = \"XCreds Login Autofill.app\"\n               BlueprintName = \"XCreds Login Autofill\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n               BuildableName = \"XCreds.app\"\n               BlueprintName = \"XCreds\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      shouldAutocreateTestPlan = \"YES\">\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      launchStyle = \"0\"\n      askForAppToLaunch = \"Yes\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n            BuildableName = \"XCreds Login Autofill.app\"\n            BlueprintName = \"XCreds Login Autofill\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      askForAppToLaunch = \"Yes\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"760291DF2C116E450075FBD8\"\n            BuildableName = \"XCreds Login Autofill.app\"\n            BlueprintName = \"XCreds Login Autofill\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCreds.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <PreActions>\n         <ExecutionAction\n            ActionType = \"Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction\">\n            <ActionContent\n               title = \"Run Script\"\n               scriptText = \"&#10;#cd &quot;${PROJECT_DIR}&quot; ; agvtool bump&#10;\">\n               <EnvironmentBuildable>\n                  <BuildableReference\n                     BuildableIdentifier = \"primary\"\n                     BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n                     BuildableName = \"XCreds.app\"\n                     BlueprintName = \"XCreds\"\n                     ReferencedContainer = \"container:xCreds.xcodeproj\">\n                  </BuildableReference>\n               </EnvironmentBuildable>\n            </ActionContent>\n         </ExecutionAction>\n      </PreActions>\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n               BuildableName = \"XCreds.app\"\n               BlueprintName = \"XCreds\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"NO\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n            BuildableName = \"XCreds.app\"\n            BlueprintName = \"XCreds\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <CommandLineArguments>\n         <CommandLineArgument\n            argument = \"status\"\n            isEnabled = \"NO\">\n         </CommandLineArgument>\n         <CommandLineArgument\n            argument = \"rfid-listener --reader-name &quot;Feitian R502 Contactless Reader&quot;\"\n            isEnabled = \"NO\">\n         </CommandLineArgument>\n      </CommandLineArguments>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n            BuildableName = \"XCreds.app\"\n            BlueprintName = \"XCreds\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCredsLoginPlugin.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"2.0\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"766355BC2870CA6A002E3867\"\n               BuildableName = \"XCredsLoginPlugin.bundle\"\n               BlueprintName = \"XCredsLoginPlugin\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      disableMainThreadChecker = \"YES\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"NO\"\n      debugXPCServices = \"NO\"\n      debugServiceExtension = \"internal\"\n      enableGPUValidationMode = \"1\"\n      allowLocationSimulation = \"NO\"\n      viewDebuggingEnabled = \"No\"\n      queueDebuggingEnabled = \"No\"\n      GPUProfilerEnabled = \"No\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76BEF7D12871F36C0013E2A1\"\n            BuildableName = \"FakeTrue\"\n            BlueprintName = \"FakeTrue\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"766355BC2870CA6A002E3867\"\n            BuildableName = \"XCredsLoginPlugin.bundle\"\n            BlueprintName = \"XCredsLoginPlugin\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/XCredsLoginPlugin_TestDeploy.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <PostActions>\n         <ExecutionAction\n            ActionType = \"Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction\">\n            <ActionContent\n               title = \"Run Script\"\n               scriptText = \"if [ -e &quot;${PROJECT_DIR}/push_to_test.sh&quot; ]; then&#10; echo &quot;sending to testing machine&quot;&#10; &quot;${PROJECT_DIR}/push_to_test.sh&quot;&#10;fi&#10;\">\n               <EnvironmentBuildable>\n                  <BuildableReference\n                     BuildableIdentifier = \"primary\"\n                     BlueprintIdentifier = \"766355BC2870CA6A002E3867\"\n                     BuildableName = \"XCredsLoginPlugin.bundle\"\n                     BlueprintName = \"XCredsLoginPlugin\"\n                     ReferencedContainer = \"container:xCreds.xcodeproj\">\n                  </BuildableReference>\n               </EnvironmentBuildable>\n            </ActionContent>\n         </ExecutionAction>\n      </PostActions>\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"766355BC2870CA6A002E3867\"\n               BuildableName = \"XCredsLoginPlugin.bundle\"\n               BlueprintName = \"XCredsLoginPlugin\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"766355BC2870CA6A002E3867\"\n            BuildableName = \"XCredsLoginPlugin.bundle\"\n            BlueprintName = \"XCredsLoginPlugin\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/authrights.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7631935C287D22C700D36BF7\"\n               BuildableName = \"authrights\"\n               BlueprintName = \"authrights\"\n               ReferencedContainer = \"container:xCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7631935C287D22C700D36BF7\"\n            BuildableName = \"authrights\"\n            BlueprintName = \"authrights\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <CommandLineArguments>\n         <CommandLineArgument\n            argument = \"-p\"\n            isEnabled = \"YES\">\n         </CommandLineArgument>\n      </CommandLineArguments>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7631935C287D22C700D36BF7\"\n            BuildableName = \"authrights\"\n            BlueprintName = \"authrights\"\n            ReferencedContainer = \"container:xCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcshareddata/xcschemes/xcredstap.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1640\"\n   wasCreatedForAppExtension = \"YES\"\n   version = \"2.0\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\"\n      buildArchitectures = \"Automatic\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76A247522C22747400859E0A\"\n               BuildableName = \"xcredstap.appex\"\n               BlueprintName = \"xcredstap\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n               BuildableName = \"XCreds.app\"\n               BlueprintName = \"XCreds\"\n               ReferencedContainer = \"container:XCreds.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      shouldAutocreateTestPlan = \"YES\">\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      launchStyle = \"0\"\n      askForAppToLaunch = \"Yes\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n            BuildableName = \"XCreds.app\"\n            BlueprintName = \"XCreds\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      askForAppToLaunch = \"Yes\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"76EE069927FD1D00009E0F3A\"\n            BuildableName = \"XCreds.app\"\n            BlueprintName = \"XCreds\"\n            ReferencedContainer = \"container:XCreds.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcuserdata/tperfitt.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"94C20054-8AB3-42DB-93A7-A3026166D6FC\"\n   type = \"1\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"5A3FC6C3-9F07-44DA-817E-062BA7D37EDB\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"XCreds/ScheduleManager.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"264\"\n            endingLineNumber = \"264\"\n            landmarkName = \"checkToken()\"\n            landmarkType = \"7\">\n            <Locations>\n               <Location\n                  uuid = \"5A3FC6C3-9F07-44DA-817E-062BA7D37EDB - 80aca8af637cf0fb\"\n                  shouldBeEnabled = \"Yes\"\n                  ignoreCount = \"0\"\n                  continueAfterRunningActions = \"No\"\n                  symbolName = \"XCreds.ScheduleManager.checkToken() -&gt; ()\"\n                  moduleName = \"XCreds.debug.dylib\"\n                  usesParentBreakpointCondition = \"Yes\"\n                  urlString = \"file:///Users/tperfitt/Documents/Projects/xcreds/XCreds/ScheduleManager.swift\"\n                  startingColumnNumber = \"9223372036854775807\"\n                  endingColumnNumber = \"9223372036854775807\"\n                  startingLineNumber = \"264\"\n                  endingLineNumber = \"264\">\n               </Location>\n               <Location\n                  uuid = \"5A3FC6C3-9F07-44DA-817E-062BA7D37EDB - c6bb1dca349dbca\"\n                  shouldBeEnabled = \"Yes\"\n                  ignoreCount = \"0\"\n                  continueAfterRunningActions = \"No\"\n                  symbolName = \"function signature specialization &lt;Arg[2] = Value Promoted from Box&gt; of closure #1 () async -&gt; () in XCreds.ScheduleManager.checkToken() -&gt; ()\"\n                  moduleName = \"XCreds.debug.dylib\"\n                  usesParentBreakpointCondition = \"Yes\"\n                  urlString = \"file:///Users/tperfitt/Documents/Projects/xcreds/XCreds/ScheduleManager.swift\"\n                  startingColumnNumber = \"9223372036854775807\"\n                  endingColumnNumber = \"9223372036854775807\"\n                  startingLineNumber = \"264\"\n                  endingLineNumber = \"264\">\n               </Location>\n            </Locations>\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"E0F90A55-252A-4767-8677-B1FD60A8F44D\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"XCreds/ScheduleManager.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"192\"\n            endingLineNumber = \"192\"\n            landmarkName = \"checkToken()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"D9E2E132-C208-4589-A8FC-A4EF409621AC\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"XCreds/ScheduleManager.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"147\"\n            endingLineNumber = \"147\"\n            landmarkName = \"startCredentialCheck()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"FE445C2D-3408-4EF8-AD4A-9AC2EBF88779\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"XCreds/MainController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"101\"\n            endingLineNumber = \"101\"\n            landmarkName = \"init(passwordCheckTimer:feedbackDelegate:cloudPasswordExpires:adPasswordExpires:nextPasswordCheck:credentialStatus:hasCredential:signInViewController:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "XCreds.xcodeproj/xcuserdata/tperfitt.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>FileVaultLoginHelper.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>10</integer>\n\t\t</dict>\n\t\t<key>FilevaultLoginHelper.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>11</integer>\n\t\t</dict>\n\t\t<key>Send To Test.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>5</integer>\n\t\t</dict>\n\t\t<key>XCreds AutoFill Extension.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>10</integer>\n\t\t</dict>\n\t\t<key>XCreds AutoFill.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>9</integer>\n\t\t</dict>\n\t\t<key>XCreds Login Autofill.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>6</integer>\n\t\t</dict>\n\t\t<key>XCreds Login Overlay.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>4</integer>\n\t\t</dict>\n\t\t<key>XCreds Login Password.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>7</integer>\n\t\t</dict>\n\t\t<key>XCreds.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<key>XCredsLoginPlugin.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<key>XCredsLoginPlugin_TestDeploy.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<key>auth_mech_fixup.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>9</integer>\n\t\t</dict>\n\t\t<key>authrights.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<key>tapgo.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>9</integer>\n\t\t</dict>\n\t\t<key>xcredstap.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>8</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>760291DF2C116E450075FBD8</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>760291F32C116EDB0075FBD8</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>7631935C287D22C700D36BF7</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>766355BC2870CA6A002E3867</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>766F4C4C2883B88F0021F548</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>76A247522C22747400859E0A</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>76BEF7D12871F36C0013E2A1</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>76DC0A6428836EB1007C42B2</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>76EE069927FD1D00009E0F3A</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCredsLoginPlugIn/Bundle.swift",
    "content": "//\n//  Bundle.swift\n//  NoMADLoginAD\n//\n//  Created by Joel Rennich on 3/31/20.\n//  Copyright © 2020 Orchard & Grove. All rights reserved.\n//\n\nextension Bundle {\n    static var mainLogin: Bundle {\n        return Bundle(for: XCredsLoginPlugin.self)\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/ContextAndHintHandling.swift",
    "content": "//\n//  ContextAndHintHandling.swift\n//  NoMADLoginAD\n//\n//  Created by Josh Wisenbaker on 12/18/17.\n//  Copyright © 2017 NoMAD. All rights reserved.\n//\n\nenum HintType: String,CaseIterable {\n    case uid\n    case gid\n    case longname\n    case shell\n    case authorizeright = \"authorize-right\"\n    case authorize_rule = \"authorize-rule\"\n    case client_path = \"client-path\"\n    case client_pid =  \"client-pid\"\n    case client_type = \"client-type\"\n    case client_uid = \"client-uid\"\n    case tries\n    case suggested_user = \"suggested-user\"\n    case require_user_in_group = \"require-user-in-group\"\n    case reason\n    case token_name = \"token-name\"\n    case afp_dir\n    case kerberos_principal = \"kerberos-principal\"\n    case mountpoint\n    case new_password\n    case show_add_to_keychain = \"show-add-to-keychain\"\n    case add_to_keuychain = \"add-to-keuychain\"\n    case Home_Dir_Mount_Result\n    case homeDirType\n    case noMADUser\n    case noMADFirst\n    case noMADLast\n    case noMADFull\n    case username\n    case ap_pam_service_name = \"ap-pam-service-name\"\n    case ctk\n    case ap_user_name = \"ap-user-name\"\n    case password\n    case authenticated_token_id = \"authenticated-token-id\"\n    case ap_token\n    case hsh\n    case uti\n    case uth\n    case apsso_kcp = \"apsso-kcp\"\n    case apsso_up = \"apsso-up\"\n    case userSecretTriesLeft\n    case noMADDomain\n    case tokens\n    case passwordOverwrite // stomp on the password\n    case ntName\n    case aliasName\n    case claimsToAddToLocalUserAccount\n    case adUserAttributesToAddToLocalUserAccount\n    case guestUser\n    case existingLocalUserPassword\n    case existingLocalUserName\n    case networkSignIn\n    case user\n    case fullusername\n    case domain\n    case pass\n    case firstName\n    case lastName\n    case fullName\n    case groups\n    case rfidUsers\n    case rfidEnabled\n    case localAdmin\n    case rfidUid\n    case localLogin\n    case allADAttributes\n    case rfidPIN\n    case oidcLastLoginTimestamp\n    case isAccountCreationPending\n\n\n}\n\n// attribute statics\n\nlet kODAttributeADUser = \"dsAttrTypeStandard:ADUser\"\nlet kODAttributeNetworkSignIn = \"dsAttrTypeStandard:NetworkSignIn\"\n\nprotocol ContextAndHintHandling {\n    var mech: MechanismRecord? {get}\n    func setContextString(type: String, value: String)\n    func setHint(type: HintType, hint: NSSecureCoding)\n    func getContextString(type: String) -> String?\n    func getHint(type: HintType) -> Any?\n}\n//extension ContextAndHintHandling {\n//    /// Set a NoMAD Login Authorization mechanism hint.\n//    ///\n//    /// - Parameters:\n//    ///   - type: A value from `HintType` representing the NoMad Login value to set.\n//    ///   - hint: The hint value to set. Can be `String` or `[String]`\n//    func setHint(type: HintType, hint: Any) {\n//        TCSLogWithMark()\n//        guard (hint is String || hint is [String] || hint is Bool) else {\n////            os_log(\"NoMAD Login Set hint failed: data type of hint is not supported\", log: uiLog, type: .debug)\n//            return\n//        }\n//        TCSLogWithMark()\n//        let data = NSKeyedArchiver.archivedData(withRootObject: hint)\n//        TCSLogWithMark()\n//        var value = AuthorizationValue(length: data.count, data: UnsafeMutableRawPointer(mutating: (data as NSData).bytes.bindMemory(to: Void.self, capacity: data.count)))\n//        TCSLogWithMark()\n//        let err = (mech?.fPlugin.pointee.fCallbacks.pointee.SetHintValue((mech?.fEngine)!, type.rawValue, &value))!\n//        TCSLogWithMark()\n//        guard err == errSecSuccess else {\n////            os_log(\"NoMAD Login Set hint failed with: %{public}@\", log: uiLog, type: .debug, err)\n//            return\n//        }\n//    }\n//\n//    func getHint(type: HintType) -> Any? {\n//        var value : UnsafePointer<AuthorizationValue>? = nil\n//        var err: OSStatus = noErr\n//        err = (mech?.fPlugin.pointee.fCallbacks.pointee.GetHintValue((mech?.fEngine)!, type.rawValue, &value))!\n//        if err != errSecSuccess {\n////            os_log(\"Couldn't retrieve hint value: %{public}@\", log: uiLog, type: .debug, type.rawValue)\n//            return nil\n//        }\n//        let outputdata = Data.init(bytes: value!.pointee.data!, count: value!.pointee.length)\n//        guard let result = NSKeyedUnarchiver.unarchiveObject(with: outputdata)\n//            else {\n////                os_log(\"Couldn't unpack hint value: %{public}@\", log: uiLog, type: .debug, type.rawValue)\n//                return nil\n//        }\n//        return result\n//    }\n//\n//    /// Set one of the known `AuthorizationTags` values to be used during mechanism evaluation.\n//    ///\n//    /// - Parameters:\n//    ///   - type: A `String` constant from AuthorizationTags.h representing the value to set.\n//    ///   - value: A `String` value of the context value to set.\n//    func setContextString(type: String, value: String) {\n//        let tempdata = value + \"\\0\"\n//        let data = tempdata.data(using: .utf8)\n//        var value = AuthorizationValue(length: (data?.count)!, data: UnsafeMutableRawPointer(mutating: (data! as NSData).bytes.bindMemory(to: Void.self, capacity: (data?.count)!)))\n//        let err = (mech?.fPlugin.pointee.fCallbacks.pointee.SetContextValue((mech?.fEngine)!, type, .extractable, &value))!\n//        guard err == errSecSuccess else {\n////            os_log(\"Set context value failed with: %{public}@\", log: uiLog, type: .debug, err)\n//            return\n//        }\n//    }\n//\n//    func getContextString(type: String) -> String? {\n//        var value: UnsafePointer<AuthorizationValue>?\n//        var flags = AuthorizationContextFlags()\n//        let err = mech?.fPlugin.pointee.fCallbacks.pointee.GetContextValue((mech?.fEngine)!, type, &flags, &value)\n//        if err != errSecSuccess {\n////            os_log(\"Couldn't retrieve context value: %{public}@\", log: uiLog, type: .debug, type)\n//            return nil\n//        }\n//        if type == \"longname\" {\n//            return String.init(bytesNoCopy: value!.pointee.data!, length: value!.pointee.length, encoding: .utf8, freeWhenDone: false)\n//        } else {\n//            let item = Data.init(bytes: value!.pointee.data!, count: value!.pointee.length)\n////            os_log(\"get context error: %{public}@\", log: uiLog, type: .debug, item.description)\n//        }\n//\n//        return nil\n//    }\n//}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LogFileName</key>\n\t<string>xcreds.log</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginProgressWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"LoginProgressWindowController\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"backgroundImageView\" destination=\"05Z-Sh-7T1\" id=\"bJ2-iT-sLd\"/>\n                <outlet property=\"progressIndicator\" destination=\"ZHu-Z8-wsF\" id=\"ylp-Zh-yTv\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" titleVisibility=\"hidden\" id=\"F0z-JX-Cv5\">\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"05Z-Sh-7T1\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"axesIndependently\" id=\"nup-Ni-MvK\"/>\n                    </imageView>\n                    <progressIndicator maxValue=\"100\" indeterminate=\"YES\" style=\"spinning\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZHu-Z8-wsF\">\n                        <rect key=\"frame\" x=\"224\" y=\"119\" width=\"32\" height=\"32\"/>\n                    </progressIndicator>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"05Z-Sh-7T1\" secondAttribute=\"bottom\" id=\"7Q8-4b-Aed\"/>\n                    <constraint firstItem=\"ZHu-Z8-wsF\" firstAttribute=\"centerY\" secondItem=\"se5-gp-TjO\" secondAttribute=\"centerY\" id=\"7rU-8b-Pld\"/>\n                    <constraint firstItem=\"05Z-Sh-7T1\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" id=\"E0R-e7-hfb\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"05Z-Sh-7T1\" secondAttribute=\"trailing\" id=\"JNy-M3-TSt\"/>\n                    <constraint firstItem=\"05Z-Sh-7T1\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" id=\"NnE-Tv-ppE\"/>\n                    <constraint firstItem=\"ZHu-Z8-wsF\" firstAttribute=\"centerX\" secondItem=\"se5-gp-TjO\" secondAttribute=\"centerX\" id=\"Yw8-9U-bew\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"142\" y=\"144\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/AuthorizationDBManager.swift",
    "content": "//\n//  AuthorizationDBManager.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/3/22.\n//\n\nimport Foundation\nimport Security.AuthorizationDB\n\nclass AuthorizationDBManager: NSObject {\n    static let shared = AuthorizationDBManager()\n    private func getAuth() -> AuthorizationRef? {\n        if NSUserName() != \"root\" {\n            print(\"Not Running as root, please execute with sudo privilege to do this function\")\n            exit(1)\n        }\n        var authRef : AuthorizationRef? = nil\n        let err = AuthorizationCreate(nil, nil, AuthorizationFlags(rawValue: 0), &authRef)\n\n        if err != noErr {\n\n            TCSLogErrorWithMark(\"error getting rights to write authdb\")\n            return nil\n        }\n        return authRef!\n    }\n    func rightsInfo() -> Dictionary<String,Any>? {\n        var rightsInfo: CFDictionary?\n\n        let err = AuthorizationRightGet(\"system.login.console\", &rightsInfo)\n\n        if err != noErr {\n            TCSLogErrorWithMark(\"error getting right\")\n            return nil\n        }\n        let rightInfo = rightsInfo as? Dictionary<String, Any>\n\n        return rightInfo\n    }\n    func consoleRights() -> Array <String> {\n\n        guard let rightInfo = rightsInfo() else {\n            TCSLogErrorWithMark(\"error getting rightsInfo\")\n\n            return []\n        }\n\n        guard let rightsArray = rightInfo[\"mechanisms\"] else{\n            TCSLogErrorWithMark(\"error getting mechanisms\")\n\n            return []\n        }\n        guard let rightsArray = rightsArray as? Array<String> else {\n            TCSLogErrorWithMark(\"error getting rightsArray\")\n\n            return []\n\n        }\n        return rightsArray\n    }\n    func setConsoleRights(rights:Array<String>) -> Bool {\n\n        var rightInfo: CFDictionary?\n        let err = AuthorizationRightGet(\"system.login.console\", &rightInfo)\n\n        if err != noErr {\n            TCSLogErrorWithMark(\"error AuthorizationRightGet\")\n\n            return false\n        }\n\n        guard var rightInfo = rightInfo as? Dictionary<String, Any> else {\n            TCSLogErrorWithMark(\"error rightInfo\")\n\n            return false\n        }\n        rightInfo[\"mechanisms\"] = rights\n        guard let auth = getAuth() else {\n            TCSLogErrorWithMark(\"error getAuth\")\n\n            return false\n        }\n        let r = rightInfo as CFTypeRef\n        let err2 = AuthorizationRightSet(auth, \"system.login.console\",r, nil, nil, nil)\n\n        if err2 != noErr {\n            TCSLogErrorWithMark(\"error AuthorizationRightSet\")\n\n            return false\n        }\n        return true\n    }\n    func replace(right:String, withNewRight newRight:String) -> Bool {\n\n        var consoleRights = consoleRights()\n        let positionOfOldRight = consoleRights.firstIndex(of: right)\n\n        guard let positionOfOldRight = positionOfOldRight else {\n            return false\n        }\n\n        consoleRights[positionOfOldRight] = newRight\n\n        return setConsoleRights(rights: consoleRights)\n\n    }\n    func remove(right:String) -> Bool {\n\n        var consoleRights = consoleRights()\n        let positionOfOldRight = consoleRights.firstIndex(of: right)\n\n        guard let positionOfOldRight = positionOfOldRight else {\n\n            return false\n        }\n\n        consoleRights.remove(at: positionOfOldRight)\n\n        return setConsoleRights(rights: consoleRights)\n\n    }\n\n    func rightExists(right:String)->Bool{\n        let consoleRights = consoleRights()\n        let positionOfRight = consoleRights.firstIndex(of: right)\n\n        if positionOfRight == nil {\n            return false\n        }\n\n        return true\n    }\n    func insertRight(newRight:String, afterRight right:String) -> Bool {\n        var consoleRights = consoleRights()\n\n        let positionOfRight = consoleRights.firstIndex(of: right)\n\n        guard let positionOfRight = positionOfRight else {\n            TCSLogErrorWithMark(\"error positionOfRight. Not defined\")\n\n            return false\n        }\n        if positionOfRight+1 == consoleRights.count || consoleRights[positionOfRight+1] != newRight {\n\n            consoleRights.insert(newRight, at: positionOfRight+1)\n        }\n//        else {\n//            print(\"right already exists\")\n//        }\n\n\n        return setConsoleRights(rights: consoleRights)\n    }\n    func insertRight(newRight:String, beforeRight right:String) -> Bool {\n        var consoleRights = consoleRights()\n        let positionOfRight = consoleRights.firstIndex(of: right)\n        guard let positionOfRight = positionOfRight else {\n            TCSLogWithMark(\"error positionOfRight. Not defined\")\n\n            return false\n        }\n        //makes sure it is not last and then check to see if it already exists\n        if positionOfRight==0 || consoleRights[positionOfRight-1] != newRight {\n            consoleRights.insert(newRight, at: positionOfRight)\n\n        }\n//        else {\n//            print(\"right already exists\")\n//        }\n        let success = setConsoleRights(rights: consoleRights)\n        return success\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/ControlsViewController.swift",
    "content": "//\n//  LoginWindowControlsWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/3/22.\n//\n\nimport Cocoa\nimport CoreGraphics\n@available(macOS, deprecated: 11)\nclass ControlsViewController: NSViewController, NSPopoverDelegate {\n    @IBOutlet var systemInfoPopover: NSPopover!\n    @IBOutlet var systemInfoPopoverViewController: NSViewController!\n    var delegate: XCredsMechanismProtocol?\n\n    @IBOutlet weak var buttonGridView: NSGridView!\n    @IBOutlet weak var refreshGridColumn: NSGridColumn?\n    @IBOutlet weak var shutdownGridColumn: NSGridColumn?\n    @IBOutlet weak var restartGridColumn: NSGridColumn?\n\n    @IBOutlet weak var systemInfoButton: NSButton!\n    @IBOutlet weak var macLoginWindowGridColumn: NSGridColumn?\n    @IBOutlet weak var wifiGridColumn: NSGridColumn?\n\n    @IBOutlet weak var toolsView: NSView?\n\n    let uiLog = \"uiLog\"\n    @IBOutlet weak var systemInfoTextField: NSTextField?\n\n    var loadPageURL:URL?\n    var wifiWindowController:WifiWindowController?\n    @IBOutlet weak var trialVersionStatusTextField: NSTextField!\n\n    var refreshTimer:Timer?\n    var commandKeyDown = false\n    var optionKeyDown = false\n    var controlKeyDown = false\n    var allowPopoverClose:Bool = true\n    var keyCodesPressed:[UInt16:Bool]=[:]\n\n    static func initFromPlugin() -> ControlsViewController?{\n\n        let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n        guard let bundle = bundle else {\n            return nil\n        }\n        let controlsViewController = ControlsViewController.init(nibName: NSNib.Name(\"ControlsViewController\"), bundle: bundle)\n        return controlsViewController\n\n    }\n\n\n    func commandKey(evt: NSEvent) -> NSEvent{\n\n        let flags = evt.modifierFlags.rawValue & NSEvent.ModifierFlags.command.rawValue\n        if flags != 0 { //key code for command is 55\n            commandKeyDown = true\n        }\n        else {\n            commandKeyDown=false\n\n        }\n\n        let optionKeyFlags = evt.modifierFlags.rawValue & NSEvent.ModifierFlags.option.rawValue\n\n        if optionKeyFlags != 0 {\n            optionKeyDown=true\n        }\n        else {\n            optionKeyDown=false\n        }\n\n        let controlKeyFlags = evt.modifierFlags.rawValue & NSEvent.ModifierFlags.control.rawValue\n\n        if controlKeyFlags != 0 {\n            controlKeyDown=true\n        }\n        else {\n            controlKeyDown=false\n        }\n        return evt\n    }\n\n    func keyUp(key: NSEvent) -> NSEvent?{\n        keyCodesPressed.removeValue(forKey: key.keyCode)\n        return key\n    }\n    @IBAction func showSystemInfoButtonPressed(_ sender: NSButton) {\n        TCSLogWithMark(\"showSystemInfoButtonPressed\")\n        if systemInfoPopover.isShown==true {\n            TCSLogWithMark(\"closing\")\n            systemInfoPopover.performClose(self)\n            return\n        }\n        \n        var sysInfo = SystemInfoHelper().info().joined(separator: \"\\n\")\n\n        if let prefDomainName=getManagedPreference(key: .ADDomain) as? String{\n\n            let adSession = NoMADSession(domain:prefDomainName , user: \"\")\n            let ldapServers = adSession.getSRVRecords(prefDomainName)\n\n            if ldapServers.count>0{\n                sysInfo.append(\"\\nAD Domain:\\(prefDomainName) (Reachable)\")\n            }\n            else {\n                sysInfo.append(\"\\nAD Domain: \\(prefDomainName) (Not Reachable)\")\n            }\n\n        }\n        let bold14:NSFont = NSFont.systemFont(ofSize: 14.0)\n        let textColor:NSColor = NSColor.black\n        let textParagraph:NSMutableParagraphStyle = NSMutableParagraphStyle()\n        textParagraph.lineSpacing = 10.0  /*this sets the space BETWEEN lines to 10points*/\n        textParagraph.maximumLineHeight = 12.0/*this sets the MAXIMUM height of the lines to 12points*/\n        let attribs = [NSAttributedString.Key.font:bold14,NSAttributedString.Key.foregroundColor:textColor,NSAttributedString.Key.paragraphStyle:textParagraph]\n        let attrString:NSAttributedString = NSAttributedString.init(string: sysInfo, attributes: attribs)\n        self.systemInfoTextField?.attributedStringValue = attrString\n\n        \n//        self.systemInfoTextField?.stringValue = sysInfo\n        self.systemInfoPopover.delegate=self\n        systemInfoPopover.show(relativeTo: sender.bounds, of: sender, preferredEdge: .maxY)\n    }\n    func keyDown(key: NSEvent) -> NSEvent?{\n        keyCodesPressed[key.keyCode]=true\n       var correctKeyPressed = false\n        let keyCodeOverride  = DefaultsOverride.standardOverride.integer(forKey: PrefKeys.keyCodeForLoginWindowChange.rawValue)\n\n        if keyCodeOverride > 0 {\n\n            if keyCodesPressed[UInt16(keyCodeOverride)] == true{\n                correctKeyPressed=true\n            }\n        }\n        else {\n            if keyCodesPressed[76]==true || keyCodesPressed[36]==true {\n                correctKeyPressed=true\n            }\n        }\n\n\n        if correctKeyPressed && controlKeyDown==true && optionKeyDown==true {\n            guard let delegate = delegate else {\n                TCSLogWithMark(\"No delegate set for restart\")\n\n                return key\n            }\n\n            let allowCombo = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldAllowKeyComboForMacLoginWindow.rawValue)\n            if allowCombo == true {\n                keyCodesPressed.removeAll()\n                if commandKeyDown == false {\n                    NotificationCenter.default.post(name: NSNotification.Name(\"SwitchLoginWindow\"), object: self)\n\n\n                }\n                else {\n                    delegate.setContextString(type: kAuthorizationEnvironmentUsername, value: SpecialUsers.standardLoginWindow.rawValue)\n                    delegate.allowLogin()\n\n                }\n                return nil\n            }\n\n        }\n        return key\n    }\n    func setupSystemInfoButton() {\n        let systemInfoButtonTitle = DefaultsOverride.standardOverride.string(forKey: PrefKeys.systemInfoButtonTitle.rawValue)\n\n        switch systemInfoButtonTitle {\n        case \".os\":\n            systemInfoButton.title = \"macOS \" + ProcessInfo.processInfo.operatingSystemVersionString\n\n        case \".hostname\":\n            systemInfoButton.title = \"Hostname: \" + ProcessInfo.processInfo.hostName\n        case \".ipaddress\":\n            systemInfoButton.title = \"IP Address: \" + (SystemInfoHelper().ipAddress() ?? \"No IPAddress\")\n\n        case \".serial\":\n            systemInfoButton.title = \"Serial: \" + getSerial()\n\n//        case \".mac\":\n//            systemInfoButton.title = \"MAC Address:\" + getMAC()\n\n        case \".computername\":\n            systemInfoButton.title = \"Computer Name:\" +  (Host.current().localizedName ?? \"unknown computername\")\n\n        case \".ssid\":\n            systemInfoButton.title=\"SSID: \" + (NetworkManager().getCurrentSSID() ?? \"no SSID\")\n\n        default:\n            if let systemInfoButtonTitle = systemInfoButtonTitle, systemInfoButtonTitle.count<21 {\n                systemInfoButton.title = systemInfoButtonTitle\n            }\n            else if let appVersion = SystemInfoHelper().appVersion(){\n                systemInfoButton.title = appVersion\n            }\n        }\n    }\n    func popoverShouldClose(_ popover: NSPopover) -> Bool {\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldActivateSystemInfoButton.rawValue)==true && allowPopoverClose==false{\n            TCSLogWithMark(\"preventing popover from closing\")\n            return false\n        }\n        return true\n    }\n    override func awakeFromNib() {\n        TCSLogWithMark()\n        systemInfoPopover.delegate = self\n        super.awakeFromNib()\n        NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: keyDown(key:))\n        NSEvent.addLocalMonitorForEvents(matching: .keyUp, handler: keyUp(key:))\n        setupSystemInfoButton()\n        NSEvent.addLocalMonitorForEvents(matching: .flagsChanged, handler: commandKey(evt:))\n\n\n        let licenseState = LicenseChecker().currentLicenseState()\n        self.trialVersionStatusTextField?.isHidden = false\n\n        switch licenseState {\n\n        case .valid(let secRemaining):\n            self.trialVersionStatusTextField?.isHidden = true\n\n            let daysRemaining = Int(secRemaining/(24*60*60))\n            TCSLogWithMark(\"valid license. Days remaining: \\(daysRemaining) (\\(secRemaining) seconds)\")\n            if daysRemaining < 14 {\n                self.trialVersionStatusTextField.stringValue = \"License Expires in \\(daysRemaining) days\"\n                self.trialVersionStatusTextField?.isHidden = false\n            }\n\n            break;\n\n        case .expired:\n            self.trialVersionStatusTextField?.isHidden = false\n            self.trialVersionStatusTextField.stringValue = \"License Expired. Please visit twocanoes.com for more information.\"\n\n\n        case .trial(let daysRemaining):\n            TCSLogWithMark(\"Trial\")\n            self.trialVersionStatusTextField?.isHidden = false\n            if daysRemaining==1 {\n                self.trialVersionStatusTextField.stringValue = \"XCreds Trial. One day remaining.\"\n\n            }\n            else {\n                self.trialVersionStatusTextField.stringValue = \"XCreds Trial. \\(daysRemaining) days remaining.\"\n            }\n\n        case .trialExpired:\n            TCSLogErrorWithMark(\"Trial Expired. Purchase a license at twocanoes.com\")\n            self.trialVersionStatusTextField?.isHidden = false\n            self.trialVersionStatusTextField.stringValue = \"Trial Expired. Purchase a license at twocanoes.com\"\n\n\n\n        case .invalid:\n            TCSLogErrorWithMark(\"invalid license\")\n            self.trialVersionStatusTextField?.isHidden = false\n            self.trialVersionStatusTextField.stringValue = \"Invalid License. Please visit twocanoes.com for more information.\"\n\n        }\n        TCSLogWithMark()\n        setupLoginWindowControlsAppearance()\n\n//        resolutionObserver = NotificationCenter.default.addObserver(forName:NSApplication.didChangeScreenParametersNotification, object: nil, queue: nil) { notification in\n//            TCSLogWithMark(\"Resolution changed. Resetting size\")\n//            self.setupLoginWindowControlsAppearance()\n//\n//\n//        }\n\n\n        let refreshTimerSecs = DefaultsOverride.standardOverride.integer(forKey: PrefKeys.autoRefreshLoginTimer.rawValue)\n\n        if refreshTimerSecs > 0 {\n            TCSLogWithMark(\"Setting refresh timer\")\n            \n            refreshTimer = Timer.scheduledTimer(withTimeInterval: TimeInterval(refreshTimerSecs), repeats: true, block: { [self] timer in\n                \n                let idleTime = CGEventSource.secondsSinceLastEventType(CGEventSourceStateID.combinedSessionState, eventType: CGEventType.keyDown)\n                \n                \n                if idleTime>30{\n                    TCSLogWithMark(\"refreshing in timer\")\n                    delegate?.reload()\n                }\n                else {\n                    TCSLogWithMark(\"skipping refresh because activity detected in last 30 seconds\")\n                    \n                    \n                }\n            })\n        }\n    }\n    fileprivate func setupLoginWindowControlsAppearance() {\n        TCSLogWithMark()\n        DispatchQueue.main.async {\n            self.view.wantsLayer=true\n            self.view.layer?.backgroundColor = CGColor(red: 0.3, green: 0.3, blue: 0.3, alpha: 0.4)\n\n\n            TCSLogWithMark()\n\n            self.wifiGridColumn?.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowConfigureWifiButton.rawValue)\n\n            self.shutdownGridColumn?.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowShutdownButton.rawValue)\n\n\n            self.restartGridColumn?.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowRestartButton.rawValue)\n\n\n            self.systemInfoButton?.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowSystemInfoButton.rawValue)\n\n\n            TCSLogWithMark()\n\n            self.macLoginWindowGridColumn?.isHidden = !DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowMacLoginButton.rawValue)\n\n\n        }\n\n    }\n\n    func showPopoverIfNeeded(){\n        if self.systemInfoButton?.isHidden == false,  DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldActivateSystemInfoButton.rawValue)==true{\n            DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {\n\n                self.showSystemInfoButtonPressed(self.systemInfoButton)\n            }\n        }\n    }\n    @IBAction func showNetworkConnection(_ sender: Any) {\n//        username.isHidden = true\n        TCSLogWithMark()\n\n        wifiWindowController = WifiWindowController(windowNibName: NSNib.Name(\"WifiWindowController\"))\n        TCSLogWithMark()\n\n        guard let windowController = wifiWindowController, let window = windowController.window else {\n            TCSLogWithMark(\"no window for wifi\")\n            return\n        }\n        windowController.delegate=self.delegate\n        TCSLogWithMark(\"setting window level\")\n//        let colorValue=0.9\n//        let alpha=0.95\n//        window.backgroundColor=NSColor(deviceRed: colorValue, green: colorValue, blue: colorValue, alpha: alpha)\n        if let level = self.view.window?.level {\n            window.level = level+1\n        }\n\n        TCSLogWithMark(\"wifiWindowController ordering controls front\")\n        window.orderFrontRegardless()\n        TCSLogWithMark()\n//        window.titlebarAppearsTransparent = true\n        window.isMovable = true\n        window.canBecomeVisibleWithoutLogin = true\n        window.makeKeyAndOrderFront(self)\n\n//        window.titlebarAppearsTransparent = true\n\n\n        let screenRect = NSScreen.screens[0].frame\n        window.setFrame(screenRect, display: true, animate: false)\n\n\n        TCSLogWithMark()\n//        guard let wifiWindowController = WifiWindowViewController.createFr.createFromNib(in: .mainLogin) else {\n//            os_log(\"Error showing network selection.\", log: uiLog, type: .debug)\n//            return\n//        }\n//\n        \n//        wifiView.frame = windowContentView.frame\n//        let completion = {\n//            os_log(\"Finished working with wireless networks\", log: self.uiLog, type: .debug)\n////            self.username.isHidden = false\n////            self.username.becomeFirstResponder()\n//        }\n//        wifiView.set(completionHandler: completion)\n//        windowContentView.addSubview(wifiView)\n    }\n\n    @IBAction func refreshButtonPressed(_ sender: Any) {\n        TCSLogWithMark(\"refreshButtonPressed\")\n        DefaultsOverride.standardOverride.refreshCachedPrefs()\n\n        guard let delegate = delegate else {\n            TCSLogWithMark(\"No delegate set for refresh\")\n            return\n        }\n        TCSLogWithMark(\"refreshing\")\n\n        delegate.reload()\n\n    }\n\n    @IBAction func restartClick(_ sender: Any) {\n        TCSLogWithMark(\"Setting restart user\")\n        guard let delegate = delegate else {\n            TCSLogWithMark(\"No delegate set for restart\")\n\n            return\n        }\n        delegate.setContextString(type: kAuthorizationEnvironmentUsername, value: SpecialUsers.restart.rawValue)\n\n        delegate.allowLogin()\n    }\n\n    @IBAction func shutdownClick(_ sender: Any) {\n        TCSLogWithMark(\"Setting shutdown user\")\n        guard let delegate = delegate else {\n            TCSLogErrorWithMark(\"No delegate set for shutdown\")\n            return\n        }\n        delegate.setContextString(type: kAuthorizationEnvironmentUsername, value: SpecialUsers.shutdown.rawValue)\n        TCSLogWithMark(\"calling allowLogin\")\n\n        delegate.allowLogin()\n    }\n    @IBAction func resetToStandardLoginWindow(_ sender: Any) {\n        var shouldSwitch = true\n        TCSLogWithMark(\"switch login window\")\n        if commandKeyDown == false {\n\n            NotificationCenter.default.post(name: NSNotification.Name(\"SwitchLoginWindow\"), object: self)\n            return\n        }\n\n        if UserDefaults.standard.bool(forKey:PrefKeys.shouldUseKillWhenLoginWindowSwitching.rawValue)==false{\n\n            let alert = NSAlert()\n            alert.addButton(withTitle: \"Restart\")\n            alert.addButton(withTitle: \"Cancel\")\n            alert.messageText=\"Switching login windows requires a restart. Do you want to restart now?\"\n\n            alert.window.canBecomeVisibleWithoutLogin=true\n\n            let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n            if let bundle = bundle {\n                TCSLogWithMark(\"Found bundle\")\n\n                alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n\n            }\n            if alert.runModal() == .alertSecondButtonReturn {\n                shouldSwitch=false\n            }\n        }\n\n        if shouldSwitch == true {\n            guard let delegate = delegate else {\n                TCSLogErrorWithMark(\"No delegate set for resetToStandardLoginWindow\")\n                return\n            }\n            delegate.setContextString(type: kAuthorizationEnvironmentUsername, value: SpecialUsers.standardLoginWindow.rawValue)\n\n            delegate.allowLogin()\n        }\n    }\n\n\n\n}\n\n\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/ControlsViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"ControlsViewController\" customModule=\"XCredsLoginPlugin\">\n            <connections>\n                <outlet property=\"buttonGridView\" destination=\"Of1-FL-rgU\" id=\"U9d-R0-Z4b\"/>\n                <outlet property=\"macLoginWindowGridColumn\" destination=\"Qgw-6x-QRs\" id=\"YHA-Qx-deF\"/>\n                <outlet property=\"refreshGridColumn\" destination=\"8Cw-21-fob\" id=\"TAZ-uh-ulp\"/>\n                <outlet property=\"restartGridColumn\" destination=\"AiZ-fa-C1D\" id=\"r8h-HG-Jsh\"/>\n                <outlet property=\"shutdownGridColumn\" destination=\"vSV-Ol-eHY\" id=\"Mqo-KA-YRS\"/>\n                <outlet property=\"systemInfoButton\" destination=\"hD0-2k-DNh\" id=\"mDV-FR-BvK\"/>\n                <outlet property=\"systemInfoPopover\" destination=\"Pge-rG-2P0\" id=\"5Zw-N4-pgI\"/>\n                <outlet property=\"systemInfoPopoverViewController\" destination=\"65f-EP-uMZ\" id=\"ncc-d6-G7v\"/>\n                <outlet property=\"systemInfoTextField\" destination=\"B3h-KN-ejK\" id=\"Cde-Hk-pF0\"/>\n                <outlet property=\"toolsView\" destination=\"4X8-WT-UyO\" id=\"TTk-aU-6Vw\"/>\n                <outlet property=\"trialVersionStatusTextField\" destination=\"D8S-gh-gv5\" id=\"yc8-WQ-xH8\"/>\n                <outlet property=\"view\" destination=\"GEH-rQ-5ly\" id=\"Lvx-Jg-8CQ\"/>\n                <outlet property=\"wifiGridColumn\" destination=\"vWr-UA-21l\" id=\"qVZ-LM-BCg\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <view id=\"GEH-rQ-5ly\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1002\" height=\"117\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <subviews>\n                <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"D8S-gh-gv5\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"98\" width=\"1002\" height=\"19\"/>\n                    <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Unsupported – Visit twocanoes.com/xcreds/support for support options.\" drawsBackground=\"YES\" id=\"bHC-M4-jfl\">\n                        <font key=\"font\" metaFont=\"system\" size=\"16\"/>\n                        <color key=\"textColor\" name=\"systemBlueColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4X8-WT-UyO\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"14\" width=\"1002\" height=\"88\"/>\n                    <subviews>\n                        <gridView xPlacement=\"leading\" yPlacement=\"bottom\" rowAlignment=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Of1-FL-rgU\">\n                            <rect key=\"frame\" x=\"165\" y=\"10\" width=\"673\" height=\"48\"/>\n                            <rows>\n                                <gridRow id=\"Ax5-pH-aQS\"/>\n                            </rows>\n                            <columns>\n                                <gridColumn width=\"116\" trailingPadding=\"6\" id=\"vWr-UA-21l\"/>\n                                <gridColumn width=\"116\" trailingPadding=\"6\" id=\"vSV-Ol-eHY\"/>\n                                <gridColumn width=\"116\" trailingPadding=\"6\" id=\"AiZ-fa-C1D\"/>\n                                <gridColumn width=\"161\" trailingPadding=\"6\" id=\"Qgw-6x-QRs\"/>\n                                <gridColumn width=\"116\" id=\"8Cw-21-fob\"/>\n                            </columns>\n                            <gridCells>\n                                <gridCell row=\"Ax5-pH-aQS\" column=\"vWr-UA-21l\" xPlacement=\"center\" id=\"kmk-C1-8Ed\">\n                                    <button key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"weh-SQ-zW5\">\n                                        <rect key=\"frame\" x=\"11\" y=\"0.0\" width=\"94\" height=\"48\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" title=\"Configure WiFi\" bezelStyle=\"regularSquare\" image=\"wifi\" imagePosition=\"above\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ohe-3A-hIn\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <color key=\"contentTintColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"showNetworkConnection:\" target=\"-2\" id=\"kxH-Yb-ZnL\"/>\n                                        </connections>\n                                    </button>\n                                </gridCell>\n                                <gridCell row=\"Ax5-pH-aQS\" column=\"vSV-Ol-eHY\" xPlacement=\"center\" id=\"KaX-Pf-Drv\">\n                                    <button key=\"contentView\" imageHugsTitle=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"geo-E2-Yej\">\n                                        <rect key=\"frame\" x=\"153\" y=\"0.0\" width=\"65\" height=\"48\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" title=\"Shutdown\" bezelStyle=\"rounded\" image=\"ShutdownX\" imagePosition=\"above\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"8x0-LE-puN\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <color key=\"contentTintColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"shutdownClick:\" target=\"-2\" id=\"OeW-1j-UaS\"/>\n                                        </connections>\n                                    </button>\n                                </gridCell>\n                                <gridCell row=\"Ax5-pH-aQS\" column=\"AiZ-fa-C1D\" xPlacement=\"center\" id=\"5SJ-z0-iEj\">\n                                    <button key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XTY-NY-mXY\">\n                                        <rect key=\"frame\" x=\"290\" y=\"0.0\" width=\"48\" height=\"48\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" title=\"Restart\" bezelStyle=\"rounded\" image=\"RestartX\" imagePosition=\"above\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Tpv-6N-4hH\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <color key=\"contentTintColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"restartClick:\" target=\"-2\" id=\"h30-75-6RD\"/>\n                                        </connections>\n                                    </button>\n                                </gridCell>\n                                <gridCell row=\"Ax5-pH-aQS\" column=\"Qgw-6x-QRs\" xPlacement=\"center\" id=\"nYW-QR-FyA\">\n                                    <button key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gBX-qs-ZzX\">\n                                        <rect key=\"frame\" x=\"397\" y=\"0.0\" width=\"134\" height=\"48\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" title=\"Switch Login Window\" bezelStyle=\"rounded\" image=\"loginwindow\" imagePosition=\"above\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"7Kj-Zs-PRx\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                        </buttonCell>\n                                        <color key=\"contentTintColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"resetToStandardLoginWindow:\" target=\"-2\" id=\"aW0-oj-hve\"/>\n                                        </connections>\n                                    </button>\n                                </gridCell>\n                                <gridCell row=\"Ax5-pH-aQS\" column=\"8Cw-21-fob\" xPlacement=\"center\" id=\"iyn-s8-GFy\">\n                                    <button key=\"contentView\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0pJ-At-M5q\">\n                                        <rect key=\"frame\" x=\"589\" y=\"0.0\" width=\"51\" height=\"48\"/>\n                                        <buttonCell key=\"cell\" type=\"bevel\" title=\"Refresh\" bezelStyle=\"rounded\" image=\"refresh symbol\" imagePosition=\"above\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"QAx-lk-PcT\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <color key=\"contentTintColor\" red=\"0.99999600649999998\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"refreshButtonPressed:\" target=\"-2\" id=\"9up-7e-1lF\"/>\n                                        </connections>\n                                    </button>\n                                </gridCell>\n                            </gridCells>\n                        </gridView>\n                    </subviews>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"88\" id=\"IQF-bl-Sm9\"/>\n                        <constraint firstItem=\"Of1-FL-rgU\" firstAttribute=\"top\" secondItem=\"4X8-WT-UyO\" secondAttribute=\"top\" constant=\"30\" id=\"M9T-d7-5w9\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"Of1-FL-rgU\" secondAttribute=\"bottom\" constant=\"10\" id=\"VXI-lc-Rrx\"/>\n                        <constraint firstItem=\"Of1-FL-rgU\" firstAttribute=\"centerX\" secondItem=\"4X8-WT-UyO\" secondAttribute=\"centerX\" id=\"WnJ-zT-uLN\"/>\n                    </constraints>\n                </customView>\n                <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hD0-2k-DNh\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"76\" height=\"16\"/>\n                    <buttonCell key=\"cell\" type=\"bevel\" title=\"System Info\" bezelStyle=\"rounded\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"fGu-PP-maa\">\n                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                    </buttonCell>\n                    <color key=\"contentTintColor\" name=\"alternateSelectedControlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    <connections>\n                        <action selector=\"showSystemInfoButtonPressed:\" target=\"-2\" id=\"QsR-iB-FJl\"/>\n                    </connections>\n                </button>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"D8S-gh-gv5\" firstAttribute=\"leading\" secondItem=\"GEH-rQ-5ly\" secondAttribute=\"leading\" id=\"1KA-Xz-a3o\"/>\n                <constraint firstItem=\"4X8-WT-UyO\" firstAttribute=\"top\" secondItem=\"D8S-gh-gv5\" secondAttribute=\"bottom\" constant=\"-4\" id=\"1wf-Rx-6Xq\"/>\n                <constraint firstItem=\"4X8-WT-UyO\" firstAttribute=\"leading\" secondItem=\"GEH-rQ-5ly\" secondAttribute=\"leading\" id=\"B4J-hr-OCp\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"D8S-gh-gv5\" secondAttribute=\"trailing\" id=\"Eih-ds-XN3\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"4X8-WT-UyO\" secondAttribute=\"trailing\" id=\"I78-R5-t6d\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"hD0-2k-DNh\" secondAttribute=\"bottom\" id=\"YOQ-s7-Vus\"/>\n                <constraint firstAttribute=\"height\" constant=\"117\" id=\"p34-fX-f9F\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"4X8-WT-UyO\" secondAttribute=\"bottom\" constant=\"14\" id=\"qqw-Td-A3o\"/>\n                <constraint firstItem=\"hD0-2k-DNh\" firstAttribute=\"leading\" secondItem=\"GEH-rQ-5ly\" secondAttribute=\"leading\" id=\"zBZ-eE-pMz\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"55\" y=\"731.5\"/>\n        </view>\n        <viewController id=\"65f-EP-uMZ\" userLabel=\"Popover View Controller\">\n            <connections>\n                <outlet property=\"view\" destination=\"Nxe-Fs-xYc\" id=\"ce1-lc-EKd\"/>\n            </connections>\n        </viewController>\n        <popover id=\"Pge-rG-2P0\">\n            <connections>\n                <outlet property=\"contentViewController\" destination=\"65f-EP-uMZ\" id=\"7eg-qS-1nM\"/>\n            </connections>\n        </popover>\n        <customView id=\"Nxe-Fs-xYc\" customClass=\"WhitePopoverBackgroundView\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"223\" height=\"56\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <subviews>\n                <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"B3h-KN-ejK\">\n                    <rect key=\"frame\" x=\"18\" y=\"20\" width=\"187\" height=\"16\"/>\n                    <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Label\" id=\"7lK-sV-1fw\">\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n            </subviews>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"B3h-KN-ejK\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"MPh-gn-7pE\"/>\n                <constraint firstItem=\"B3h-KN-ejK\" firstAttribute=\"top\" secondItem=\"Nxe-Fs-xYc\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"Ojo-ul-hDO\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"B3h-KN-ejK\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"Vit-8o-P69\"/>\n                <constraint firstItem=\"B3h-KN-ejK\" firstAttribute=\"leading\" secondItem=\"Nxe-Fs-xYc\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"pSd-bh-VAS\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"-181.5\" y=\"93\"/>\n        </customView>\n    </objects>\n    <resources>\n        <image name=\"RestartX\" width=\"32\" height=\"32\"/>\n        <image name=\"ShutdownX\" width=\"32\" height=\"32\"/>\n        <image name=\"loginwindow\" width=\"41\" height=\"32\"/>\n        <image name=\"refresh symbol\" width=\"41\" height=\"41\"/>\n        <image name=\"wifi\" width=\"32\" height=\"32\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/LocalUsersViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"SignInViewController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"alertTextField\" destination=\"e5W-zw-UxS\" id=\"JTQ-VN-A08\"/>\n                <outlet property=\"localOnlyCheckBox\" destination=\"kwO-Pt-tOG\" id=\"w4U-23-hqX\"/>\n                <outlet property=\"loginCardSetupButton\" destination=\"iwC-yg-Wc5\" id=\"e8t-4D-JiT\"/>\n                <outlet property=\"logoImageView\" destination=\"cm4-KP-f9k\" id=\"fQn-QD-dZF\"/>\n                <outlet property=\"passwordTextField\" destination=\"UJh-bj-CPX\" id=\"YZl-II-FDB\"/>\n                <outlet property=\"signIn\" destination=\"XnO-81-SH2\" id=\"VQg-nQ-slV\"/>\n                <outlet property=\"stackView\" destination=\"eRJ-Lo-UdT\" id=\"b9W-ja-J8M\"/>\n                <outlet property=\"tapLoginLabel\" destination=\"9E1-Yr-3LY\" id=\"U1r-fL-ec2\"/>\n                <outlet property=\"usernameTextField\" destination=\"pMs-hI-jaw\" id=\"7EL-6L-Ju6\"/>\n                <outlet property=\"view\" destination=\"Vpj-iV-5Db\" id=\"JcN-lE-Ijf\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <view wantsLayer=\"YES\" id=\"Vpj-iV-5Db\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"336\" height=\"281\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n            <subviews>\n                <stackView distribution=\"fill\" orientation=\"vertical\" alignment=\"leading\" spacing=\"11\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" verticalCompressionResistancePriority=\"250\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eRJ-Lo-UdT\" userLabel=\"login stack\">\n                    <rect key=\"frame\" x=\"27\" y=\"8\" width=\"283\" height=\"266\"/>\n                    <subviews>\n                        <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cm4-KP-f9k\">\n                            <rect key=\"frame\" x=\"13\" y=\"202\" width=\"256\" height=\"64\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" relation=\"lessThanOrEqual\" constant=\"128\" id=\"JmN-RK-K6v\"/>\n                                <constraint firstAttribute=\"width\" relation=\"lessThanOrEqual\" constant=\"256\" id=\"PQ0-9d-m1K\"/>\n                            </constraints>\n                            <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"icon_64x64\" id=\"As7-x6-zzU\"/>\n                        </imageView>\n                        <textField verticalHuggingPriority=\"750\" textCompletion=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pMs-hI-jaw\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"161\" width=\"250\" height=\"30\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"250\" id=\"PcC-1B-yi1\"/>\n                                <constraint firstAttribute=\"height\" constant=\"30\" id=\"ecj-Kv-Zev\"/>\n                            </constraints>\n                            <textFieldCell key=\"cell\" controlSize=\"large\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"left\" placeholderString=\"Username\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"arZ-bA-4ND\">\n                                <font key=\"font\" metaFont=\"system\"/>\n                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            </textFieldCell>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"-2\" id=\"ShZ-O0-13Y\"/>\n                                <outlet property=\"nextKeyView\" destination=\"UJh-bj-CPX\" id=\"06V-sj-QkX\"/>\n                            </connections>\n                        </textField>\n                        <stackView distribution=\"equalCentering\" orientation=\"horizontal\" alignment=\"top\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TZJ-ht-zuy\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"120\" width=\"283\" height=\"30\"/>\n                            <subviews>\n                                <secureTextField verticalHuggingPriority=\"750\" tag=\"99\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UJh-bj-CPX\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"250\" height=\"30\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" constant=\"250\" id=\"37q-P0-BRW\"/>\n                                        <constraint firstAttribute=\"height\" constant=\"30\" id=\"rOy-Aj-MvO\"/>\n                                    </constraints>\n                                    <secureTextFieldCell key=\"cell\" controlSize=\"large\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" continuous=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" alignment=\"left\" placeholderString=\"Password\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"eUo-wa-I7w\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <allowedInputSourceLocales>\n                                            <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                                        </allowedInputSourceLocales>\n                                    </secureTextFieldCell>\n                                    <connections>\n                                        <outlet property=\"delegate\" destination=\"-2\" id=\"QFZ-pC-j3F\"/>\n                                        <outlet property=\"nextKeyView\" destination=\"kwO-Pt-tOG\" id=\"g5j-pG-8ES\"/>\n                                    </connections>\n                                </secureTextField>\n                                <button verticalHuggingPriority=\"750\" verticalCompressionResistancePriority=\"100\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XnO-81-SH2\">\n                                    <rect key=\"frame\" x=\"258\" y=\"2\" width=\"25\" height=\"31\"/>\n                                    <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"regularSquare\" image=\"NSFollowLinkFreestandingTemplate\" imagePosition=\"overlaps\" alignment=\"center\" imageScaling=\"proportionallyUpOrDown\" inset=\"2\" id=\"f9b-Hs-YTG\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                                    </buttonCell>\n                                    <color key=\"contentTintColor\" name=\"controlAccentColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" constant=\"25\" id=\"JTt-0S-bRG\"/>\n                                        <constraint firstAttribute=\"height\" constant=\"25\" id=\"YAe-zl-eRc\"/>\n                                    </constraints>\n                                    <connections>\n                                        <action selector=\"signInButtonPressed:\" target=\"-2\" id=\"YPW-I6-8Mb\"/>\n                                        <outlet property=\"nextKeyView\" destination=\"pMs-hI-jaw\" id=\"eLH-Zi-L7o\"/>\n                                    </connections>\n                                </button>\n                            </subviews>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"283\" id=\"HfF-6x-wp4\"/>\n                            </constraints>\n                            <visibilityPriorities>\n                                <integer value=\"1000\"/>\n                                <integer value=\"1000\"/>\n                            </visibilityPriorities>\n                            <customSpacing>\n                                <real value=\"3.4028234663852886e+38\"/>\n                                <real value=\"3.4028234663852886e+38\"/>\n                            </customSpacing>\n                        </stackView>\n                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9E1-Yr-3LY\">\n                            <rect key=\"frame\" x=\"-2\" y=\"81\" width=\"195\" height=\"28\"/>\n                            <textFieldCell key=\"cell\" controlSize=\"large\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Tap Card to Log In\" id=\"67B-K8-Q2B\">\n                                <font key=\"font\" metaFont=\"system\" size=\"24\"/>\n                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            </textFieldCell>\n                        </textField>\n                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e5W-zw-UxS\">\n                            <rect key=\"frame\" x=\"-2\" y=\"54\" width=\"254\" height=\"16\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"250\" id=\"f1h-xK-zpp\"/>\n                            </constraints>\n                            <textFieldCell key=\"cell\" controlSize=\"large\" alignment=\"center\" title=\"Label\" id=\"ST2-Ov-6aS\">\n                                <font key=\"font\" metaFont=\"system\"/>\n                                <color key=\"textColor\" name=\"systemRedColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            </textFieldCell>\n                        </textField>\n                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kwO-Pt-tOG\" customClass=\"CustomCheckbox\" customModule=\"XCreds\" customModuleProvider=\"target\">\n                            <rect key=\"frame\" x=\"-3\" y=\"24\" width=\"161\" height=\"22\"/>\n                            <buttonCell key=\"cell\" type=\"check\" title=\"Offline Authentication\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"large\" inset=\"2\" id=\"LOr-pb-ijJ\">\n                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            </buttonCell>\n                            <color key=\"contentTintColor\" red=\"0.2035290897\" green=\"0.19276815650000001\" blue=\"0.31538134810000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <userDefinedRuntimeAttributes>\n                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"textColor\">\n                                    <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </userDefinedRuntimeAttribute>\n                            </userDefinedRuntimeAttributes>\n                            <connections>\n                                <outlet property=\"nextKeyView\" destination=\"iwC-yg-Wc5\" id=\"BYA-wD-gzn\"/>\n                            </connections>\n                        </button>\n                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iwC-yg-Wc5\" customClass=\"CustomCheckbox\" customModule=\"XCreds\" customModuleProvider=\"target\">\n                            <rect key=\"frame\" x=\"-3\" y=\"-3\" width=\"138\" height=\"22\"/>\n                            <buttonCell key=\"cell\" type=\"check\" title=\"Set up Login Card\" bezelStyle=\"regularSquare\" imagePosition=\"left\" controlSize=\"large\" inset=\"2\" id=\"bXa-ud-i6Y\">\n                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                <font key=\"font\" metaFont=\"system\"/>\n                            </buttonCell>\n                            <color key=\"contentTintColor\" red=\"0.22137087580000001\" green=\"0.3507379591\" blue=\"0.59525352720000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <userDefinedRuntimeAttributes>\n                                <userDefinedRuntimeAttribute type=\"color\" keyPath=\"textColor\">\n                                    <color key=\"value\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </userDefinedRuntimeAttribute>\n                            </userDefinedRuntimeAttributes>\n                            <connections>\n                                <outlet property=\"nextKeyView\" destination=\"XnO-81-SH2\" id=\"u2u-sO-vgs\"/>\n                            </connections>\n                        </button>\n                    </subviews>\n                    <shadow key=\"shadow\">\n                        <color key=\"color\" white=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </shadow>\n                    <constraints>\n                        <constraint firstItem=\"cm4-KP-f9k\" firstAttribute=\"centerX\" secondItem=\"eRJ-Lo-UdT\" secondAttribute=\"centerX\" id=\"8Xo-fA-4Ps\"/>\n                        <constraint firstAttribute=\"width\" constant=\"283\" id=\"QnM-r6-bbR\"/>\n                        <constraint firstItem=\"e5W-zw-UxS\" firstAttribute=\"leading\" secondItem=\"eRJ-Lo-UdT\" secondAttribute=\"leading\" id=\"RL2-Rw-W1b\"/>\n                    </constraints>\n                    <visibilityPriorities>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                        <integer value=\"1000\"/>\n                    </visibilityPriorities>\n                    <customSpacing>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                        <real value=\"3.4028234663852886e+38\"/>\n                    </customSpacing>\n                </stackView>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"eRJ-Lo-UdT\" firstAttribute=\"centerY\" secondItem=\"Vpj-iV-5Db\" secondAttribute=\"centerY\" id=\"K0C-Tr-IF7\"/>\n                <constraint firstItem=\"eRJ-Lo-UdT\" firstAttribute=\"centerX\" secondItem=\"Vpj-iV-5Db\" secondAttribute=\"centerX\" id=\"jqf-V7-uWn\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"-365\" y=\"-221.5\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"NSFollowLinkFreestandingTemplate\" width=\"20\" height=\"20\"/>\n        <image name=\"icon_64x64\" width=\"64\" height=\"64\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/LoginWebViewController.swift",
    "content": "//\n//  WebView.swift\n//  xCreds\n//\n//  Created by Timothy Perfitt on 4/5/22.\n//\n\nimport Foundation\nimport Cocoa\nimport WebKit\nimport OIDCLite\nimport OpenDirectory\n@available(macOS, deprecated: 11)\nclass LoginWebViewController: WebViewController, DSQueryable {\n\n    let uiLog = \"uiLog\"\n//    var internalDelegate:XCredsMechanismProtocol?\n    var mechanismDelegate:XCredsMechanismProtocol?\n//    }\n    @IBOutlet weak var backgroundImageView: NSImageView!\n\n    override func awakeFromNib() {\n//        NotificationCenter.default.addObserver(forName:NSApplication.didChangeScreenParametersNotification, object: nil, queue: nil) { notification in\n//            TCSLogWithMark(\"Updating view\")\n//            self.updateView()\n//        }\n        TCSLogWithMark()\n\n        updateView()\n        \n        NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: nil) { not in\n            TCSLogWithMark(\"Waking from sleep, so refreshing view\")\n            self.updateView()\n        }\n\n\n    }\n    \n    override func viewDidLayout() {\n        TCSLogWithMark()\n    }\n\n    override func viewWillLayout() {\n        TCSLogWithMark()\n        updateView()\n    }\n    func updateView(){\n        self.view.layer?.cornerRadius=15\n\n        let screenRect = NSScreen.screens[0].frame\n\n        let screenWidth = screenRect.width\n        let screenHeight = screenRect.height\n\n        var loginWindowWidth = screenWidth //start with full size\n        var loginWindowHeight = screenHeight //start with full size\n\n        if DefaultsOverride.standardOverride.object(forKey: PrefKeys.loginWindowWidth.rawValue) != nil  {\n            let val = CGFloat(DefaultsOverride.standardOverride.float(forKey: PrefKeys.loginWindowWidth.rawValue))\n            if val > 149 {\n                TCSLogWithMark(\"setting loginWindowWidth to \\(val)\")\n                loginWindowWidth = val\n            }\n        }\n        if DefaultsOverride.standardOverride.object(forKey: PrefKeys.loginWindowHeight.rawValue) != nil {\n            let val = CGFloat(DefaultsOverride.standardOverride.float(forKey: PrefKeys.loginWindowHeight.rawValue))\n            if val > 149 {\n                TCSLogWithMark(\"setting loginWindowHeight to \\(val)\")\n                loginWindowHeight = val\n            }\n        }\n        TCSLogWithMark(\"setting loginWindowWidth to \\(loginWindowWidth)\")\n\n        TCSLogWithMark(\"setting loginWindowHeight to \\(loginWindowHeight)\")\n\n        view.setFrameSize(NSMakeSize(loginWindowWidth, loginWindowHeight))\n        \n        loadPage()\n        \n\n    }\n    override func viewDidAppear() {\n        TCSLogWithMark(\"loading page\")\n        //if prefs define smaller, then resize window\n        TCSLogWithMark(\"checking for custom height and width\")\n        updateView()\n    }\n\n\n    override func showErrorMessageAndDeny(_ message:String){\n            mechanismDelegate?.denyLogin(message:message)\n            return\n        }\n\n\n    override func credentialsUpdated(_ credentials:Creds){\n        \n        if let res = mechanismDelegate?.setupHints(fromCredentials: credentials, password: password ?? \"\" ){\n\n            switch res {\n\n            case .success:\n                break\n            case .failure(let message):\n                TCSLogWithMark(\"error setting up hints, reloading page:\\(message)\")\n                let alert = NSAlert()\n                alert.addButton(withTitle: \"OK\")\n                alert.messageText=message\n\n                alert.window.canBecomeVisibleWithoutLogin=true\n\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n                if let bundle = bundle {\n                    TCSLogWithMark(\"Found bundle\")\n\n                    alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n\n                }\n                alert.runModal()\n\n                self.updateView()\n\n\n            case .userCancelled:\n                TCSLogWithMark(\"user cancelled\")\n\n                self.updateView()\n\n            }\n        }\n\n    }\n\n}\n\n\n\nextension String {\n\n    var stripped: String {\n        let okayChars = Set(\"abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-._\")\n        return self.filter {okayChars.contains($0) }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/LoginWindow.swift",
    "content": "//\n//  LoginWindow.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/2/22.\n//\n\nimport Cocoa\n\nclass LoginWindow: NSWindow {\n    override var canBecomeKey: Bool {\n        return true\n    }\n\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/MainLoginWindow.swift",
    "content": "//\n//  MainLoginWIndow.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 12/8/23.\n//\n\nimport Cocoa\n\nclass MainLoginWindow: NSWindow {\n    override var canBecomeKey: Bool {\n        return true\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/MainLoginWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"MainLoginWindowController\" customModule=\"XCredsLoginPlugin\">\n            <connections>\n                <outlet property=\"backgroundImageView\" destination=\"NWg-Yb-kPu\" id=\"Tx3-KE-iAa\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\" customClass=\"MainLoginWindow\" customModule=\"XCredsLoginPlugin\">\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NWg-Yb-kPu\" userLabel=\"Background Image\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"axesIndependently\" id=\"MV3-cI-8IS\"/>\n                    </imageView>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"9\" y=\"142\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/SignInWindowController.swift",
    "content": "//\n//  SignIn.swift\n//  NoMADLogin\n//\n//  Created by Joel Rennich on 9/20/17.\n//  Copyright © 2017 Joel Rennich. All rights reserved.\n//\n\nimport Cocoa\nimport Security.AuthorizationPlugin\nimport os.log\nimport OpenDirectory\nimport OIDCLite\nimport CryptoTokenKit\nimport CryptoKit\nlet uiLog = OSLog(subsystem: \"menu.nomad.login.ad\", category: \"UI\")\nlet checkADLog = OSLog(subsystem: \"menu.nomad.login.ad\", category: \"CheckADMech\")\n\nprotocol UpdateCredentialsFeedbackProtocol {\n\n    func passwordExpiryUpdate(_ passwordExpires:Date)\n    func credentialsUpdated(_ credentials:Creds)\n    func credentialsCheckFailed()\n    func invalidCredentials()\n    func kerberosTicketUpdated()\n    func kerberosTicketCheckFailed(_ error:NoMADSessionError)\n    func adUserUpdated(_ adUser:ADUserRecord)\n\n}\n@available(macOS, deprecated: 11)\n@objc class SignInViewController: NSViewController, DSQueryable, TokenManagerFeedbackDelegate {\n\n\n    enum SignInViewControllerResetPasswordError:Error {\n        case failedToResetPassword(String)\n        case cancelled\n\n    }\n\n    //MARK: - setup properties\n    var mech: MechanismRecord?\n    var nomadSession: NoMADSession?\n    var shortName = \"\"\n    var domainName = \"\"\n    var passString = \"\"\n    var newPassword = \"\"\n    var isDomainManaged = false\n    var isSSLRequired = false\n    let sysInfo = SystemInfoHelper().info()\n    var sysInfoIndex = 0\n    let tokenManager = TokenManager()\n    var cardLoginFailedAttempts = 0\n    var localAdmin:LocalAdminCredentials?\n    var rfidUsers:RFIDUsers?\n    var updateCredentialsFeedbackDelegate: UpdateCredentialsFeedbackProtocol?\n    var isInUserSpace = false\n    var watcher:TKTokenWatcher?\n    var isResetPasswordInProgress = false\n    var shouldIgnoreInsertion=false\n    var hadPasswordFailure:Bool=false\n\n    @objc var visible = true\n    override var acceptsFirstResponder: Bool {\n        return true\n    }\n    //MARK: - IB outlets\n    @IBOutlet weak var usernameTextField: NSTextField!\n    @IBOutlet weak var passwordTextField: NSSecureTextField!\n    @IBOutlet weak var localOnlyCheckBox: NSButton!\n//    @IBOutlet weak var localOnlyView: NSView!\n    @IBOutlet var alertTextField:NSTextField!\n    @IBOutlet var tapLoginLabel:NSTextField!\n\n    @IBOutlet weak var loginCardSetupButton: NSButton!\n//    @IBOutlet weak var loginCardSetupView: NSView!\n    var unprovisionedRfidUid:String?\n    @IBOutlet weak var stackView: NSStackView!\n\n//    @IBOutlet weak var domain: NSPopUpButton!\n    @IBOutlet weak var signIn: NSButton!\n    @IBOutlet weak var imageView: NSImageView!\n//    var setupCardWindowController:SetupCardWindowController?\n\n    @IBOutlet weak var logoImageView: NSImageView!\n    var mechanismDelegate:XCredsMechanismProtocol?\n\n    override var nibName: NSNib.Name{\n\n        return \"LocalUsersViewController\"\n    }\n    func invalidCredentials() {\n        updateCredentialsFeedbackDelegate?.invalidCredentials()\n        TCSLogWithMark(\"Token error: Invalid credentials\")\n        XCredsAudit().auditError(\"Token error: Invalid credentials\")\n        shakeWindowAndShowError()\n\n    }\n\n    func tokenError(_ err:String){\n        updateCredentialsFeedbackDelegate?.credentialsCheckFailed()\n        TCSLogWithMark(\"Token error: \\(err)\")\n        XCredsAudit().auditError(err)\n        shakeWindowAndShowError()\n    }\n\n    func credentialsUpdated(_ credentials:Creds){\n\n        updateCredentialsFeedbackDelegate?.credentialsUpdated(credentials)\n        if let res = mechanismDelegate?.setupHints(fromCredentials: credentials, password: passString ){\n            switch res {\n                \n            case .success, .userCancelled:\n                break\n            case .failure(let msg):\n                TCSLogWithMark(msg)\n                TCSLogWithMark(\"error setting up hints, reloading page:\\(msg)\")\n                let alert = NSAlert()\n                alert.addButton(withTitle: \"OK\")\n                alert.messageText=msg\n                \n                alert.window.canBecomeVisibleWithoutLogin=true\n                \n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n                \n                if let bundle = bundle {\n                    TCSLogWithMark(\"Found bundle\")\n                    alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n                }\n                alert.runModal()\n            }\n\n        }\n\n        var credWithPass = credentials\n        credWithPass.password = self.passString\n        NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"credentials\":credWithPass])\n\n    }\n\n\n\n\n//    var mechanism:XCredsMechanismProtocol? {\n//        set {\n//            TCSLogWithMark()\n//            mechanismDelegate=newValue\n//        }\n//        get {\n//            return mechanismDelegate\n//        }\n//    }\n\n    //MARK: - Migrate Box IB outlets\n    var migrate = false\n    var migrateUserRecord : ODRecord?\n//    var didUpdateFail = false\n    var setupDone=false\n    var cardInserted = false\n    //MARK: - UI Methods\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        //awakeFromNib gets called multiple times. guard against that.\n        if setupDone==true {\n            return\n        }\n        setupDone=true\n\n        TCSLogWithMark()\n        alertTextField.isHidden=true\n\n        if let prefDomainName=getManagedPreference(key: .ADDomain) as? String{\n            domainName = prefDomainName\n        }\n        setupLoginAppearance()\n\n        TCSLogWithMark(\"setting up smart card listener\")\n        watcher = TKTokenWatcher()\n        watcher?.setInsertionHandler({ tokenID in\n            TCSLogWithMark(\"card inserted\")\n            //sometimes we get multiple events, so track and skip\n\n            self.watcher?.addRemovalHandler({ tokenID in\n                self.loginCardSetupButton.isHidden=true\n                self.loginCardSetupButton.state = .off\n                self.unprovisionedRfidUid=nil\n                self.cardInserted=false\n\n                TCSLogWithMark(\"card removed\")\n            }, forTokenID: tokenID)\n            if self.cardInserted == true {\n                return\n            }\n            self.cardInserted=true\n            \n            if self.shouldIgnoreInsertion == true {\n                return\n            }\n            if self.cardLoginFailedAttempts>2 {\n                DispatchQueue.main.async {\n                    self.alertTextField.stringValue = \"Tap Login Disabled\"\n                    self.alertTextField.isHidden = false\n                }\n                return\n            }\n            let slotNames = TKSmartCardSlotManager.default?.slotNames\n\n            guard let slotNames = slotNames, slotNames.count>0 else {\n                TCSLogWithMark(\"No rfid readers\")\n                return\n            }\n            guard let ccidSlotName = DefaultsOverride.standardOverride.string(forKey: PrefKeys.ccidSlotName.rawValue) else {\n                TCSLogWithMark(\"No slotname defined in prefs. Slot names found: \\(slotNames)\")\n\n                return\n            }\n            let slotName=slotNames.first { currString in\n                currString == ccidSlotName\n            }\n\n            guard let slotName = slotName else {\n                TCSLogWithMark(\"no matches found for slotname \\(ccidSlotName)\")\n                return\n            }\n            TCSLogWithMark()\n            let slot = TKSmartCardSlotManager.default?.slotNamed(slotName)\n            TCSLogWithMark()\n            guard let tkSmartCard = slot?.makeSmartCard() else {\n                TCSLogWithMark(\"Could not setup reader\")\n                self.cardInserted=false\n                return\n            }\n            TCSLogWithMark()\n            let builtInReader = CCIDCardReader(tkSmartCard: tkSmartCard)\n            TCSLogWithMark()\n            let returnData = builtInReader.sendAPDU(cla: 0xFF, ins: 0xCA, p1: 0, p2: 0, data: nil)\n            TCSLogWithMark()\n            if let returnData=returnData, returnData.count>2{\n                TCSLogWithMark()\n                print(returnData[0...returnData.count-3].hexEncodedString())\n                DispatchQueue.main.async {\n                    TCSLogWithMark()\n\n                    var pin:String?\n                    let hex=returnData[0...returnData.count-3].hexEncodedString()\n                    do {\n                        let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n                        let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                        if let uidData = Data(fromHexEncodedString: hex) {\n                            TCSLogWithMark(\"got UID Data\")\n                            if let user = try userManager.uidUser(uid: uidData, rfidUsers: self.rfidUsers){\n                                TCSLogWithMark(\"Found user. looking if pin required\")\n                                if user.requiresPIN == true {\n                                    let pinPromptWindowController = PinPromptWindowController(windowNibName: \"PinPromptWindowController\")\n                                    let res = NSApp.runModal(for: pinPromptWindowController.window!)\n                                    pinPromptWindowController.window?.close()\n\n                                    if res == .OK {\n                                        pin = pinPromptWindowController.pin\n                                    }\n                                    else if res == .cancel {\n                                        return\n                                    }\n\n                                }\n\n                            }\n                        }\n                        self.cardLogin(uid: hex, pin:pin)\n                    }\n                    catch {\n                        TCSLogWithMark(\"error: \"+error.localizedDescription)\n\n                    }\n                }\n            }\n        })\n\n    }\n\n\n\n\n    func cardLogin(uid:String, pin:String?) {\n        var hashedUID:Data\n        let shouldAllowLoginCardSetup = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldAllowLoginCardSetup.rawValue)\n\n        TCSLogWithMark(\"RFID UID \\\"\\(uid)\\\" detected\")\n        guard let rfidUsers = rfidUsers else {\n            if shouldAllowLoginCardSetup == true {\n                loginCardSetupButton.isHidden=false\n                self.loginCardSetupButton.state = .on\n\n                unprovisionedRfidUid=uid\n            }\n            else {\n                TCSLogWithMark(\"No RFID Users defined. run /Applications/XCreds.app/Contents/MacOS/XCreds -h for help on adding users.\")\n\n                passwordTextField.shake(self)\n\n            }\n            return\n        }\n\n        guard let rfidUidData = Data(fromHexEncodedString: uid) else {\n            TCSLogWithMark(\"error in RFID UID\")\n            return\n        }\n\n        do {\n            (hashedUID,_) = try PasswordCryptor().hashSecretWithKeyStretchingAndSalt(secret: rfidUidData, salt: rfidUsers.salt)\n        }\n        catch {\n            TCSLogWithMark(\"error hashing key: \\(error.localizedDescription)\")\n            return\n        }\n        guard let rfidUserDict = rfidUsers.userDict, let rfidUser = rfidUserDict[hashedUID]  else {\n            TCSLogWithMark(\"No RFID user with uid: \\(uid)\")\n\n\n            if shouldAllowLoginCardSetup==true {\n                loginCardSetupButton.isHidden=false\n                self.loginCardSetupButton.state = .on\n\n                unprovisionedRfidUid=uid\n\n            }\n            else {\n                passwordTextField.shake(self)\n            }\n            return\n        }\n\n        shortName = rfidUser.username\n        let encryptedPasswordData = rfidUser.password\n\n\n        guard let rfidUIDdata = Data(fromHexEncodedString: uid) else {\n            TCSLogWithMark(\"invalid UID Data\")\n            passwordTextField.shake(self)\n            return\n\n        }\n\n        guard let passwordData = try? PasswordCryptor().passwordDecrypt(encryptedDataWithSalt: encryptedPasswordData, rfidUID: rfidUIDdata, pin:pin) else {\n            TCSLogWithMark(\"error decrypting password\")\n            cardLoginFailedAttempts += 1\n            passwordTextField.shake(self)\n            return\n        }\n        cardLoginFailedAttempts = 0\n        passString = String(decoding: passwordData, as: UTF8.self)\n        let fullName = rfidUser.fullName\n        let useruid = rfidUser.userUID\n\n        TCSLogWithMark(\"UserID: \\(useruid.stringValue)\")\n        let userExists = try? PasswordUtils.isUserLocal(shortName)\n        guard let userExists = userExists else {\n            TCSLogWithMark(\"DS error\")\n            passwordTextField.shake(self)\n            return\n        }\n        if (userExists==true){\n            TCSLogWithMark()\n            processLogin(inShortname: shortName, inPassword: passString)\n            return\n        }\n        //user is defined in rfid user file but never logged in. so new user,\n        // so we populate the needed values for the account and move along\n        setRequiredHintsAndContext()\n        if let fullName = fullName {\n            TCSLogWithMark(\"Setting fullName to \\(fullName)\")\n\n            mechanismDelegate?.setHint(type: .fullName, hint: fullName as NSSecureCoding)\n\n        }\n        if useruid.intValue>499 {\n            TCSLogWithMark(\"Setting uid to \\(useruid.stringValue)\")\n            mechanismDelegate?.setHint(type: .uid, hint: useruid.stringValue as NSSecureCoding)\n        }\n\n        else if useruid.intValue != -1 {\n            TCSLogWithMark(\"invalid uid. selecting next available UID.\")\n\n        }\n\n        completeLogin(authResult:.allow)\n\n    }\n    func updateSize(){\n        self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.stackView.frame.size.height +  64)\n    \n    }\n    override func viewDidLayout() {\n\n        TCSLogWithMark(\"viewDidLayout\")\n        updateSize()\n    }\n\n    @objc func setupLoginAppearance() {\n        TCSLogWithMark()\n        self.view.layer?.cornerRadius=15\n        let ccidSlotName = DefaultsOverride.standardOverride.string(forKey: PrefKeys.ccidSlotName.rawValue)\n\n        let shouldAllowLoginCardSetup = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldAllowLoginCardSetup.rawValue)\n\n        tapLoginLabel.isHidden=true\n        loginCardSetupButton.isHidden=true\n        self.loginCardSetupButton.state = .off\n\n        if let _ = ccidSlotName {\n            if let _ = rfidUsers {\n                //we have users so show text\n                tapLoginLabel.isHidden=false\n            }\n            else {\n                tapLoginLabel.isHidden=true\n            }\n\n            if shouldAllowLoginCardSetup == true {\n                tapLoginLabel.isHidden=false\n\n            }\n\n        }\n\n        alertTextField.isHidden=true\n\n        self.usernameTextField.stringValue=\"\"\n        self.passwordTextField.stringValue=\"\"\n\n        logoImageView.isHidden=false\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldHideLoginWindowLogo.rawValue) == true {\n            logoImageView.isHidden=true\n\n        }\n        else if let loginWindowLogoPath = DefaultsOverride.standardOverride.string(forKey: PrefKeys.loginWindowLogoPath.rawValue){\n            if let image = NSImage.imageFromPathOrURL(pathURLString: loginWindowLogoPath){\n                logoImageView.image=image\n            }\n        }\n        self.usernameTextField.wantsLayer=true\n        self.view.wantsLayer=true\n//        self.view.frame=CGRectInset(self.view.frame, 0,32+128-logoImageView.frame.height)\n        self.view.layer?.backgroundColor = CGColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.7)\n        localOnlyCheckBox.isEnabled=true\n        localOnlyCheckBox.isHidden=false\n        // make things look better\n        TCSLogWithMark(\"Tweaking appearance\")\n\n        if let usernamePlaceholder = UserDefaults.standard.string(forKey: PrefKeys.usernamePlaceholder.rawValue){\n            TCSLogWithMark(\"Setting username placeholder: \\(usernamePlaceholder)\")\n            self.usernameTextField.placeholderString=usernamePlaceholder\n        }\n        self.usernameTextField.isEnabled=true\n\n        if let passwordPlaceholder = UserDefaults.standard.string(forKey: PrefKeys.passwordPlaceholder.rawValue){\n            TCSLogWithMark(\"Setting password placeholder\")\n\n            self.passwordTextField.placeholderString=passwordPlaceholder\n\n        }\n        passwordTextField.isEnabled=true\n        signIn.isEnabled=true\n        TCSLogWithMark(\"Domain is \\(domainName)\")\n        if UserDefaults.standard.bool(forKey: PrefKeys.shouldShowLocalOnlyCheckbox.rawValue) == false {\n            TCSLogWithMark(\"hiding local only\")\n\n            self.localOnlyCheckBox.isHidden = true\n            self.localOnlyCheckBox.isHidden = true\n        }\n        else {\n            //show based on if there is an AD domain or not\n\n            let isLocalOnly = self.domainName.isEmpty == true && UserDefaults.standard.bool(forKey: PrefKeys.shouldUseROPGForLoginWindowLogin.rawValue) == false\n            self.localOnlyCheckBox.isHidden = isLocalOnly\n        }\n\n    }\n\n    func showResetUI() throws  {\n        TCSLogWithMark()\n\n        let changePasswordWindowController = UpdatePasswordWindowController.init(windowNibName: NSNib.Name(\"UpdatePasswordWindowController\"))\n\n        changePasswordWindowController.window?.canBecomeVisibleWithoutLogin=true\n        changePasswordWindowController.window?.isMovable = true\n        changePasswordWindowController.window?.canBecomeVisibleWithoutLogin = true\n        changePasswordWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n        TCSLogWithMark(\"resetting level\")\n        changePasswordWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n\n        changePasswordWindowController.window?.forceToFrontAndFocus(self)\n        let response = NSApp.runModal(for: changePasswordWindowController.window!)\n        changePasswordWindowController.window?.close()\n        TCSLogWithMark(\"response: \\(response.rawValue)\")\n\n        if response == .cancel {\n            throw SignInViewControllerResetPasswordError.cancelled\n        }\n\n        if let pass = changePasswordWindowController.password {\n            newPassword = pass\n        }\n        if let currPassword = changePasswordWindowController.currentPassword {\n            passString=currPassword\n        }\n\n        isResetPasswordInProgress=true\n\n\n        networkAuth()\n    }\n\n    fileprivate func shakeWindowAndShowError(_ message: String?=nil) {\n        XCredsAudit().auditError(message ?? \"Empty\")\n        TCSLogWithMark(message ?? \"\")\n        nomadSession = nil\n        passwordTextField.stringValue = \"\"\n        passwordTextField.shake(self)\n        alertTextField.isHidden=false\n        if message?.lowercased() == \"preauthentication failed\" {\n            alertTextField.stringValue = \"Authentication Failed\"\n        }\n        else if message?.lowercased() == \"unknown ad user\" {\n            alertTextField.stringValue = \"Authentication Failed\"\n        }\n        else {\n            alertTextField.stringValue = message ?? \"Authentication Failed\"\n        }\n        setLoginWindowState(enabled: true)\n        view.window?.makeFirstResponder(passwordTextField)\n    }\n\n    /// Simple toggle to change the state of the NoLo window UI between active and inactive.\n    fileprivate func setLoginWindowState(enabled:Bool) {\n        TCSLogWithMark()\n\n        if signIn != nil && usernameTextField != nil && passwordTextField != nil && localOnlyCheckBox != nil {\n            signIn.isEnabled = enabled\n            TCSLogWithMark()\n            usernameTextField.isEnabled = enabled\n            passwordTextField.isEnabled = enabled\n            localOnlyCheckBox.isEnabled = enabled\n\n            TCSLogWithMark()\n        }\n    }\n\n    func setupLoginCard(completion:(_ result:Bool, _ pin:String?)->Void) {\n\n        let pinSetWindowController = PinSetWindowController(windowNibName: \"PinSetWindowController\")\n        let res = NSApp.runModal(for: pinSetWindowController.window!)\n\n        if res == .cancel {\n           pinSetWindowController.window?.close()\n           completion(false,nil)\n           return\n       }\n\n        else {\n            completion(true,pinSetWindowController.pin)\n        }\n\n\n\n//        if setupCardWindowController == nil {\n//            setupCardWindowController = SetupCardWindowController(windowNibName:\"SetupCardWindowController\")\n//        }\n//        setupCardWindowController?.window?.canBecomeVisibleWithoutLogin=true\n\n//        if let setupCardWindow = setupCardWindowController?.window {\n//            let res = NSApp.runModal(for: setupCardWindow)\n//            if res == .OK {\n//                if let uid = setupCardWindowController?.uid {\n//                    completion(true, uid, setupCardWindowController?.pin)\n//                }\n//                else {\n//                    TCSLogWithMark(\"no uid\")\n//                }\n//            }\n//            else {\n//                TCSLogWithMark(\"result is not ok\")\n//                setupCardWindowController=nil\n//                completion(false,nil, nil)\n//\n//            }\n//        }\n    }\n\n    /// When the sign in button is clicked we check a few things.\n    ///\n    /// 1. Check to see if the username field is blank, bail if it is. If not, animate the UI and process the user strings.\n    ///\n    /// 2. Check the user shortname and see if the account already exists in DSLocal. If so, simply set the hints and pass on.\n    ///\n    /// 3. Create a `NoMADSession` and see if we can authenticate as the user.\n    @IBAction func signInButtonPressed(_ sender: Any) {\n        TCSLogWithMark(\"Sign In button pressed\")\n        let strippedUsername = usernameTextField.stringValue.trimmingCharacters(in:  CharacterSet.whitespaces)\n\n        if strippedUsername.isEmpty {\n            usernameTextField.shake(self)\n            TCSLogWithMark(\"No username entered\")\n            return\n        }\n        else if passString.isEmpty {\n            passwordTextField.shake(self)\n            view.window?.makeFirstResponder(passwordTextField)\n\n            TCSLogWithMark(\"No password entered\")\n            return\n        }\n        if (self.localOnlyCheckBox.state == .off)  {\n            updateLoginWindowInfo()\n        }\n        else {\n\n            shortName = strippedUsername\n        }\n        processLogin(inShortname: shortName, inPassword: passString)\n\n    }\n\n    func processLogin(inShortname:String, inPassword:String)  {\n\n        TCSLogWithMark()\n\n        setLoginWindowState(enabled: false)\n\n        if (self.domainName.isEmpty==true && UserDefaults.standard.bool(forKey: PrefKeys.shouldUseROPGForLoginWindowLogin.rawValue) == false) || self.localOnlyCheckBox.state == .on{\n            TCSLogWithMark(\"do local auth only\")\n            guard let resolvedName = try? PasswordUtils.resolveName(shortName) else {\n                usernameTextField.shake(self)\n                passwordTextField.shake(self)\n                TCSLogWithMark(\"No user found for user \\(shortName)\")\n                shakeWindowAndShowError()\n                return\n            }\n            shortName = resolvedName\n\n            switch PasswordUtils.isLocalPasswordValid(userName: shortName, userPass: passString) {\n\n            case .success:\n                setRequiredHintsAndContext()\n                mechanismDelegate?.setHint(type: .localLogin, hint: true as NSSecureCoding )\n\n                if loginCardSetupButton.state == .on, let uid = unprovisionedRfidUid {\n                    shouldIgnoreInsertion=true\n                    setupLoginCard { result,pin  in\n                        if result==true{\n\n                            TCSLogWithMark(\"setting rfid uid: \\(uid)\")\n                            mechanismDelegate?.setHint(type: .rfidUid, hint: uid as NSSecureCoding)\n\n                            if let pin = pin {\n                                TCSLogWithMark(\"setting pin\")\n                                mechanismDelegate?.setHint(type: .rfidPIN, hint: pin as NSSecureCoding)\n                            }\n                            shouldIgnoreInsertion=false\n                            completeLogin(authResult:.allow)\n                        }\n                        else {\n                            shouldIgnoreInsertion=false\n                            TCSLogWithMark(\"failed to set up Login card\")\n                            shakeWindowAndShowError(\"Login Card Setup Failed\")\n                            return\n\n                        }\n\n                    }\n                }\n                else {\n                    completeLogin(authResult:.allow)\n                    return\n\n                }\n\n            case .incorrectPassword:\n                TCSLogWithMark(\"incorrectPassword\")\n                shakeWindowAndShowError()\n                return\n\n            case .accountDoesNotExist:\n                TCSLogWithMark(\"accountDoesNotExist\")\n                shakeWindowAndShowError()\n                return\n\n            case .accountLocked:\n                TCSLogWithMark(\"accountLocked so we prompt\")\n                if let mech = mechanismDelegate {\n                    \n                    let localAdmin = mech.getHint(type: .localAdmin) as? LocalAdminCredentials\n                    self.localAdmin = localAdmin\n                    switch mech.unsyncedPasswordPrompt(username: inShortname, password: inPassword, accountLocked: true, localAdmin: localAdmin, showResetButton: true){\n\n                    case .success:\n                        setRequiredHintsAndContext()\n                        mechanismDelegate?.setHint(type: .localLogin, hint: true as NSSecureCoding )\n                        completeLogin(authResult:.allow)\n                        break\n                    case .failure(_):\n                        shakeWindowAndShowError(\"account locked auth failure\")\n                        return\n\n                    case .userCancelled:\n                        shakeWindowAndShowError(\"Account locked, user cancelled\")\n                        return\n\n                    }\n                }\n                else {\n                    TCSLogWithMark(\"the mechanism delegate is nil\")\n                    shakeWindowAndShowError()\n                    return\n                }\n\n            case .other(let mesg ):\n                TCSLogWithMark(\"message: \\(mesg)\")\n                shakeWindowAndShowError()\n                return\n            }\n        }\n        else if UserDefaults.standard.bool(forKey: PrefKeys.shouldUseROPGForLoginWindowLogin.rawValue) == true {\n\n            TCSLogWithMark(\"Checking credentials using ROPG\")\n\n            tokenManager.feedbackDelegate=self\n\n            shortName = inShortname\n\n            let shouldUseBasicAuthWithROPG = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseBasicAuthWithROPG.rawValue)\n\n            var overrrideErrorArray = [String]()\n            let ropgResponseValue = DefaultsOverride.standardOverride.string(forKey: PrefKeys.ropgResponseValue.rawValue)\n\n            if let ropgResponseValue = ropgResponseValue {\n                overrrideErrorArray.append(ropgResponseValue)\n            }\n\n            Task{\n\n                //Try with ROPG. We cannot override errors because otherwise we don't get a token back so that is bad.\n                //so that means no MFA, but that is fine since we are interactive login and if you wanted MFA, you can\n                //use a different OIDC flow with a web view.\n\n                do{\n                    let tokenResponse = try await tokenManager.oidc().requestTokenWithROPG(username: inShortname, password: inPassword, basicAuth: shouldUseBasicAuthWithROPG, overrideErrors: nil)\n\n                    //\n                    if tokenResponse==nil {\n                        tokenError(\"ROPG failed. No token returned.\")\n                        return\n                    }\n\n                    if let tokenResponse = tokenResponse {\n                        _ = Creds(password: inPassword, tokens: tokenResponse)\n                        completeLogin(authResult:.allow)\n\n                    }\n                }\n                catch {\n                    shakeWindowAndShowError(\"ROPG failed: \\(error.localizedDescription)\")\n\n                }\n            }\n        }\n        else { // AD. So auth\n            TCSLogWithMark(\"network auth.\")\n            networkAuth()\n        }\n    }\n    fileprivate func networkAuth() {\n\n        if shortName.isEmpty {\n            if let user = try? PasswordUtils.getLocalRecord(getConsoleUser()),\n                  let kerbPrincArray = user.value(forKey: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\") as? Array <String>,\n               let kerbPrinc = kerbPrincArray.first\n            {\n                shortName=kerbPrinc\n            }\n        }\n\n\n        if domainName.isEmpty, let prefDomainName=getManagedPreference(key: .ADDomain) as? String{\n            domainName = prefDomainName\n        }\n        nomadSession = NoMADSession.init(domain: domainName, user: shortName)\n        TCSLogWithMark(\"NoMAD Login User: \\(shortName), Domain: \\(domainName)\")\n        guard let session = nomadSession else {\n            TCSLogErrorWithMark(\"Could not create NoMADSession\")\n            return\n        }\n        session.useSSL = isSSLRequired\n        session.userPass = passString\n        session.delegate = self\n        session.recursiveGroupLookup = getManagedPreference(key: .RecursiveGroupLookup) as? Bool ?? false\n        \n\n        if let customLDAPAttributes = getManagedPreference(key: .CustomLDAPAttributes) as? Array<String> {\n            TCSLogWithMark(\"Adding requested Custom Attributes:\\(customLDAPAttributes)\")\n            session.customAttributes=customLDAPAttributes\n        }\n\n        if let ignoreSites = getManagedPreference(key: .IgnoreSites) as? Bool {\n            os_log(\"Ignoring AD sites\", log: uiLog, type: .debug)\n\n            session.siteIgnore = ignoreSites\n        }\n        \n        if let ldapServers = getManagedPreference(key: .LDAPServers) as? [String] {\n            TCSLogWithMark(\"Adding custom LDAP servers\")\n\n            session.ldapServers = ldapServers\n        }\n        \n        TCSLogWithMark(\"Attempt to authenticate user\")\n        session.authenticate()\n    }\n\n\n    /// Format the user and domain from the login window depending on the mode the window is in.\n    ///\n    /// I.e. are we picking a domain from a list, using a managed domain, or putting it on the user name with '@'.\n    fileprivate func updateLoginWindowInfo() {\n\n        TCSLogWithMark(\"Format user and domain strings\")\n        TCSLogWithMark()\n\n        domainName = \"\"\n        let strippedUsername = usernameTextField.stringValue.trimmingCharacters(in:  CharacterSet.whitespaces)\n        shortName = strippedUsername\n\n\n        TCSLogWithMark()\n        let adDomainFromPrefs = DefaultsOverride.standardOverride.string(forKey: PrefKeys.aDDomain.rawValue)\n        var allDomainsFromPrefs = DefaultsOverride.standardOverride.array(forKey: PrefKeys.additionalADDomainList.rawValue)  as? [String] ?? []\n\n        if let adDomainFromPrefs=adDomainFromPrefs  {\n            allDomainsFromPrefs.append(adDomainFromPrefs)\n        }\n        allDomainsFromPrefs = allDomainsFromPrefs.map { currVal in\n            currVal.uppercased()\n        }\n\n        if strippedUsername.range(of:\"@\") != nil {\n            shortName = (strippedUsername.components(separatedBy: \"@\").first)!\n\n            if let providedDomainName = (strippedUsername.components(separatedBy: \"@\").last)?.uppercased(){\n                domainName = providedDomainName\n\n            }\n        }\n\n        if let upnMappings = DefaultsOverride.standardOverride.array(forKey: PrefKeys.upnSuffixToDomainMappings.rawValue)  as? [[String:String]]{\n            for upnMapping in upnMappings {\n                if let upn = upnMapping[\"upn\"]?.uppercased(),\n                    let mappedDomain = upnMapping[\"domain\"]?.uppercased(),\n                    upn == domainName.uppercased()\n                {\n                    TCSLogWithMark(\"changing domain from \\(domainName) to \\(mappedDomain)\")\n                    domainName = mappedDomain\n                    break\n                }\n\n            }\n        }\n\n\n\n        if domainName != \"\", allDomainsFromPrefs.contains(domainName.uppercased())==false {\n            TCSLogWithMark(\"domain \\(domainName) is not the adDomain or in additionalADDomainList.\")\n            domainName = \"\"\n        }\n        if  domainName == \"\",\n            let managedDomain = getManagedPreference(key: .ADDomain) as? String {\n            TCSLogWithMark(\"Defaulting to managed domain as there is nothing else\")\n            domainName = managedDomain\n            TCSLogWithMark(\"Using domain from managed domain\")\n\n        }\n        return\n    }\n\n\n    //MARK: - Login Context Functions\n\n    /// Set the authorization and context hints. These are the basics we need to passthrough to the next mechanism.\n    fileprivate func setRequiredHintsAndContext() {\n        TCSLogWithMark()\n        TCSLogWithMark(\"Setting hints for user: \\(shortName)\")\n        TCSLogWithMark(\"Setting user to \\(shortName)\")\n\n        mechanismDelegate?.setHint(type: .user, hint: shortName as NSSecureCoding)\n        mechanismDelegate?.setHint(type: .pass, hint: passString as NSSecureCoding)\n        TCSLogWithMark()\n        os_log(\"Setting context values for user: %{public}@\", log: uiLog, type: .debug, shortName)\n        mechanismDelegate?.setContextString(type: kAuthorizationEnvironmentUsername, value: shortName)\n        mechanismDelegate?.setContextString(type: kAuthorizationEnvironmentPassword, value: passString)\n        TCSLogWithMark()\n\n    }\n\n\n    /// Complete the login process and either continue to the next Authorization Plugin or reset the NoLo window.\n    ///\n    /// - Parameter authResult:`Authorizationresult` enum value that indicates if login should proceed.\n    fileprivate func completeLogin(authResult: AuthorizationResult) {\n\n\n        switch authResult {\n        case .allow:\n            TCSLogWithMark(\"Complete login process with allow\")\n            XCredsAudit().loginWindowLogin(user:shortName)\n            mechanismDelegate?.allowLogin()\n\n        case .deny:\n            TCSLogWithMark(\"Complete login process with deny\")\n            mechanismDelegate?.denyLogin(message:nil)\n            NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"error\":\"Login Denied\",\"cause\":authResult])\n\n\n        case .userCanceled:\n            TCSLogWithMark(\"Complete login process with deny\")\n            mechanismDelegate?.denyLogin(message:nil)\n            NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"error\":\"User Cancelled\", \"cause\":authResult])\n\n        default:\n            TCSLogWithMark(\"deny login process with unknown error\")\n            mechanismDelegate?.denyLogin(message:nil)\n            NotificationCenter.default.post(name: Notification.Name(\"TCSTokensUpdated\"), object: self, userInfo:[\"error\":\"Unknown error\",\"cause\":authResult])\n\n        }\n        TCSLogWithMark()\n//        NSApp.stopModal()\n    }\n\n    //MARK: - Update Local User Account Methods\n\n//    fileprivate func showPasswordSync() {\n//        // hide other possible boxes\n//        TCSLogWithMark()\n//\n//        let passwordWindowController = PromptForLocalPasswordWindowController.init(windowNibName: NSNib.Name(\"LoginPasswordWindowController\"))\n//\n//        passwordWindowController.window?.canBecomeVisibleWithoutLogin=true\n//        passwordWindowController.window?.isMovable = false\n//        passwordWindowController.window?.canBecomeVisibleWithoutLogin = true\n//        passwordWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n//        var isDone = false\n//        while (!isDone){\n//            DispatchQueue.main.async{\n//                TCSLogWithMark(\"resetting level\")\n//                passwordWindowController.window?.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue)\n//            }\n//\n//            let response = NSApp.runModal(for: passwordWindowController.window!)\n//            passwordWindowController.window?.close()\n//\n//            if response == .cancel {\n//                isDone=true\n//                TCSLogWithMark(\"User cancelled resetting keychain or entering password. Denying login\")\n//                completeLogin(authResult: .deny)\n//\n//                return\n//            }\n//\n//            let localPassword = passwordWindowController.password\n//            guard let localPassword = localPassword else {\n//                continue\n//            }\n//            do {\n//                os_log(\"Password doesn't match existing local. Try to change local pass to match.\", log: uiLog, type: .default)\n//                let localUser = try getLocalRecord(shortName)\n//                try localUser.changePassword(localPassword, toPassword: passString)\n//                os_log(\"Password sync worked, allowing login\", log: uiLog, type: .default)\n//\n//                isDone=true\n//                mechanism?.setHint(type: .existingLocalUserPassword, hint: localPassword)\n//                completeLogin(authResult: .allow)\n//                return\n//            } catch {\n//                os_log(\"Unable to sync local password to Network password. Reload and try again\", log: uiLog, type: .error)\n//                return\n//            }\n//\n//\n//        }\n//\n//    }\n    \n\n    fileprivate func showMigration(password:String) {\n\n        TCSLogWithMark()\n        switch SelectLocalAccountWindowController.selectLocalAccountAndUpdate(newPassword: password) {\n\n        case .successful(let username):\n            TCSLogWithMark(\"Successful local account verification. Allowing\")\n            shortName = username\n            setRequiredHintsAndContext()\n            completeLogin(authResult: .allow)\n            return\n\n        case .canceled:\n            TCSLogWithMark(\"selectLocalAccountAndUpdate cancelled\")\n            completeLogin(authResult: .deny)\n            return\n        case .createNewAccount:\n            TCSLogWithMark(\"selectLocalAccountAndUpdate createNewAccount\")\n            completeLogin(authResult: .allow)\n\n        case .error(let error):\n            TCSLogWithMark(\"selectLocalAccountAndUpdate error:\\(error)\")\n            completeLogin(authResult: .deny)\n\n        }\n        //need to prompt for username and passsword to select an account. Perhaps use code from the cloud login.\n//        //RunLoop.main.perform {\n//        // hide other possible boxes\n//        os_log(\"Showing migration box\", log: uiLog, type: .default)\n//\n//        self.loginStack.isHidden = true\n//        self.signIn.isHidden = true\n//        self.signIn.isEnabled = true\n//\n//        // show migration box\n//        self.migrateBox.isHidden = false\n//        self.migrateSpinner.isHidden = false\n//        self.migrateUsers.addItems(withTitles: self.localCheck.migrationUsers ?? [\"\"])\n//        //}\n    }\n    \n//    @IBAction func clickMigrationOK(_ sender: Any) {\n//        RunLoop.main.perform {\n//            self.migrateSpinner.isHidden = false\n//            self.migrateSpinner.startAnimation(nil)\n//        }\n//        \n//        let migrateUIPass = self.migratePassword.stringValue\n//        if migrateUIPass.isEmpty {\n//            os_log(\"No password was entered\", log: uiLog, type: .error)\n//            RunLoop.main.perform {\n//                self.migrateSpinner.isHidden = true\n//                self.migrateSpinner.stopAnimation(nil)\n//            }\n//            return\n//        }\n//        \n//        // Take a look to see if we are syncing passwords. Until the next refactor the easiest way to tell is if the picklist is hidden.\n//        if self.migrateUsers.isHidden {\n//            do {\n//                os_log(\"Password doesn't match existing local. Try to change local pass to match.\", log: uiLog, type: .default)\n//                let localUser = try getLocalRecord(shortName)\n//                try localUser.changePassword(migrateUIPass, toPassword: passString)\n//                didUpdateFail = false\n//                passChanged = false\n//                os_log(\"Password sync worked, allowing login\", log: uiLog, type: .default)\n//                delegate?.setHint(type: .existingLocalUserPassword, hint: migrateUIPass)\n//                completeLogin(authResult: .allow)\n//                return\n//            } catch {\n//                os_log(\"Unable to sync local password to Network password. Reload and try again\", log: uiLog, type: .error)\n//                didUpdateFail = true\n//                showPasswordSync()\n//                return\n//            }\n//        }\n//        guard let migrateToUser = self.migrateUsers.selectedItem?.title else {\n//            os_log(\"Could not select user to migrate from pick list.\", log: uiLog, type: .error)\n//            return\n//        }\n//        do {\n//            os_log(\"Getting user record for %{public}@\", log: uiLog, type: .default, migrateToUser)\n//            migrateUserRecord = try getLocalRecord(migrateToUser)\n//            os_log(\"Checking existing password for %{public}@\", log: uiLog, type: .default, migrateToUser)\n//            if migrateUIPass != passString {\n//                os_log(\"No match. Upating local password for %{public}@\", log: uiLog, type: .default, migrateToUser)\n//                try migrateUserRecord?.changePassword(migrateUIPass, toPassword: passString)\n//            } else {\n//                os_log(\"Okta and local passwords matched for %{public}@\", log: uiLog, type: .default, migrateToUser)\n//            }\n//            // Mark the record to add an alias if required\n//            os_log(\"Setting hints for %{public}@\", log: uiLog, type: .default, migrateToUser)\n//            delegate?.setHint(type: .existingLocalUserName, hint: migrateToUser)\n//            delegate?.setHint(type: .existingLocalUserPassword, hint: migrateUIPass)\n//            os_log(\"Allowing login\", log: uiLog, type: .default, migrateToUser)\n//            completeLogin(authResult: .allow)\n//        } catch {\n//            os_log(\"Migration failed with: %{public}@\", log: uiLog, type: .error, error.localizedDescription)\n//            return\n//        }\n//        \n//        // if we are here, the password didn't work\n//        os_log(\"Unable to migrate user.\", log: uiLog, type: .error)\n//        self.migrateSpinner.isHidden = true\n//        self.migrateSpinner.stopAnimation(nil)\n//        self.migratePassword.stringValue = \"\"\n//        self.completeLogin(authResult: .deny)\n//    }\n//    \n//    @IBAction func clickMigrationCancel(_ sender: Any) {\n//        passChanged = false\n//        didUpdateFail = false\n//        completeLogin(authResult: .deny)\n//    }\n//    \n//    @IBAction func clickMigrationNo(_ sender: Any) {\n//        // user doesn't want to migrate, so create a new account\n//        completeLogin(authResult: .allow)\n//    }\n    \n//    @IBAction func clickMigrationOverwrite(_ sender: Any) {\n//        // user wants to overwrite their current password\n//        os_log(\"Password Overwrite selected\", log: uiLog, type: .default)\n//        localCheck.mech = self.mech\n//        delegate?.setHint(type: .passwordOverwrite, hint: true)\n//        completeLogin(authResult: .allow)\n//    }\n    \n//    @IBAction func showNetworkConnection(_ sender: Any) {\n//        username.isHidden = true\n//        guard let windowContentView = self.window?.contentView, let wifiView = WifiView.createFromNib(in: .mainLogin) else {\n//            os_log(\"Error showing network selection.\", log: uiLog, type: .debug)\n//            return\n//        }\n//\n//        wifiView.frame = windowContentView.frame\n//        let completion = {\n//            os_log(\"Finished working with wireless networks\", log: uiLog, type: .debug)\n//            self.username.isHidden = false\n//            self.username.becomeFirstResponder()\n//        }\n//        wifiView.set(completionHandler: completion)\n//        windowContentView.addSubview(wifiView)\n//    }\n//\n//    @IBAction func clickInfo(_ sender: Any) {\n//        if sysInfo.count > sysInfoIndex + 1 {\n//            sysInfoIndex += 1\n//        } else {\n//            sysInfoIndex = 0\n//        }\n//\n//        systemInfo.title = sysInfo[sysInfoIndex]\n//        os_log(\"System information toggled\", log: uiLog, type: .debug)\n//    }\n//    func verify() {\n//\n//            if XCredsBaseMechanism.checkForLocalUser(name: shortName) {\n//                TCSLogWithMark()\n//                os_log(\"Verify local user login for %{public}@\", log: uiLog, type: .default, shortName)\n//\n//                if getManagedPreference(key: .DenyLocal) as? Bool ?? false {\n//                    os_log(\"DenyLocal is enabled, looking for %{public}@ in excluded users\", log: uiLog, type: .default, shortName)\n//\n//                    var exclude = false\n//\n//                    if let excludedUsers = getManagedPreference(key: .DenyLocalExcluded) as? [String] {\n//                        if excludedUsers.contains(shortName) {\n//                            os_log(\"Allowing local sign in via exclusions %{public}@\", log: uiLog, type: .default, shortName)\n//                            exclude = true\n//                        }\n//                    }\n//\n//                    if !exclude {\n//                        os_log(\"No exclusions for %{public}@, denying local login. Forcing network auth\", log: uiLog, type: .default, shortName)\n//                        networkAuth()\n//                        return\n//                    }\n//                }\n//                TCSLogWithMark()\n//                if PasswordUtils.verifyUser(name: shortName, auth: passString) {\n//                    TCSLogWithMark()\n//                    os_log(\"Allowing local user login for %{public}@\", log: uiLog, type: .default, shortName)\n//                    setRequiredHintsAndContext()\n//                    TCSLogWithMark()\n//                    completeLogin(authResult: .allow)\n//                    return\n//                } else {\n//                    os_log(\"Could not verify %{public}@\", log: uiLog, type: .default, shortName)\n//                    authFail()\n//                    return\n//                }\n//            }\n//\n//    }\n\n}\n\n\n//MARK: - NoMADUserSessionDelegate\n@available(macOS, deprecated: 11)\nextension SignInViewController: NoMADUserSessionDelegate {\n\n    func NoMADAuthenticationFailed(error: NoMADSessionError, description: String) {\n\n        if isResetPasswordInProgress==true {\n\n            isResetPasswordInProgress=false\n\n            if error == .PasswordExpired {\n                TCSLogWithMark(\"Password expired so go ahead and changing it\")\n                changePassword()\n                return\n\n            }\n            else {\n\n                let alert = NSAlert()\n                alert.addButton(withTitle: \"OK\")\n                alert.messageText=\"Your current password is invalid. Please try again.\"\n\n                alert.window.canBecomeVisibleWithoutLogin=true\n\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n                if let bundle = bundle {\n                    TCSLogWithMark(\"Found bundle\")\n                    alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n                }\n                alert.runModal()\n\n                return\n            }\n        }\n        updateCredentialsFeedbackDelegate?.kerberosTicketCheckFailed(error)\n\n        TCSLogWithMark(\"AuthenticationFailed: \\(description)\")\n        switch error {\n        case .PasswordExpired:\n            TCSLogErrorWithMark(\"Password is expired or requires change.\")\n            if DefaultsOverride().bool(forKey: PrefKeys.shouldPromptForADPasswordChange.rawValue) == false {\n\n                shakeWindowAndShowError(\"Password is expired or requires change.\")\n                return\n            }\n            do {\n                try showResetUI()\n            }\n            catch {\n                TCSLogWithMark(\"\\(error)\")\n                setLoginWindowState(enabled: true)\n\n            }\n        case .OffDomain, .UnknownPrincipal:\n            TCSLogErrorWithMark(\"\\(error)\")\n\n            if getManagedPreference(key: .LocalFallback) as? Bool ?? false, case .success = PasswordUtils.isLocalPasswordValid(userName: shortName, userPass: passString) {\n                mechanismDelegate?.setHint(type: .localLogin, hint: true as NSSecureCoding)\n                setRequiredHintsAndContext()\n                completeLogin(authResult: .allow)\n            } else {\n                if error == .OffDomain {\n                    TCSLogErrorWithMark(\"AD authentication failed, off domain.\")\n                    shakeWindowAndShowError(\"Cannot reach domain controller\")\n\n                }\n                else if error == .UnknownPrincipal {\n                    TCSLogErrorWithMark(\"AD authentication failed, Unknown AD User.\")\n                    shakeWindowAndShowError(\"Unknown AD User\")\n                }\n                else {\n                    TCSLogErrorWithMark(\"Unknown Error\")\n                    shakeWindowAndShowError(\"Unknown Error\")\n\n                }\n\n            }\n        default:\n            TCSLogErrorWithMark(\"NoMAD Login Authentication failed with: \\(description):\\(error.rawValue)\")\n\n                shakeWindowAndShowError(description)\n//\n            return\n        }\n    }\n\n\n    func NoMADAuthenticationSucceeded() {\n        updateCredentialsFeedbackDelegate?.kerberosTicketUpdated()\n\n        if getManagedPreference(key: .RecursiveGroupLookup) as? Bool ?? false {\n            nomadSession?.recursiveGroupLookup = true\n        }\n        \n        if isResetPasswordInProgress==true {\n            TCSLogWithMark(\"changing password and then returning\")\n            isResetPasswordInProgress = false\n            changePassword()\n            return\n        }\n            // need to ensure the right password is stashed\n\n        \n        if isInUserSpace==true {\n            if hadPasswordFailure==true {\n                TCSLogWithMark(\"had password failure, updating keychain with new password\")\n                hadPasswordFailure = false\n                try? updateCurrentUserKeychain(updatedPassword: passString)\n            }\n\n            self.view.window?.close()\n        }\n        TCSLogWithMark(\"Authentication succeeded, requesting user info\")\n        nomadSession?.userInfo()\n    }\n\n    func changePassword()  {\n        TCSLogWithMark(\"Changing password\")\n        guard let session = nomadSession else {\n            TCSLogWithMark(\"invalid session\")\n            return\n        }\n        session.oldPass = passString\n        session.newPass = newPassword\n        os_log(\"Attempting password change for %{public}@\", log: uiLog, type: .debug, shortName)\n\n        TCSLogWithMark(\"Attempting password change\")\n\n        do {\n            try session.changeKerberosPassword()\n\n            if isInUserSpace==true {\n                try updateCurrentUserKeychain(updatedPassword: newPassword)\n                passString = newPassword\n                NotificationCenter.default.post(name: NSNotification.Name(\"KerberosPasswordChanged\"), object: [\"updatedPassword\":newPassword])\n                let alert = NSAlert()\n                alert.addButton(withTitle: \"OK\")\n                alert.messageText=\"Password changed successfully.\"\n\n                alert.window.canBecomeVisibleWithoutLogin=true\n\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n                if let bundle = bundle {\n                    TCSLogWithMark(\"Found bundle\")\n                    alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n                }\n                alert.runModal()\n                session.userPass = newPassword\n                session.authenticate(authTestOnly: false)\n\n            }\n            else {\n                TCSLogWithMark(\"Setting current password to change later and authenticating with new password\")\n                let localUser = try getLocalRecord(shortName)\n\n                //try to change the password, but if the admin changed it out of band, we don't\n                //fail here and prompt later\n                try? localUser.changePassword(passString, toPassword: newPassword)\n\n                mechanismDelegate?.setHint(type: .existingLocalUserPassword, hint: passString as NSSecureCoding)\n                passString = newPassword\n                session.userPass = newPassword\n                session.authenticate(authTestOnly: false)\n\n            }\n\n\n\n        }\n        catch {\n            TCSLogWithMark(\"Error changing password: \\(error)\")\n            let alert = NSAlert()\n            alert.addButton(withTitle: \"OK\")\n            alert.messageText=\"Error changing password\"\n\n            alert.window.canBecomeVisibleWithoutLogin=true\n\n            let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n            if let bundle = bundle {\n                TCSLogWithMark(\"Found bundle\")\n                alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n            }\n            alert.runModal()\n\n            setLoginWindowState(enabled: true)\n        }\n    }\n    func updateCurrentUserKeychain(updatedPassword:String) throws  {\n        let accountInfo = KeychainUtil().findPassword(serviceName: PrefKeys.password.rawValue,accountName: nil)\n\n        TCSLogWithMark(\"Getting account info.\")\n\n        guard let password = accountInfo?.password else {\n            TCSLogWithMark(\"no password in keychain.\")\n            throw PasswordError.invalidResult(\"no password in keychain\")\n\n        }\n\n        //change password on keychain and local account\n        TCSLogWithMark(\"change password on keychain and local account.\")\n\n        try PasswordUtils.changeLocalUserAndKeychainPassword(password, newPassword: updatedPassword)\n\n        //change entry in keychain to match new password\n        TCSLogWithMark(\"change entry in keychain to match new password\")\n\n        if KeychainUtil().updatePassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue, pass:updatedPassword, keychainPassword: updatedPassword) == false {\n            throw PasswordError.invalidResult(\"Error updating password in keychain\")\n\n        }\n        \n    }\n//callback from ADAuth framework when userInfo returns\n    func NoMADUserInformation(user: ADUserRecord) {\n\n        TCSLogWithMark(\"User Info:\\(user)\")\n        TCSLogWithMark(\"Groups:\\(user.groups)\")\n        var allowedLogin = true\n\n        if let passExpired = user.passwordExpire {\n            updateCredentialsFeedbackDelegate?.passwordExpiryUpdate(passExpired)\n\n        }\n        updateCredentialsFeedbackDelegate?.adUserUpdated(user)\n\n        TCSLogWithMark(\"Checking for DenyLogin groupsChecking for DenyLogin groups\")\n        \n        if let allowedGroups = getManagedPreference(key: .DenyLoginUnlessGroupMember) as? [String] {\n            TCSLogErrorWithMark(\"Found a DenyLoginUnlessGroupMember key value: \\(allowedGroups.debugDescription)\")\n            \n            // set the allowed login to false for now\n            \n            allowedLogin = false\n            \n            user.groups.forEach { group in\n                if allowedGroups.contains(group) {\n                    allowedLogin = true\n                    TCSLogErrorWithMark(\"User is a member of %{public}@ group. Setting allowedLogin = true \")\n                }\n            }\n        }\n    \n        let mapUID = DefaultsOverride.standardOverride.string(forKey: PrefKeys.mapUID.rawValue)\n\n        if let mapUID = mapUID, let rawAttributes = user.rawAttributes, let uidString = rawAttributes[mapUID]  {\n            mechanismDelegate?.setHint(type: .uid, hint: uidString as NSSecureCoding)\n\n        }\n        if let ntName = user.customAttributes?[\"msDS-PrincipalName\"] as? String {\n            TCSLogWithMark(\"Found NT User Name: \\(ntName)\")\n            mechanismDelegate?.setHint(type: .ntName, hint: ntName as NSSecureCoding)\n        }\n        \n        if allowedLogin {\n            \n            setHints(user: user)\n\n            // check for any migration and local auth requirements\n            let localCheck = LocalCheckAndMigrate()\n            localCheck.isInUserSpace = self.isInUserSpace\n            localCheck.delegate = mechanismDelegate\n            switch localCheck.migrationTypeRequired(userToCheck: user.shortName, passToCheck: passString, kerberosPrincipalName:user.userPrincipal) {\n\n            case .fullMigration:\n                TCSLogWithMark()\n                showMigration(password:passString)\n            case .syncPassword:\n                // first check to see if we can resolve this ourselves\n                TCSLogWithMark(\"Sync password called.\")\n\n                let promptPasswordWindowController = VerifyLocalPasswordWindowController()\n\n                promptPasswordWindowController.showResetText=true\n                promptPasswordWindowController.showResetButton=true\n\n                if isInUserSpace==true{\n                    promptPasswordWindowController.showResetText=false\n                    promptPasswordWindowController.showResetButton=false\n\n                }\n                var currUser = user.shortName\n                TCSLogWithMark(\"switch  promptPasswordWindowController\")\n                if isInUserSpace == true {\n                    let consoleUser = getConsoleUser()\n                    currUser=consoleUser\n                }\n                else {\n                    if let localAdmin = mechanismDelegate?.getHint(type: .localAdmin) as? LocalAdminCredentials, localAdmin.username.isEmpty==false {\n\n                        promptPasswordWindowController.adminUsername=localAdmin.username\n\n                        promptPasswordWindowController.adminPassword=localAdmin.password\n                    }\n                }\n\n\n                switch  promptPasswordWindowController.promptForLocalAccountAndChangePassword(username: currUser, newPassword: passString, shouldUpdatePassword: true) {\n\n                case .success(let enteredUsernamePassword):\n\n                    TCSLogWithMark(\"setting original password to use to unlock keychain later\")\n\n                    if let enteredUsernamePassword = enteredUsernamePassword{\n                        mechanismDelegate?.setHint(type: .existingLocalUserPassword, hint:enteredUsernamePassword.password as NSSecureCoding  )\n                    }\n\n                    completeLogin(authResult: .allow)\n\n                case .accountResetRequested(let usernamePasswordCredentials):\n                    TCSLogWithMark(\"resetKeychainRequested\")\n\n                    if let adminUsername = usernamePasswordCredentials?.username,\n                       let adminPassword = usernamePasswordCredentials?.password {\n                        let localAdmin = LocalAdminCredentials(username: adminUsername, password: adminPassword)\n                        TCSLogWithMark(\"Setting local admin from settings\")\n                        mechanismDelegate?.setHint(type: .localAdmin, hint:localAdmin as NSSecureCoding )\n                        mechanismDelegate?.setHint(type: .passwordOverwrite, hint: true as NSSecureCoding)\n                        completeLogin(authResult: .allow)\n\n                    }\n                    else {\n                        completeLogin(authResult: .deny)\n\n                    }\n\n\n\n                case .userCancelled:\n                    TCSLogWithMark(\"userCancelled\")\n\n                    completeLogin(authResult: .userCanceled)\n\n\n                case .error(_):\n                    TCSLogWithMark(\"error\")\n\n                    completeLogin(authResult: .deny)\n                }\n\n            case .errorSkipMigration(let mesg):\n                mechanismDelegate?.denyLogin(message:mesg)\n            case .skipMigration, .userMatchSkipMigration, .complete:\n                completeLogin(authResult: .allow)\n//            case .mappedUserFound(let foundODUserRecord):\n//                shortName = foundODUserRecord.recordName\n//                TCSLogWithMark(\"Mapped user found: \\(shortName)\")\n//                setRequiredHintsAndContext()\n//                completeLogin(authResult: .allow)\n            }\n        } else {\n            shakeWindowAndShowError()\n            TCSLogWithMark(\"auth fail\")\n//            alertText.stringValue = \"Not authorized to login.\"\n//            showResetUI()\n        }\n    }\n    \n    fileprivate func setHints(user: ADUserRecord) {\n        TCSLogWithMark()\n        TCSLogWithMark(\"NoMAD Login Looking up info\");\n        setRequiredHintsAndContext()\n        mechanismDelegate?.setHint(type: .firstName, hint: user.firstName as NSSecureCoding)\n        mechanismDelegate?.setHint(type: .lastName, hint: user.lastName as NSSecureCoding)\n        TCSLogWithMark(\"Setting user to \\(user.shortName)\")\n        mechanismDelegate?.setHint(type: .user, hint: user.shortName as NSSecureCoding)\n        mechanismDelegate?.setContextString(type: kAuthorizationEnvironmentUsername, value: user.shortName)\n\n        mechanismDelegate?.setHint(type: .noMADDomain, hint: domainName as NSSecureCoding)\n        mechanismDelegate?.setHint(type: .groups, hint: user.groups as NSSecureCoding)\n        mechanismDelegate?.setHint(type: .fullName, hint: user.fullName as NSSecureCoding)\n        TCSLogWithMark(\"setting kerberos principal to \\(user.userPrincipal)\")\n\n        mechanismDelegate?.setHint(type: .kerberos_principal, hint: user.userPrincipal as NSSecureCoding)\n        mechanismDelegate?.setHint(type: .ntName, hint: user.ntName as NSSecureCoding)\n\n        // set the network auth time to be added to the user record\n        mechanismDelegate?.setHint(type: .networkSignIn, hint: String(describing: Date.init().description) as NSSecureCoding)\n\n        if let userAttributes = user.rawAttributes{\n            TCSLogWithMark(\"Setting AD user attributes\")\n            mechanismDelegate?.setHint(type: .allADAttributes, hint:userAttributes as NSSecureCoding )\n\n        }\n\n    }\n\n}\n\n\n//MARK: - NSTextField Delegate\n@available(macOS, deprecated: 11)\nextension SignInViewController: NSTextFieldDelegate {\n    public func controlTextDidChange(_ obj: Notification) {\n        let passField = obj.object as! NSTextField\n        if passField.tag == 99 {\n            passString = passField.stringValue\n        }\n    }\n}\n\n\n//MARK: - ContextAndHintHandling Protocol\n//extension SignIn: ContextAndHintHandling {}\n\nextension NSWindow {\n\n    func shakeWindow(){\n        let numberOfShakes      = 3\n        let durationOfShake     = 0.25\n        let vigourOfShake : CGFloat = 0.015\n\n        let frame : CGRect = self.frame\n        let shakeAnimation :CAKeyframeAnimation  = CAKeyframeAnimation()\n\n        let shakePath = CGMutablePath()\n        shakePath.move(to: CGPoint(x: frame.minX, y: frame.minY))\n\n        for _ in 0...numberOfShakes-1 {\n            shakePath.addLine(to: CGPoint(x: frame.minX - frame.size.width * vigourOfShake, y: frame.minY))\n            shakePath.addLine(to: CGPoint(x: frame.minX + frame.size.width * vigourOfShake, y: frame.minY))\n        }\n\n        shakePath.closeSubpath()\n\n        shakeAnimation.path = shakePath;\n        shakeAnimation.duration = durationOfShake;\n\n        self.animations = [NSAnimatablePropertyKey(\"frameOrigin\"):shakeAnimation]\n        self.animator().setFrameOrigin(self.frame.origin)\n    }\n\n}\n\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/TCSReturnWindow.h",
    "content": "//\n//  TCSReturnWindow.h\n//\n//  Created by Tim Perfitt on 9/6/17.\n//\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface TCSReturnWindow : NSWindow\n\n@end\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/TCSReturnWindow.m",
    "content": "//\n//  TCSReturnWindow.m\n//\n//  Created by Tim Perfitt on 9/6/17.\n//\n//\n\n#import \"TCSReturnWindow.h\"\n\n@implementation TCSReturnWindow\n- (id)initWithContentRect:(NSRect)contentRect\n                styleMask:(__unused NSWindowStyleMask)aStyle\n                  backing:(__unused NSBackingStoreType)bufferingType\n                    defer:(__unused BOOL)flag {\n    \n    // Using NSBorderlessWindowMask results in a window without a title bar.\n    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];\n    if (self != nil) {\n        // Start with no transparency for all drawing into the window\n        [self setAlphaValue:0.5];\n        //Set backgroundColor to clearColor\n        self.backgroundColor = NSColor.grayColor;\n        // Turn off opacity so that the parts of the window that are not drawn into are transparent.\n//        [self setOpaque:NO];\n    }\n    return self;\n}\n@end\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/WhitePopoverBackgroundView.swift",
    "content": "//\n//  WhitePopoverBackgroundView.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 6/8/24.\n//\n\nimport Cocoa\n\nclass WhitePopoverBackgroundView: NSView {\n\n    override func draw(_ dirtyRect: NSRect) {\n        super.draw(dirtyRect)\n        NSColor.white.set()\n        bounds.fill()\n        // Drawing code here.\n    }\n    \n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/LoginWindow/xcreds_login.sh",
    "content": "#!/bin/bash\n\nscript_path=\"$0\"\nscript_folder=$(dirname \"${script_path}\")\nauthrights_path=\"${script_folder}\"/authrights\nplugin_path=\"${script_folder}\"/XCredsLoginPlugin.bundle\nplugin_resources_path=\"${plugin_path}\"/Contents/Resources\noverlay_path=\"${script_folder}\"/\"XCreds Login Overlay.app\"\noverlay_resources_path=\"${overlay_path}\"/Contents/Resources\nauth_backup_folder=/Library/\"Application Support\"/xcreds\nrights_backup_path=\"${auth_backup_folder}\"/rights.bak\nlaunch_agent_config_name=\"com.twocanoes.xcreds-overlay.plist\"\napp_launch_agent_config_name=\"com.twocanoes.xcreds-launchagent.plist\"\nlaunch_agent_destination_path=\"/Library/LaunchAgents/\"\nlaunch_agent_source_path=\"${overlay_resources_path}\"/\"${launch_agent_config_name}\"\napp_launch_agent_source_path=\"${script_folder}\"/\"${app_launch_agent_config_name}\"\n\nautofill_path=\"${target_path}/Applications/XCreds.app/Contents/Resources/XCreds Login Autofill.app/Contents/PlugIns/XCreds Login Password.appex\"\n\n\nf_install=0\nf_remove=0\nf_restore=0\n\nremove_rights () {\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:UserSetup,privileged\"\n    \"${authrights_path}\" -r  \"XCredsLoginPlugin:LoginWindow\" \"loginwindow:login\" > /dev/null\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:PowerControl,privileged\"\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:KeychainAdd,privileged\"\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:CreateUser,privileged\"\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:EnableFDE,privileged\"\n    \"${authrights_path}\" -d  \"XCredsLoginPlugin:LoginDone\"\n\n}\nwhile getopts \":ire\" o; do\n\tcase \"${o}\" in\n\t\ti)\n\t\t\tf_install=1\n\t\t;;\n\t\tr)\n\t\t\tf_remove=1\n\t\t;;\n        e)\n            f_restore=1\n        ;;\n\n\tesac\ndone\n\n\n\nif [ $(id -u) -ne 0 ]; then\n\techo please run with sudo\n\texit -1\nfi\n\n\nif [ $f_install -eq 1 ] && [ $f_remove -eq 1 ]; then\n\techo \"you can't specify both -i and -r\"\n\texit -1\nfi\n\nif [ $f_install -eq 1 ]; then\n\t\n\tif [ ! -e  \"${auth_backup_folder}\" ]; then\n\t\tmkdir -p \"${auth_backup_folder}\"\n\tfi\n\t\n\tif [ ! -e \"${rights_backup_path}\" ]; then \n\t\tsecurity authorizationdb read system.login.console > \"${rights_backup_path}\"\n\t\t\n\tfi\n\n    if [ -e \"${autofill_path}\" ]; then\n        /usr/bin/pluginkit -a \"${autofill_path}\"\n    fi\n\tif [ -e  \"${plugin_path}\" ]; then\n\t\t\n\t\tcp -R \"${plugin_path}\" \"${target_volume}\"/Library/Security/SecurityAgentPlugins/\n\t\tchown -R root:wheel \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\n\tfi\n\t#app_launch_agent_source_path\n\n\n    if [ ! -e \"${launch_agent_destination_path}\"/\"${app_launch_agent_config_name}\" ]; then\n\n        cp \"${app_launch_agent_source_path}\" \"${launch_agent_destination_path}\"\n    fi\n\n\n\tif [ ! -e \"${launch_agent_destination_path}\"/\"${launch_agent_config_name}\" ]; then\n\t\n\t\tcp \"${launch_agent_source_path}\" \"${launch_agent_destination_path}\"\n\tfi\n\n\tif [ -e ${authrights_path} ]; then\n         remove_rights\n\n        \"${authrights_path}\" -b \"loginwindow:login\" \"XCredsLoginPlugin:UserSetup,privileged\"\n        \"${authrights_path}\" -r \"loginwindow:login\" \"XCredsLoginPlugin:LoginWindow\"\n        \"${authrights_path}\" -a  \"XCredsLoginPlugin:LoginWindow\" \"XCredsLoginPlugin:PowerControl,privileged\"\n        \"${authrights_path}\" -a  \"loginwindow:done\" \"XCredsLoginPlugin:KeychainAdd,privileged\"\n        \"${authrights_path}\" -a  \"builtin:login-begin\" \"XCredsLoginPlugin:CreateUser,privileged\"\n        \"${authrights_path}\" -a  \"loginwindow:done\" \"XCredsLoginPlugin:EnableFDE,privileged\"\n        \"${authrights_path}\" -a  \"loginwindow:done\" \"XCredsLoginPlugin:LoginDone\"\n\n\telse\n\t\techo \"could not find authrights tool\"\n\t\texit -1\n\tfi\n\n\t\nelif [ $f_remove -eq 1 ]; then\n\n    remove_rights\n\n\tif [ -e  \"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\" ]; then\n\t\trm -rf \"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\"\n\t\t\n\tfi\n\t\n\tif [ -e \"${launch_agent_destination_path}\"/\"${launch_agent_config_name}\" ]; then\n\t\trm \"${launch_agent_destination_path}\"/\"${launch_agent_config_name}\"\n\tfi\n\n     if [ -e \"${launch_agent_destination_path}\"/\"${app_launch_agent_config_name}\" ]; then\n        rm \"${launch_agent_destination_path}\"/\"${app_launch_agent_config_name}\"\n    fi\n\n\nelif [ $f_restore -eq 1 ]; then\n    if [ -e \"${rights_backup_path}\" ]; then\n        security authorizationdb write system.login.console < \"${rights_backup_path}\"\n    else\n        echo \"no backup found to restore at \\\"${rights_backup_path}\\\"\"\n    fi\n\n\n\nelse \n\techo \"you must specify -i (install right), -r (remove right), or -e (restore all rights from backup).\"\n\texit -1\n\t\nfi\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/LogOnly.swift",
    "content": "//\n//  LogOnly.swift\n//  NoMADLogin\n//\n//  Created by Joel Rennich on 9/23/17.\n//  Copyright © 2017 Joel Rennich. All rights reserved.\n//\n\nimport Foundation\nimport Security.AuthorizationTags\nimport SecurityInterface.SFAuthorizationPluginView\nimport os.log\nimport LocalAuthentication\n\n/// AuthorizationPlugin mechanism that simply logs the hint and context values that are being passed around.\n@available(macOS, deprecated: 11)\nclass LogOnly : XCredsBaseMechanism {\n\n    let contextKeys = [kAuthorizationEnvironmentUsername,\n                       kAuthorizationEnvironmentPassword,\n                       kAuthorizationEnvironmentShared,\n                       kAuthorizationRightExecute,\n                       kAuthorizationEnvironmentIcon,\n                       kAuthorizationEnvironmentPrompt]\n    \n\n    // class to iterate anything in the context and hits and print them out\n    // heavily influenced by the Apple NullAuth sample code\n    \n    @objc override  func run() {\n        TCSLogErrorWithMark(\"LogOnly mech starting\")\n\n        TCSLogErrorWithMark(\"Printing security context arguments\")\n        getArguments()\n        TCSLogErrorWithMark(\"Printing LAContext Tokens\")\n//        getTokens()\n\n        TCSLogErrorWithMark(\"Printing all context values:\")\n        for item in contextKeys {\n//            TCSLogErrorWithMark(\"\\(item)\")\n\n            if let result = getContextString(type: item) {\n                TCSLogErrorWithMark(\"Context item \\(item):\\(result)\")\n            }\n        }\n\n        TCSLogErrorWithMark(\"Printing all hint values:\")\n        let hintKeys = HintType.allCases.map{$0.rawValue}\n        for item in hintKeys {\n//            TCSLogErrorWithMark(\"\\(item)\")\n\n            if let hintType = HintType(rawValue: item) {\n                if let result = getHint(type: hintType) as? String {\n                    TCSLogErrorWithMark(\"Hint item \\(item):\\(result)\")\n                }\n            }\n        }\n        TCSLogErrorWithMark(\"LogOnly mech complete\")\n        let _ = allowLogin()\n        TCSLogErrorWithMark(\"LogOnly mech complete\")\n    }\n    func getArguments() {\n        var value : UnsafePointer<AuthorizationValueVector>? = nil\n        let error = mechCallbacks.GetArguments(mechEngine, &value)\n        if error != noErr {\n//            TCSLogErrorWithMark(\"getArguments: \\(error)\")\n        }\n    }\n\n    // log only\n    func getTokens() {\n        TCSLogErrorWithMark()\n        if #available(OSX 10.13, *) {\n            TCSLogErrorWithMark(\"GetLAContext\")\n\n            var value : Unmanaged<CFArray>?\n//            defer {value?.release()}\n\n            //    public var GetTokenIdentities: @convention(c) (AuthorizationEngineRef, CFTypeRef, UnsafeMutablePointer<Unmanaged<CFArray>?>?) -> OSStatus\n\n\n            //    public var GetLAContext: @convention(c) (AuthorizationEngineRef, UnsafeMutablePointer<Unmanaged<CFTypeRef>?>?) -> OSStatus\n\n            var laContext:Unmanaged<AnyObject>?\n\n            let status = mechCallbacks.GetLAContext(mechEngine,&laContext)\n            if status != noErr{\n            }\n            else {\n                TCSLogErrorWithMark(\"no error\")\n\n                let error = mechCallbacks.GetTokenIdentities(mechEngine, laContext as CFTypeRef, &value)\n\n                TCSLogWithMark( \"Got TokenIdentities2\")\n\n                if error != noErr {\n                    TCSLogErrorWithMark(\"GetTokenIdentities error:\")\n                }\n                else {\n                    TCSLogWithMark( \"Got TokenIdentities\")\n//                    TCSLogWithMark(value.debugDescription)\n                }\n            }\n        } else {\n            os_log(\"Tokens are not supported on this version of macOS\", log: noLoMechlog, type: .default)\n\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/LogShim.swift",
    "content": "//\n//  LogShim.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/4/22.\n//\n\nimport Foundation\n\nlet noLoMechlog = \"\"\nenum ErrorType {\ncase error\ncase info\n    case noLoMechlog\n    case createUserLog\n    case `default`\ncase debug\n    case uiLog\n}\nfunc os_log(_ msg:String,log:String=\"\",type:ErrorType = .info, _ extra1:String?=\"\",_ extra2:String?=\"\",_ extra3:String?=\"\",_ extra4:String?=\"\",_ extra5:String?=\"\",_ extra6:String?=\"\",_ extra7:String?=\"\",_ extra8:String?=\"\")  {\n    TCSLogWithMark(\"\\(msg):\\(extra1 ?? \"\"):\\(extra2 ?? \"\"):\\(extra3 ?? \"\"):\\(extra4 ?? \"\"):\\(extra5 ?? \"\"):\\(extra6 ?? \"\"):\\(extra7 ?? \"\"):\\(extra8 ?? \"\")\")\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsBaseMechanism.swift",
    "content": "import Cocoa\nimport OpenDirectory\n@available(macOS, deprecated: 11)\n@objc class XCredsBaseMechanism: NSObject, XCredsMechanismProtocol, DSQueryable {\n\n    \n    func reload() {\n        fatalError()\n    }\n\n    let mechCallbacks: AuthorizationCallbacks\n    let mechEngine: AuthorizationEngineRef\n    let mech: MechanismRecord?\n    @objc init(mechanism: UnsafePointer<MechanismRecord>) {\n        TCSLogWithMark()\n        self.mech = mechanism.pointee\n        self.mechCallbacks = mechanism.pointee.fPlugin.pointee.fCallbacks.pointee\n        self.mechEngine = mechanism.pointee.fEngine\n\n        super.init()\n        TCSLogWithMark(\"Setting up prefs\")\n        setupPrefs()\n\n    }\n    func run(){\n        fatalError(\"superclass must implement\")\n    }\n    func setupHints(fromCredentials credentials:Creds, password:String) -> ErrorResult {\n\n        TCSLogWithMark(\"Checking for allow login preference\")\n        let tokenManager = TokenManager()\n        let idTokenInfo = try? tokenManager.tokenInfo(fromCredentials: credentials)\n\n        if let allowUsersClaim = DefaultsOverride.standardOverride.string(forKey: PrefKeys.allowUsersClaim.rawValue), let allowedUsersArray  = DefaultsOverride.standardOverride.array(forKey: PrefKeys.allowedUsersArray.rawValue) as? Array<String>, allowedUsersArray.count>0, let tokenInfo = idTokenInfo, let userValue = tokenInfo[allowUsersClaim] as? String {\n\n            TCSLogWithMark(\"allowUsersClaim defined as \\(allowUsersClaim) and allowedUsersArray as \\(allowedUsersArray.debugDescription)\")\n\n            if allowedUsersArray.contains(userValue)==false {\n                TCSLogWithMark(\"user is not allowed to login\")\n                //no need to send back message because failure will show it.\n\n                denyLogin(message: nil)\n                return .failure(\"The user \\\"\\(userValue)\\\" is not allowed to login\")\n            }\n            else {\n                TCSLogWithMark(\"user allowed to login\")\n\n            }\n        }\n\n\n        do {\n\n            let tokenManager = TokenManager()\n            let idTokenInfo = try tokenManager.tokenInfo(fromCredentials: credentials)\n\n            //no need to send back message because failure will show it.\n\n            guard let idTokenInfo = idTokenInfo else {\n                denyLogin(message: nil)\n                return .failure(\"invalid idtoken\")\n            }\n            let currentDate = ISO8601DateFormatter().string(from: Date())\n\n            setHint(type: .oidcLastLoginTimestamp, hint: currentDate as NSSecureCoding)\n            let userInfoResult = tokenManager.setupUserAccountInfo(idTokenInfo: idTokenInfo)\n\n            var userInfo:TokenManager.UserAccountInfo\n            switch userInfoResult {\n\n            case .success(let retUserAccountInfo):\n                userInfo = retUserAccountInfo\n            case .error(let message):\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(message)\n            }\n\n\n            if  let allowedGroupsArray  = DefaultsOverride.standardOverride.array(forKey: PrefKeys.allowLoginIfMemberOfGroup.rawValue) as? Array<String>, allowedGroupsArray.count>0 {\n\n                TCSLogWithMark(\"allowedGroupsArray as \\(allowedGroupsArray.debugDescription)\")\n\n                var isMemberOfAllowedGroup=false\n                userInfo.groups?.map({ group in\n                    group.lowercased()\n                }).forEach({ userGroup in\n                    if allowedGroupsArray.contains(userGroup.lowercased()){\n                        TCSLogWithMark(\"user is in group \\(userGroup)\")\n                        isMemberOfAllowedGroup=true\n                        return\n                    }\n                })\n\n                if isMemberOfAllowedGroup==false {\n                    TCSLogWithMark(\"user is not allowed to login. not in member of allowed group.\")\n\n                    return .failure(\"The user is not allowed to log in because they are not a member of an allowed group.\")\n                }\n                else {\n                    TCSLogWithMark(\"user allowed to login\")\n\n                }\n            }\n\n            if let firstname = userInfo.firstName {\n                setHint(type: .firstName, hint: firstname as NSSecureCoding)\n            }\n            if let lastName = userInfo.lastName {\n                setHint(type: .lastName, hint: lastName as NSSecureCoding)\n            }\n            if let username = userInfo.username {\n                TCSLogWithMark(\"set shortname to \\(username)\")\n\n                setHint(type: .user, hint: username as NSSecureCoding)\n            }\n            if let fullUsername = userInfo.fullUsername {\n                setHint(type: .fullusername, hint: fullUsername as NSSecureCoding)\n            }\n            if let fullName = userInfo.fullName {\n                setHint(type: .fullName, hint: fullName as NSSecureCoding)\n            }\n            if let groups = userInfo.groups {\n                setHint(type: .groups, hint: groups as NSSecureCoding)\n            }\n            if let aliasName = userInfo.alias {\n                setHint(type: .aliasName, hint: aliasName as NSSecureCoding)\n            }\n            if let kerberosPrincipalName = userInfo.kerberosPrincipalName {\n                setHint(type: .kerberos_principal, hint: kerberosPrincipalName as NSSecureCoding)\n            }\n            if let uid = userInfo.uid {\n                setHint(type: .uid, hint: uid as NSSecureCoding )\n            }\n\n            let findUserAndUpdatePasswordResult = tokenManager.findUserAndUpdatePassword(idTokenInfo: idTokenInfo, newPassword: password)\n            guard let findUserAndUpdatePasswordResult = findUserAndUpdatePasswordResult else {\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(\"could not find local user with findUserAndUpdatePassword\")\n            }\n\n\n            switch findUserAndUpdatePasswordResult {\n\n            case .successful(let username):\n                userInfo.username = username\n                break\n            case .canceled:\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(\"cancelled\")\n            case .createNewAccount:\n                break\n            case .error(let mesg):\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(mesg)\n            }\n            guard let username = userInfo.username else {\n                TCSLogErrorWithMark(\"username or password are not set\")\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(\"username or password are not set\")\n            }\n\n            if  password.isEmpty {\n                TCSLogWithMark(\"Empty password. Failing\");\n                let message = \"Password not set. Verify username mapping in configuration is correct and you are not using passwordless login.\"\n                //no need to send back message because failure will show it.\n                denyLogin(message: nil)\n                return .failure(message)\n\n            }\n            TCSLogWithMark(\"checking local password for username:\\(username)\");\n\n            let  passwordCheckStatus =  PasswordUtils.isLocalPasswordValid(userName: username, userPass: password)\n            var accountLocked = false\n\n            var isSuspect = false\n            if let subValue = idTokenInfo[\"sub\"] as? String, let issuerValue = idTokenInfo[\"iss\"] as? String ,let existingUser = try? getUserRecord(sub: subValue, iss: issuerValue), let _ = try? existingUser.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_updatedfromlocal\") as? [String]  {\n\n                TCSLogWithMark(\"setting isSuspect to true.\")\n                isSuspect=true\n\n            }\n\n\n            switch passwordCheckStatus {\n            case .success:\n                TCSLogWithMark(\"Local password matches cloud password \")\n\n\n            case .accountLocked:\n                accountLocked=true\n                fallthrough\n            case .incorrectPassword:\n\n                TCSLogWithMark(\"incorrectPassword called.\")\n\n                let localAdmin = getHint(type: .localAdmin) as? LocalAdminCredentials\n\n                if getManagedPreference(key: .PasswordOverwriteSilent) as? Bool ?? false,\n                   let localAdmin = localAdmin, localAdmin.hasEmptyValues()==false,isSuspect==false {\n                    TCSLogWithMark(\"setting passwordOverwrite\")\n                    setHint(type: .passwordOverwrite, hint: true as NSSecureCoding)\n                }\n                else {\n\n                    TCSLogWithMark(\"prompting for password\")\n                    //if the info in DS was provided from a user account file, we don't want to allow admin override to force the user to prove they know\n                    //the password to the account.\n                    switch unsyncedPasswordPrompt(username: username, password: password, accountLocked: accountLocked, localAdmin: isSuspect==false ? localAdmin : nil,showResetButton: !isSuspect){\n\n                    case .success:\n                        break\n                    case .failure( let mesg):\n                        return .failure(mesg)\n\n                    case .userCancelled:\n                        return .userCancelled\n\n                    }\n\n                }\n\n            case .accountDoesNotExist:\n                TCSLogWithMark(\"user account doesn't exist yet\")\n\n            case .other(let mesg):\n                TCSLogWithMark(\"password check error:\\(mesg)\")\n                //no need to send back message because failure will show it.\n\n                denyLogin(message:nil)\n                return .failure(mesg)\n\n            }\n            TCSLogWithMark(\"passing username:\\(username), password, and tokens\")\n            TCSLogWithMark(\"setting kAuthorizationEnvironmentUsername\")\n            setContextString(type: kAuthorizationEnvironmentUsername, value: username)\n            TCSLogWithMark(\"setting kAuthorizationEnvironmentPassword\")\n\n            setContextString(type: kAuthorizationEnvironmentPassword, value: password)\n            TCSLogWithMark(\"setting username\")\n            TCSLogWithMark(\"setting username to \\(username)\")\n            setHint(type: .user, hint: username as NSSecureCoding)\n            TCSLogWithMark(\"setting tokens.password\")\n\n            setHint(type: .pass, hint: password as NSSecureCoding)\n\n            TCSLogWithMark(\"setting tokens\")\n\n            setHint(type: .tokens, hint: [credentials.idToken ?? \"\",credentials.refreshToken ?? \"\",credentials.accessToken ?? \"\"] as NSSecureCoding)\n            TCSLogWithMark(\"calling allowLogin\")\n            XCredsAudit().loginWindowLogin(user:username)\n\n            allowLogin()\n            return .success\n        }\n        catch TokenManager.ProcessTokenResult.error(let msg){\n            TCSLogWithMark(\"invalid idToken:\\(msg)\")\n            denyLogin(message: nil)\n            return .failure(msg)\n        }\n        catch {\n\n            TCSLogWithMark(\"Error:\\(error.localizedDescription)\")\n            //no need to send back message because failure will show it.\n\n            denyLogin(message:nil)\n            return .failure(\"credentialsUpdated error\")\n\n        }\n    }\n    func unsyncedPasswordPrompt(username: String, password: String,accountLocked:Bool, localAdmin: LocalAdminCredentials?, showResetButton:Bool=true) ->ErrorResult {\n        TCSLogWithMark()\n        let promptPasswordWindowController = VerifyLocalPasswordWindowController()\n\n        promptPasswordWindowController.isAccountLocked=accountLocked\n\n        promptPasswordWindowController.showResetText=true\n        promptPasswordWindowController.showResetButton=true\n        if let localAdmin = localAdmin, localAdmin.hasEmptyValues()==false {\n            TCSLogWithMark(\"setting local admin and password\")\n            promptPasswordWindowController.adminUsername = localAdmin.username\n            promptPasswordWindowController.adminPassword = localAdmin.password\n\n        }\n\n        switch  promptPasswordWindowController.promptForLocalAccountAndChangePassword(username: username, newPassword: password, shouldUpdatePassword: true, showResetButton: showResetButton) {\n\n\n        case .success(let enteredCredentials):\n            TCSLogWithMark(\"setting original password to use to unlock keychain later\")\n\n            if let enteredCredentials = enteredCredentials, !enteredCredentials.password.isEmpty {\n                setHint(type: .existingLocalUserPassword, hint:enteredCredentials.password as NSSecureCoding  )\n            }\n            return .success\n\n        case .accountResetRequested(let localAdminCredentials):\n            TCSLogWithMark(\"accountResetRequested\")\n\n            if let localAdminCredentials = localAdminCredentials {\n                TCSLogWithMark(\"setting localAdminCredentials hint\")\n\n                setHint(type: .localAdmin, hint:localAdminCredentials)\n            }\n            TCSLogWithMark(\"setting passwordOverwrite hint\")\n\n            setHint(type: .passwordOverwrite, hint: true as NSSecureCoding)\n            return .success\n\n        case .userCancelled:\n            return .userCancelled\n        case .error(let errMsg):\n            TCSLogWithMark(\"Error prompting: \\(errMsg)\")\n            return .failure(errMsg)\n        }\n    }\n    func setupPrefs(){\n        TCSLogWithMark()\n        UserDefaults.standard.addSuite(named: \"com.twocanoes.xcreds\")\n        let defaultsPath = Bundle(for: type(of: self)).path(forResource: \"defaults\", ofType: \"plist\")\n\n        if let defaultsPath = defaultsPath {\n\n            let defaultsDict = NSDictionary(contentsOfFile: defaultsPath)\n            UserDefaults.standard.register(defaults: defaultsDict as! [String : Any])\n        }\n    }\n\n    var xcredsPass: String? {\n        get {\n            guard let userPass = getHint(type: .pass) as? String else {\n                return nil\n            }\n            os_log(\"Computed xcredsPass accessed: %@\", log: noLoMechlog, type: .debug)\n            return userPass\n        }\n    }\n    var xcredsFirst: String? {\n        get {\n            guard let firstName = getHint(type: .firstName) as? String else {\n                return \"\"\n            }\n            os_log(\"Computed firstName accessed: %{public}@\", log: noLoMechlog, type: .debug, firstName)\n            return firstName\n        }\n    }\n\n    var xcredsLast: String? {\n        get {\n            guard let lastName = getHint(type: .lastName) as? String else {\n                return \"\"\n            }\n            os_log(\"Computed lastName accessed: %{public}@\", log: noLoMechlog, type: .debug, lastName)\n            return lastName\n        }\n    }\n    var xcredsUser: String? {\n        get {\n            guard let userName = getHint(type: .user) as? String else {\n                TCSLogWithMark(\"no usernames\")\n\n                return nil\n            }\n            TCSLogWithMark(\"username is \\(userName)\")\n            return userName\n        }\n    }\n    var usernameContext: String? {\n        get {\n            var value : UnsafePointer<AuthorizationValue>? = nil\n            var flags = AuthorizationContextFlags()\n            var err: OSStatus = noErr\n            err = mechCallbacks.GetContextValue(\n                mechEngine, kAuthorizationEnvironmentUsername, &flags, &value)\n\n            if err != errSecSuccess {\n                return nil\n            }\n\n            guard let username = NSString.init(bytes: value!.pointee.data!,\n                                               length: value!.pointee.length,\n                                               encoding: String.Encoding.utf8.rawValue)\n                else { return nil }\n            return username.trimmingCharacters(in:  CharacterSet.whitespaces.union(CharacterSet([\"\\0\"])))\n        }\n    }\n    var passwordContext: String? {\n        get {\n            var value : UnsafePointer<AuthorizationValue>? = nil\n            var flags = AuthorizationContextFlags()\n            var err: OSStatus = noErr\n            err = mechCallbacks.GetContextValue(\n                mechEngine, kAuthorizationEnvironmentPassword, &flags, &value)\n\n            if err != errSecSuccess {\n                return nil\n            }\n            guard let pass = NSString.init(bytes: value!.pointee.data!,\n                                           length: value!.pointee.length,\n                                           encoding: String.Encoding.utf8.rawValue)\n                else { return nil }\n\n            return pass.trimmingCharacters(in:  CharacterSet.whitespaces.union(CharacterSet([\"\\0\"])))\n\n\n        }\n    }\n    func allowLogin() {\n        TCSLogWithMark(\"================== Mech Complete ==================\")\n\n        let error = mechCallbacks.SetResult(mechEngine, .allow)\n\n        if error != noErr {\n            TCSLogErrorWithMark(\"Error: \\(error)\")\n        }\n    }\n\n    // disallow login\n    func denyLogin(message: String?) {\n        TCSLogErrorWithMark(\"***************** DENYING LOGIN ********************\");\n\n        if let message = message {\n            setStickyContextString(type: \"ErrorMessage\", value: message)\n        }\n\n        let error = mechCallbacks.SetResult(mechEngine, .deny)\n        if error != noErr {\n            TCSLogWithMark(\"Error: \\(error)\")\n\n        }\n    }\n\n    func setHints(_ hints:[HintType:Any]){\n\n        for hint in hints {\n            if let hintValue = hint.value as? NSSecureCoding{\n                setHint(type: hint.key, hint:hintValue )\n            }\n            else {\n                TCSLogErrorWithMark(\"hint \\(hint.key) does not conform to NSSecureCoding\")\n\n            }\n        }\n    }\n    func setContextStrings(_ contentStrings: [String : String]){\n\n        for contextString in contentStrings {\n            setContextString(type: contextString.key, value:contextString.value)\n        }\n    }\n    func setHint(type: HintType, hint: NSSecureCoding) {\n\n        guard let data = try? NSKeyedArchiver.archivedData(withRootObject: hint, requiringSecureCoding: true) else {\n            TCSLogErrorWithMark(\"Login Set hint failed: cant archive data to a data object\")\n            return\n        }\n\n        var value = AuthorizationValue(length: data.count, data: UnsafeMutableRawPointer(mutating: (data as NSData).bytes.bindMemory(to: Void.self, capacity: data.count)))\n\n        let err = mechCallbacks.SetHintValue((mech?.fEngine)!, type.rawValue, &value)\n        guard err == errSecSuccess else {\n            TCSLogWithMark(\"XCred Login Set hint failed with: %{public}@\")\n            return\n        }\n    }\n    func setHintData(type: HintType, data: Data) {\n        var value = AuthorizationValue(length: data.count, data: UnsafeMutableRawPointer(mutating: (data as NSData).bytes.bindMemory(to: Void.self, capacity: data.count)))\n\n        let err = mechCallbacks.SetHintValue((mech?.fEngine)!, type.rawValue, &value)\n        guard err == errSecSuccess else {\n            TCSLogWithMark(\"XCred Login Set hint failed with: %{public}@\")\n            return\n        }\n    }\n    var groups: [String]? {\n        get {\n            guard let userGroups = getHint(type: .groups) as? [String] else {\n                os_log(\"groups value is empty\", log: noLoMechlog, type: .debug)\n                return nil\n            }\n\n            return userGroups\n        }\n    }\n\n    func getHint(type: HintType) -> Any? {\n        var value : UnsafePointer<AuthorizationValue>? = nil\n        var err: OSStatus = noErr\n        err = mechCallbacks.GetHintValue((mech?.fEngine)!, type.rawValue, &value)\n        if err != errSecSuccess {\n//            TCSLogWithMark(\"No hint retrieved for: \\(type.rawValue)\")\n            return nil\n        }\n\n        let outputdata = Data.init(bytes: value!.pointee.data!, count: value!.pointee.length)\n\n        guard let result = NSKeyedUnarchiver.unarchiveObject(with: outputdata)\n            else {\n                return nil\n        }\n\n        return result\n    }\n\n    /// Adds a new alias to an existing local record\n    ///\n    /// - Parameters:\n    ///   - name: the shortname of the user to check as a `String`.\n    ///   - alias: The password of the user to check as a `String`.\n    /// - Returns: `true` if user:pass combo is valid, false if not.\n    class func addAlias(name: String, alias: String) -> Bool {\n        os_log(\"Checking for local username\", log: noLoMechlog, type: .error)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return false\n        }\n\n        let isLocal = records.isEmpty ? false : true\n        os_log(\"Results of local user check  %{public}@\", log: noLoMechlog, type: .error, isLocal.description)\n\n        if !isLocal {\n            return isLocal\n        }\n\n        // now to update the alias\n        do {\n                if let currentAlias = try records.first?.values(forAttribute: kODAttributeTypeRecordName) as? [String] {\n                    if !currentAlias.contains(alias) {\n                      try records.first?.addValue(alias, toAttribute: kODAttributeTypeRecordName)\n                    }\n                } else {\n                    try records.first?.addValue(alias, toAttribute: kODAttributeTypeRecordName)\n                }\n        } catch {\n            os_log(\"Unable to add alias to record\")\n            return false\n        }\n\n        return true\n    }\n\n    /// Updates a timestamp on a local account\n    ///\n    /// - Parameters:\n    ///   - name: the shortname of the user to check as a `String`.\n    ///   - time: The time to add  as a `String`.\n    /// - Returns: `true` if time attribute can be added, false if not.\n    class func updateSignIn(name: String, time: AnyObject ) -> Bool {\n        os_log(\"Checking for local username\", log: noLoMechlog, type: .default)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return false\n        }\n\n        let isLocal = records.isEmpty ? false : true\n        os_log(\"Results of local user check %{public}@\", log: noLoMechlog, type: .default, isLocal.description)\n\n        if !isLocal {\n            return isLocal\n        }\n\n        // now to update the attribute\n\n        do {\n            try records.first?.setValue(time, forAttribute: kODAttributeNetworkSignIn)\n            \n\n        } catch {\n            os_log(\"Unable to add sign in time to record\", log: noLoMechlog, type: .error)\n            return false\n        }\n\n        return true\n    }\n    \n    /// Set one of the known `AuthorizationTags` values to be used during mechanism evaluation.\n    ///\n    /// - Parameters:\n    ///   - type: A `String` constant from AuthorizationTags.h representing the value to set.\n    ///   - value: A `String` value of the context value to set.\n    func setContextString(type: String, value: String) {\n        let tempdata = value + \"\\0\"\n        let data = tempdata.data(using: .utf8)\n        var value = AuthorizationValue(length: (data?.count)!, data: UnsafeMutableRawPointer(mutating: (data! as NSData).bytes.bindMemory(to: Void.self, capacity: (data?.count)!)))\n        let err = mechCallbacks.SetContextValue((mech?.fEngine)!, type, .extractable, &value)\n        guard err == errSecSuccess else {\n            TCSLogWithMark(\"Set context value failed with: %{public}@\")\n            return\n        }\n    }\n    func setStickyContextString(type: String, value: String) {\n        TCSLogWithMark(\"Setting stick context \\(type) value: \\(value)\")\n        let tempdata = value + \"\\0\"\n        let data = tempdata.data(using: .utf8)\n        var value = AuthorizationValue(length: (data?.count)!, data: UnsafeMutableRawPointer(mutating: (data! as NSData).bytes.bindMemory(to: Void.self, capacity: (data?.count)!)))\n        let err = mechCallbacks.SetContextValue((mech?.fEngine)!, type, .sticky, &value)\n        guard err == errSecSuccess else {\n            TCSLogWithMark(\"Set context value failed with: %{public}@\")\n            return\n        }\n    }\n\n\n    func getContextString(type: String) -> String? {\n        TCSLogWithMark()\n\n        var value: UnsafePointer<AuthorizationValue>?\n        var flags = AuthorizationContextFlags()\n        let err = mech?.fPlugin.pointee.fCallbacks.pointee.GetContextValue((mech?.fEngine)!, type, &flags, &value)\n        if err != errSecSuccess {\n            TCSLogWithMark(\"No context string for \\(type)\")\n            return nil\n        }\n\n        return String(bytesNoCopy: value!.pointee.data!, length: value!.pointee.length, encoding: .utf8, freeWhenDone: false)\n    }\n\n    func runDict() -> Dictionary<String, Any>? {\n        do {\n\n\n            let data =  NSData(contentsOfFile: \"/tmp/xcredsrun\") as? Data\n            guard let data = data  else {\n                return nil\n            }\n\n            let dict = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSDictionary.self, from: data) as? Dictionary<String, Any>\n            return dict\n\n        }\n        catch {\n\n            TCSLogWithMark(\"error creating xcrun dict: \\(error)\")\n            return nil\n\n        }\n\n\n    }\n    func updateRunDict(dict:Dictionary<String, Any>)  {\n//        let emptyDictionary=Dictionary<String, Any>()\n        do {\n\n\n            let data = try NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: true)\n\n            try data.write(to: URL.init(fileURLWithPath: \"/tmp/xcredsrun\"))\n\n        }\n        catch {\n\n            TCSLogWithMark(\"error creating xcrun dict: \\(error)\")\n        }\n    }\n    //MARK: - Directory Service Utilities\n\n    /// Checks to see if a given user exits in the DSLocal OD node.\n    ///\n    /// - Parameter name: The shortname of the user to check as a `String`.\n    /// - Returns: `true` if the user already exists locally. Otherwise `false`.\n    class func checkForLocalUser(name: String) -> Bool {\n        os_log(\"Checking for local username\", log: noLoMechlog, type: .debug)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: name, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return false\n        }\n        let isLocal = records.isEmpty ? false : true\n//        os_log(\"Results of local user check %{public}@\", log: noLoMechlog, type: .debug, isLocal.description)\n        return isLocal\n    }\n\n\n\n    /// Gets shortname from a UUID\n    ///\n    /// - Parameters:\n    ///   - uuid: the uuid of the user to check as a `String`.\n    /// - Returns: shortname of the user or nil.\n    class func getShortname(uuid: String) -> String? {\n\n        os_log(\"Checking for username from UUID\", log: noLoMechlog, type: .debug)\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeGUID, matchType: ODMatchType(kODMatchEqualTo), queryValues: uuid, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            _ = error.localizedDescription\n//            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return nil\n        }\n\n        if records.count != 1 {\n            return nil\n        } else {\n            return records.first?.recordName\n        }\n    }\n\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsCreateUser.swift",
    "content": "//\n//  CreateUser.swift\n//  NoMADLogin\n//\n//  Created by Joel Rennich on 9/21/17.\n//  Copyright © 2017 Joel Rennich. All rights reserved.\n//\n\nimport OpenDirectory\n\n\n/// Mechanism to create a local user and homefolder.\n@available(macOS, deprecated: 11)\nclass XCredsCreateUser: XCredsBaseMechanism {\n\n    let createUserLog = \"createUserLog\"\n    let uiLog = \"uiLog\"\n    //MARK: - Properties\n    let session = ODSession.default()\n    \n    enum CreateUserError:Error {\n        case userCreateError(String)\n        case userPasswordSetError(String)\n    }\n    /// Native attributes that are all set to the user's shortname on account creation to give them\n    /// the ability to update the items later.\n    var nativeAttrsWriters = [\"dsAttrTypeNative:_writers_AvatarRepresentation\",\n                              \"dsAttrTypeNative:_writers_hint\",\n                              \"dsAttrTypeNative:_writers_jpegphoto\",\n                              \"dsAttrTypeNative:_writers_picture\",\n                              \"dsAttrTypeNative:_writers_unlockOptions\",\n                              \"dsAttrTypeNative:_writers_UserCertificate\",\n                              \"dsAttrTypeNative:_writers_realname\"]\n    \n    /// Native attributes that are simply set to OS defaults on account creation.\n    let nativeAttrsDetails = [\"dsAttrTypeNative:AvatarRepresentation\": \"\",\n                              \"dsAttrTypeNative:unlockOptions\": \"0\"]\n    \n    @objc override func run() {\n        var localLogin=false\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ CreateUser mech starting mech starting ~~~~~~~~~~~~~~~~~~~\")\n\n        if let localLoginHintValue = getHint(type: .localLogin) as? Bool, localLoginHintValue==true{\n            TCSLogWithMark(\"Local Login Detected\")\n\n            localLogin=true\n        }\n\n        if let xcredsGroups = groups {\n\n            TCSLogWithMark(\"group: \\(xcredsGroups)\")\n        }\n\n        // check if we are a guest account\n        // if so, remove any existing user/home for the guest\n        // then allow the mech to create a new user/home\n\n        if (getHint(type: .guestUser) as? String == \"true\") {\n            TCSLog(\"Setting up a guest account\")\n            \n            guard let password = passwordContext else {\n                TCSLogErrorWithMark(\"No password, denying login\")\n                denyLogin(message:\"No password passed.\")\n                return\n            }\n            \n            let result = cliTask(\"/usr/sbin/sysadminctl\", arguments: [\"-deleteUser\", xcredsUser ?? \"NONE\"], waitForTermination: true)\n            \n            try? result.write(toFile: \"/tmp/sysadminctl.output\", atomically: true, encoding: String.Encoding.utf8)\n            \n            if let path = getManagedPreference(key: .GuestUserAccountPasswordPath) as? String {\n                do {\n                    let pass = password + \"\\n\"\n                    try pass.write(toFile: path + \"-\\(xcredsUser!)\", atomically: true, encoding: String.Encoding.utf8)\n                } catch {\n                    TCSLog(\"Unable to write out guest password\")\n                }\n            }\n        }\n        TCSLogWithMark(\"user:\\(xcredsUser ?? \"\")\")\n        var isAdmin = false\n        var shouldRemoveAdmin = false\n        if let createAdmin = getManagedPreference(key: .CreateAdminUser) as? Bool {\n            isAdmin = createAdmin\n            TCSLog(\"Found a createLocalAdmin key value: \\(isAdmin.description)\")\n        }\n        TCSLogWithMark(\"Checking for CreateAdminIfGroupMember groups\")\n        if let adminGroups = getManagedPreference(key: .CreateAdminIfGroupMember) as? [String] {\n\n            TCSLogWithMark(\"Found a CreateAdminIfGroupMember key value: \\(String(describing: groups))\")\n            \n            groups?.forEach { group in\n                if adminGroups.contains(group) {\n                    isAdmin = true\n                    TCSLogWithMark(\"User is a member of \\(group) group. Setting isAdmin = true \")\n                }\n            }\n            if isAdmin == false, localLogin==false {\n                TCSLogWithMark(\"admin groups defined but user is not a member, so marking remove if it exists and we created it\")\n                shouldRemoveAdmin = true\n            }\n\n        }\n        var fullname:String?\n\n        if let fullnameHint = getHint(type: .fullName) as? String, fullnameHint.isEmpty == false {\n            fullname=fullnameHint\n        }\n\n        if let xcredsPass=xcredsPass,let xcredsUser = xcredsUser, XCredsCreateUser.checkForLocalUser(name: xcredsUser)==false{\n\n            TCSLogWithMark(\"Setting hint to create new user\")\n            setHint(type: .isAccountCreationPending, hint: true as NSSecureCoding)\n\n            let isAccountCreationPending = getHint(type: .isAccountCreationPending) as? Bool\n\n            if isAccountCreationPending==true {\n                TCSLogWithMark(\"isAccountCreationPending==true\")\n\n            }\n            else {\n                TCSLogWithMark(\"isAccountCreationPending==false\")\n\n            }\n            var uid:String?\n            if let hintUID = getHint(type: .uid) as? String{\n                if let hintUIDInt = Int(hintUID), hintUIDInt>499 {\n                    do {\n                        let user = try userWithUID(uid: hintUID)\n                        if user.count==0 {\n                            TCSLogWithMark(\"setting uid to \\(hintUID) from mapped value)\")\n                            uid = hintUID\n                        }\n                        else {\n                            TCSLogWithMark(\"user already exists with uid of \\(hintUID).\")\n                            denyLogin(message: \"Could not create new user. Existing user already using uid of \\(hintUID)\")\n                        }\n                    }\n                    catch {\n                        TCSLogWithMark(\"Unable to lookup user with uid \\(hintUID)\")\n                        denyLogin(message: \"Unable to lookup user with uid \\(hintUID)\")\n\n                    }\n                }\n                else {\n                    TCSLogWithMark(\"Invalid UID provided in mapping\")\n                }\n            }\n            else {\n                guard  let firstAvailableUid = findFirstAvailableUID() else {\n                    TCSLogErrorWithMark(\"Could not find an available UID\")\n                    denyLogin(message: \"invalid UID\")\n                    return\n                }\n                uid = firstAvailableUid\n            }\n            TCSLog(\"Checking for createLocalAdmin key\")\n\n\n            var customAttributes = [String: String]()\n            \n            let metaPrefix = \"_xcreds\"\n            \n            customAttributes[\"dsAttrTypeNative:\\(metaPrefix)_didCreateUser\"] = \"1\"\n            \n            let currentDate = ISO8601DateFormatter().string(from: Date())\n            customAttributes[\"dsAttrTypeNative:\\(metaPrefix)_creationDate\"] = currentDate\n\n\n            guard let xcredsFirst=xcredsFirst, let xcredsLast = xcredsLast else {\n                TCSLogErrorWithMark(\"first or last name not defined. bailing\")\n                denyLogin(message:\"first or last name not defined.\")\n\n                return\n\n            }\n            guard let uid = uid else {\n                denyLogin(message:\"bad uid.\")\n                return\n            }\n            do {\n                let primaryGroupID = (DefaultsOverride.standardOverride.string(forKey: PrefKeys.primaryGroupID.rawValue) ?? \"20\")\n\n\n                try createUser(shortName: xcredsUser,\n                               first: xcredsFirst ,\n                               last: xcredsLast, fullName: fullname,\n                               pass: xcredsPass,\n                               uid: uid,\n                               gid: primaryGroupID,\n                               canChangePass: true,\n                               isAdmin: isAdmin,\n                               customAttributes: customAttributes\n                )\n            }\n\n            catch CreateUserError.userPasswordSetError(let mesg){\n                denyLogin(message:mesg)\n                //create home anyways because account has issues if not created even if a password is not set.\n                createHome(xcredsUser:xcredsUser, uid:uid)\n                return\n\n            }\n            catch{\n                denyLogin(message:error.localizedDescription)\n            }\n            createHome(xcredsUser:xcredsUser, uid:uid)\n\n            \n        } else {\n            TCSLogWithMark(\"Checking to see if we are doing a password overwrite\")\n            // Checking to see if we are doing a overwrite\n\n            if getHint(type: .passwordOverwrite) as? Bool == true {\n                TCSLogWithMark(\"Password Overwrite enabled and triggered, starting evaluation\")\n                \n                TCSLogWithMark(\"trying to getting admin user and password\")\n\n                if let localAdmin = getHint(type: .localAdmin) as? LocalAdminCredentials {\n                    TCSLogWithMark(\"resetting password with admin username and password\")\n\n                    resetUserPassword(adminUserName: localAdmin.username, adminPassword: localAdmin.password)\n\n                }\n                else {\n\n                    TCSLogWithMark(\"password overwrite set but could not get admin username and password. this should not happen\")\n                    denyLogin(message:\"password overwrite set but could not get admin username and password. this should not happen\")\n                    return\n\n                }\n            }\n            else {\n                // no user to create\n                let username = usernameContext ?? \"\"\n                TCSLogWithMark(\"Checking if we think this is a first login\")\n\n                let (_, home) = checkUIDandHome(name: username)\n\n                if let home = home {\n                    if FileManager.default.fileExists(atPath: home+\"/.Trash\")==false {\n                        TCSLogWithMark(\"Looks like a first login, setting pending flag\")\n\n                        setHint(type: .isAccountCreationPending, hint: true as NSSecureCoding)\n\n                    }\n                }\n\n                os_log(\"Skipping local account creation\", log: createUserLog, type: .default)\n            }\n\n        }\n        var alias:String?\n\n        if let aliasHint = getHint(type: .aliasName) as? String {\n            alias=aliasHint\n        }\n        // Set the xcreds attributes to stamp this account as the mapped one\n        setTimestampFor(xcredsUser ?? \"\")\n        let _ = updateOIDCInfo(user: xcredsUser ?? \"\", localOnly: localLogin)\n\n        TCSLogWithMark(\"seeing if we have an alias\")\n        if let alias = alias, let xcredsUser = xcredsUser {\n            TCSLogWithMark(\"adding alias: \\(alias)\")\n            if XCredsCreateUser.addAlias(name: xcredsUser, alias: alias)==false {\n                os_log(\"error adding alias\", log: createUserLog, type: .debug)\n            }\n        }\n        TCSLogWithMark(\"Checking if user should be made admin\")\n        if let xcredsUser = xcredsUser {\n            do {\n                let record = try getLocalRecord(xcredsUser)\n\n                if isAdmin == true {\n\n                    TCSLogWithMark(\"Making admin user\")\n                    if makeAdmin(record)==false {\n                        os_log(\"failed to make user an admin\", log: createUserLog, type: .error)\n\n                    }\n                }\n                else if shouldRemoveAdmin == true {\n                    TCSLogWithMark(\"removing admin if xcreds created\")\n\n                    if let promotedToAdminArray = try record.values(forAttribute: \"dsAttrTypeNative:_xcreds_promoted_to_admin\") as? [String],promotedToAdminArray.count==1, promotedToAdminArray[0]==\"1\"  {\n                        TCSLogWithMark(\"we promoted so removing admin\")\n\n                        if removeAdmin(record)==false {\n                            TCSLogErrorWithMark(\"failed to remove user an admin\")\n\n                        }\n                        else { // success so remove attribute\n                            TCSLogWithMark(\"removing _xcreds_promoted_to_admin from record\")\n\n                            try record.removeValues(forAttribute: \"dsAttrTypeNative:_xcreds_promoted_to_admin\")\n                        }\n\n                    }\n                }\n            }\n\n            catch {\n                os_log(\"error finding user to make admin\", log: createUserLog, type: .error)\n            }\n\n\n        }\n\n\n        if let rfidUID = getHint(type: .rfidUid) as? String  {\n            TCSLogWithMark(\"got RFIDuid: \\(rfidUID)\")\n            let rfidPIN = getHint(type: .rfidPIN) as? String\n            do {\n                let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n\n                let userManager = UserSecretManager(secretKeeper: secretKeeper)\n                guard let rfidUIDData = Data(fromHexEncodedString: rfidUID) else {\n                    print(\"invalid rfid. Must be hex with no 0x in front\")\n                    return\n\n                }\n\n                if let username = xcredsUser, let password = xcredsPass{\n                    let fullname = fullname ?? \"\"\n\n                    try userManager.setUIDUser(fullName: fullname, rfidUID: rfidUIDData, username: username, password:password, uid: NSNumber(value: -1), pin: rfidPIN)\n\n                }\n\n            }\n            catch {\n\n                TCSLogWithMark(\"Error: \\(error.localizedDescription)\")\n                denyLogin(message:error.localizedDescription )\n            }\n        }\n\n\n        os_log(\"Allowing login\", log: createUserLog, type: .debug)\n        let _ = allowLogin()\n        os_log(\"CreateUser mech complete\", log: createUserLog, type: .debug)\n    }\n    func resetUserPassword(adminUserName:String, adminPassword:String) {\n        do {\n            TCSLogWithMark(\"secure token admin user \\(adminUserName) and password obtained\")\n\n            let node = try ODNode.init(session: session, type: ODNodeType(kODNodeTypeLocalNodes))\n            TCSLogWithMark()\n            let user = try node.record(withRecordType: kODRecordTypeUsers, name: xcredsUser!, attributes: kODAttributeTypeRecordName)\n            TCSLogWithMark()\n            try user.setNodeCredentials(adminUserName, password: adminPassword)\n            TCSLogWithMark()\n            TCSLogWithMark(\"changing password with secure token admin\")\n            try user.changePassword(nil, toPassword: xcredsPass!)\n            TCSLogWithMark()\n        }\n        catch {\n            TCSLogErrorWithMark(\"error: \\(error.localizedDescription)\")\n        }\n    }\n\n    func updateOIDCInfo(user: String, localOnly: Bool) -> Bool {\n        TCSLogWithMark(\"Checking for local username\")\n        var records = [ODRecord]()\n        let odsession = ODSession.default()\n        do {\n            let node = try ODNode.init(session: odsession, type: ODNodeType(kODNodeTypeLocalNodes))\n            let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeRecordName, matchType: ODMatchType(kODMatchEqualTo), queryValues: user, returnAttributes: kODAttributeTypeAllAttributes, maximumResults: 0)\n            records = try query.resultsAllowingPartial(false) as! [ODRecord]\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"ODError while trying to check for local user: %{public}@\", log: noLoMechlog, type: .error, errorText)\n            return false\n        }\n\n        let isLocal = records.isEmpty ? false : true\n        os_log(\"Results of local user check %{public}@\", log: noLoMechlog, type: .default, isLocal.description)\n\n        if !isLocal {\n            return false\n        }\n\n        // now to update the attribute\n        TCSLogWithMark(\"updating info in DS\")\n\n        TCSLogWithMark(\"removing _xcreds_oidc_updatedfromlocal from record if needed\")\n        try? records.first?.removeValues(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_updatedfromlocal\")\n\n        let claimsToDSArray = (DefaultsOverride.standardOverride.array(forKey: PrefKeys.claimsToAddToLocalUserAccount.rawValue) ?? []) as? [String]\n        TCSLogWithMark(\"Checking if member of group\")\n        let userGroups = getHint(type: .groups) as? [String]\n\n        if let userGroups = userGroups, userGroups.count>0 {\n            TCSLogWithMark(\"is a member of \\(userGroups.count) groups. Adding to OD record.\")\n            let groupsString = userGroups.joined(separator: \",\")\n            try? records.first?.setValue(groupsString, forAttribute: \"dsAttrTypeNative:_xcreds_groups\")\n\n        }\n\n        TCSLogWithMark(\"checking for kerberos principal\")\n        let kerberosPrincipal = getHint(type: .kerberos_principal) as? String\n\n        if let kerberosPrincipal = kerberosPrincipal {\n            TCSLogWithMark(\"saving kerberos principal to user DS record\")\n            try? records.first?.setValue(kerberosPrincipal, forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\")\n\n        }\n\n        TCSLogWithMark(\"setting oidc full username to DS\")\n        let fullUserName = getHint(type: .fullusername) as? String\n\n        if let fullUserName = fullUserName {\n            TCSLogWithMark(\"setting fullUserName\")\n            try? records.first?.setValue(fullUserName, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_full_username\")\n        }\n\n        //oidcLastLoginTimestamp\n\n        if let oidcLastLoginTimestampString = getHint(type: .oidcLastLoginTimestamp) as? String{\n            try? records.first?.setValue(oidcLastLoginTimestampString, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_lastLoginTimestamp\")\n        }\n\n\n        TCSLogWithMark(\"checking for alias to add as a username for rogp\")\n        let alias = getHint(type: .aliasName) as? String\n\n        if let alias = alias {\n            TCSLogWithMark(\"saving alias to DS as a username for ropg as needed\")\n            try? records.first?.setValue(alias, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_username\")\n        } else if localOnly==false {\n            TCSLogWithMark(\"Fallback,saving account name to DS as username for ropg as needed\")\n            try? records.first?.setValue(user, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_username\")\n        }\n\n        let adAttributes = getHint(type: .allADAttributes) as? Dictionary<String, String>\n\n        let adUserAttributesToAddToLocalUserAccount = (DefaultsOverride.standardOverride.array(forKey: PrefKeys.adUserAttributesToAddToLocalUserAccount.rawValue) ?? []) as? [String]\n\n\n        if let adAttributes = adAttributes {\n            TCSLogWithMark(\"AD Attributes: \\(adAttributes)\")\n            for adAttribute in adAttributes {\n                let key = adAttribute.key\n                let value = adAttribute.value\n                if let adUserAttributesToAddToLocalUserAccount = adUserAttributesToAddToLocalUserAccount, adUserAttributesToAddToLocalUserAccount.contains(key){\n                    TCSLogWithMark(\"Found Matching AD attribute: \\(key)\")\n                    let sanitizedKey = key.oidc_allowed_chars\n                    if sanitizedKey.count<50 && value.count<256 {\n                        TCSLogWithMark(\"Adding \\(sanitizedKey) = \\(value)\")\n                        try? records.first?.setValue(value, forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_\\(sanitizedKey)\")\n                    }\n\n                }\n            }\n\n        }\n        else {\n            TCSLogWithMark(\"No AD Attributes\")\n        }\n\n        let tokenArray = getHint(type: .tokens) as? Array<String>\n\n        if let tokenArray = tokenArray , tokenArray.count>0{\n            TCSLogWithMark(\"Found claims\")\n            let idToken = tokenArray[0]\n            let idTokenInfo = jwtDecode(value: idToken)  //dictionary for mapping\n            if let idTokenInfo = idTokenInfo {\n                TCSLogWithMark(\"Decoded Claims\")\n                if var claimsToDSArray = claimsToDSArray {\n\n                    claimsToDSArray.append(\"iss\")\n                    claimsToDSArray.append(\"sub\")\n\n                    for currClaim in claimsToDSArray {\n                        TCSLogWithMark(\"Found Matching Claim: \\(currClaim)\")\n                        if let value = idTokenInfo[currClaim] as? String {\n                            let sanitizedKey = currClaim.oidc_allowed_chars\n                            if sanitizedKey.count<50 && value.count<256 {\n                                TCSLogWithMark(\"Adding \\(sanitizedKey) = \\(value)\")\n                                try? records.first?.setValue(value, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_\\(sanitizedKey)\")\n\n                            }\n                            else {\n                                TCSLogWithMark(\"key or value too long to put into DS\")\n                            }\n\n                        }\n                        else if let value = idTokenInfo[currClaim] as? Array<String> {\n                            let sanitizedKey = currClaim.oidc_allowed_chars\n                            let oneLine = value.joined(separator: \";\")\n                            if sanitizedKey.count<256 || oneLine.count<20 {\n                                TCSLogWithMark(\"Adding \\(sanitizedKey) = \\(oneLine)\")\n\n                                try? records.first?.setValue(oneLine, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_\\(sanitizedKey)\")\n                            }\n                            else {\n                                TCSLogWithMark(\"key or value too long to put into DS\")\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n//        var sub:String?\n//        var iss:String?\n//        if let oidcSubHint = getHint(type: .oidcSub) as? String {\n//            sub=oidcSubHint\n//        }\n//        if let oidcIssHint = getHint(type: .oidcIssuer) as? String {\n//            iss=oidcIssHint\n//        }\n//\n//        if let oidcSubHint = getHint(type: .oidcSub) as? String {\n//            customAttributes[\"dsAttrTypeNative:\\(metaPrefix)_oidc_sub\"] = oidcSubHint\n//        }\n//        if let oidcIssHint = getHint(type: .oidcIssuer) as? String {\n//            customAttributes[\"dsAttrTypeNative:\\(metaPrefix)_oidc_iss\"] = oidcIssHint\n//        }\n\n//        do {\n//            os_log(\"updating sub\",log: noLoMechlog, type: .error)\n//\n//            try records.first?.setValue(sub, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_sub\")\n//\n//\n//            os_log(\"updating iss\",log: noLoMechlog, type: .error)\n//\n//            try records.first?.setValue(iss, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_iss\")\n//\n//\n////            if let groups = groups?.joined(separator: \";\") {\n////                try records.first?.setValue(groups, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_groups\")\n////\n////            }\n//        } catch {\n//            os_log(\"Unable to add OIDC Info\", log: noLoMechlog, type: .error)\n//            return false\n//        }\n\n        return true\n\n    }\n    func createHome(xcredsUser:String, uid:String) {\n        TCSLogWithMark(\"Creating local homefolder for \\(xcredsUser)\")\n        createHomeDirFor(xcredsUser)\n        TCSLogWithMark(\"Fixup home permissions for: \\(xcredsUser)\")\n        let _ = cliTask(\"/usr/sbin/diskutil resetUserPermissions / \\(uid)\", arguments: nil, waitForTermination: true)\n        TCSLogWithMark(\"Account creation complete, allowing login\")\n\n    }\n    // mark utility functions\n    func createUser(shortName: String, first: String, last: String, fullName:String?, pass: String?, uid: String, gid: String, canChangePass: Bool, isAdmin: Bool, customAttributes: [String:String]) throws {\n        var newRecord: ODRecord?\n        os_log(\"Creating new local account for: %{public}@\", log: createUserLog, type: .default, shortName)\n\n\n        // note for anyone following behind me\n        // you need to specify the attribute values in an array\n        // regardless of if there's more than one value or not\n        \n        os_log(\"Checking for UserProfileImage key\", log: createUserLog, type: .debug)\n        var userFullName = [first, last].joined(separator: \" \").trimmingCharacters(in: .whitespaces)\n\n        if let fullName = fullName {\n            userFullName=fullName\n        }\n\n        if userFullName.isEmpty {\n            userFullName = shortName\n        }\n\n        var userPicture = getManagedPreference(key: .UserProfileImage) as? String ?? \"\"\n        \n        if userPicture.isEmpty && !FileManager.default.fileExists(atPath: userPicture) {\n            os_log(\"Key did not contain an image, randomly picking one\", log: createUserLog, type: .debug)\n            userPicture = randomUserPic()\n        }\n\n        os_log(\"userPicture is: %{public}@\", log: createUserLog, type: .debug, userPicture)\n        \n        // Adds kODAttributeTypeJPEGPhoto as data, seems to be necessary for the profile pic to appear everywhere expected.\n        // Does not necessarily have to be in JPEG format. TIF and PNG both tested okay\n        // Apple seems to populate both kODAttributeTypePicture and kODAttributeTypeJPEGPhoto from the GUI user creator\n        \n        // Removing to test for @nstrauss\n        // let picURL = URL(fileURLWithPath: userPicture)\n        // let picData = NSData(contentsOf: picURL)\n        // let picString = picData?.description ?? \"\"\n\n\n        var attrs: [AnyHashable:Any] = [\n            kODAttributeTypeFullName: [userFullName],\n            kODAttributeTypeNFSHomeDirectory: [ \"/Users/\" + shortName ],\n            kODAttributeTypeUserShell: [\"/bin/bash\"],\n            kODAttributeTypeUniqueID: [uid],\n            kODAttributeTypePrimaryGroupID: [gid],\n            kODAttributeTypeAuthenticationHint: [\"\"],\n            kODAttributeTypePicture: [userPicture],\n            //kODAttributeTypeJPEGPhoto: [picString],\n            kODAttributeADUser: [getHint(type: .kerberos_principal) as? String ?? \"\"]\n        ]\n        \n        if #available(macOS 10.15, *) {\n            os_log(\"Replacing default bash shell with zsh for Catalina and above\", log: createUserLog, type: .debug)\n            attrs[kODAttributeTypeUserShell] = [\"/bin/zsh\"]\n        }\n        \n        if getManagedPreference(key: .UseCNForFullName) as? Bool ?? false {\n            attrs[kODAttributeTypeFullName] = [getHint(type: .fullName) as? String ?? \"\"]\n        } else if getManagedPreference(key: .UseCNForFullNameFallback) as? Bool ?? false && \"\\(first) \\(last)\" == \" \" {\n            attrs[kODAttributeTypeFullName] = [getHint(type: .fullName) as? String ?? \"\"]\n        }\n        \n        \n        if let signInTime = getHint(type: .networkSignIn) {\n            attrs[kODAttributeNetworkSignIn] = [signInTime]\n        }\n\n        os_log(\"New user attributes. first: %{public}@, last: %{public}@, uid: %{public}@, gid: %{public}@, canChangePass: %{public}@, isAdmin: %{public}@, customAttributes: %{public}@\", log: createUserLog, type: .debug, first, last, uid, gid, canChangePass.description, isAdmin.description, attrs.debugDescription)\n\n        do {\n            os_log(\"Creating user account in local ODNode\", log: createUserLog, type: .debug)\n            let node = try ODNode.init(session: session, type: ODNodeType(kODNodeTypeLocalNodes))\n            newRecord = try node.createRecord(withRecordType: kODRecordTypeUsers, name: shortName, attributes: attrs)\n        } catch {\n            let errorText = error.localizedDescription\n            os_log(\"Unable to create account. Error: %{public}@\", log: createUserLog, type: .error, errorText)\n            throw CreateUserError.userCreateError(error.localizedDescription)\n        }\n        os_log(\"Local ODNode user created successfully\", log: createUserLog, type: .debug)\n        \n        os_log(\"Setting native attributes\", log: createUserLog, type: .debug)\n        if #available(macOS 10.13, *) {\n            os_log(\"We are on 10.13 so drop the _writers_realname\", log: createUserLog, type: .debug)\n            nativeAttrsWriters.removeLast()\n        }\n        \n        for item in nativeAttrsWriters {\n            do {\n                os_log(\"Setting %{public}@ attribute for new local user\", log: createUserLog, type: .debug, item)\n                try newRecord?.addValue(shortName, toAttribute: item)\n            } catch {\n                os_log(\"Failed to set attribute: %{public}@\", log: createUserLog, type: .error, item)\n            }\n        }\n        \n        for item in nativeAttrsDetails {\n            do {\n                os_log(\"Setting %{public}@ attribute for new local user\", log: createUserLog, type: .debug, item.key)\n                try newRecord?.addValue(item.value, toAttribute: item.key)\n            } catch {\n                os_log(\"Failed to set attribute: %{public}@\", log: createUserLog, type: .error, item.key)\n            }\n        }\n        \n        if canChangePass {\n            do {\n                os_log(\"Setting _writers_passwd for new local user\", log: createUserLog, type: .debug)\n                try newRecord?.addValue(shortName, toAttribute: \"dsAttrTypeNative:_writers_passwd\")\n            } catch {\n                os_log(\"Unable to set _writers_passwd\", log: createUserLog, type: .error)\n            }\n        }\n        \n        if let password = pass {\n            do {\n                os_log(\"Setting password for new local user\", log: createUserLog, type: .debug)\n                try newRecord?.changePassword(nil, toPassword: password)\n            } catch {\n                os_log(\"Error setting password for new local user\", log: createUserLog, type: .error)\n                //            self.updateRunDict(dict: T##Dictionary<String, Any>)\n\n                throw CreateUserError.userPasswordSetError(error.localizedDescription)\n\n            }\n        }\n        \n        if customAttributes.isEmpty == false {\n            os_log(\"Setting additional attributes for new local user\", log: createUserLog, type: .debug)\n            for item in customAttributes {\n                do {\n                    os_log(\"Setting %{public}@ attribute for new local user, value: %{public}@\", log: createUserLog, type: .debug, item.key, item.value)\n                    try newRecord?.addValue(item.value, toAttribute: item.key)\n                } catch {\n                    os_log(\"Failed to set additional attribute: %{public}@\", log: createUserLog, type: .error, item.key)\n                }\n            }\n        }\n        \n        if isAdmin, let newRecord = newRecord {\n            if makeAdmin(newRecord)==false {\n                os_log(\"failed to make user an admin\", log: createUserLog, type: .error)\n\n            }\n        }\n\n        \n        os_log(\"Checking for aliases to add...\", log: createUserLog, type: .debug)\n        \n        if getManagedPreference(key: .AliasUPN) as? Bool ?? false {\n            if let upn = getHint(type: .kerberos_principal) as? String {\n                os_log(\"Adding UPN as an alias: %{public}@\", log: createUserLog, type: .debug, upn)\n                let result = XCredsCreateUser.addAlias(name: shortName, alias: upn.lowercased())\n                os_log(\"Adding UPN result: %{public}@\", log: createUserLog, type: .debug, result.description)\n            }\n        }\n\n        if let aliasHint = getHint(type: .aliasName) as? String {\n            if XCredsCreateUser.addAlias(name: shortName, alias: aliasHint)==false {\n                os_log(\"error adding alias\", log: createUserLog, type: .debug)\n            }\n        }\n\n\n\n        if getManagedPreference(key: .AliasNTName) as? Bool ?? false {\n            if let ntName = getHint(type: .ntName) as? String {\n                os_log(\"Adding NTName as an alias: %{public}@\", log: createUserLog, type: .debug, ntName)\n                let result = XCredsCreateUser.addAlias(name: shortName, alias: ntName)\n                os_log(\"Adding NTName result: %{public}@\", log: createUserLog, type: .debug, result.description)\n            }\n        }\n        \n        os_log(\"User creation complete for: %{public}@\", log: createUserLog, type: .debug, shortName)\n\n    }\n    \n    // func to get a random string\n    func randomString(length: Int) -> String {\n        \n        let letters : NSString = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\"\n        let len = UInt32(letters.length)\n        \n        var randomString = \"\"\n        \n        for _ in 0 ..< length {\n            let rand = arc4random_uniform(len)\n            var nextChar = letters.character(at: Int(rand))\n            randomString += NSString(characters: &nextChar, length: 1) as String\n        }\n        \n        return randomString\n    }\n\n    //TODO: Change to throws instead of optional.\n    /// Finds the first avaliable UID in the DSLocal domain above 500 and returns it as a `String`\n    ///\n    /// - Returns: `String` representing the UID\n    func findFirstAvailableUID() -> String? {\n        var newUID = \"\"\n        os_log(\"Checking for available UID\", log: createUserLog, type: .debug)\n        \n        if let uidToolpath = getManagedPreference(key: .UIDTool) as? String {\n            os_log(\"Checking UIDTool\", log: createUserLog, type: .debug)\n            if FileManager.default.isExecutableFile(atPath: uidToolpath) {\n                os_log(\"Calling UIDTool\", log: createUserLog, type: .debug)\n                let uid = cliTask(uidToolpath, arguments: [xcredsUser ?? \"NONE\" ], waitForTermination: true)\n                if uid != \"\" {\n                    os_log(\"Found custom uid, using: %{public}@\", log: createUserLog, type: .debug, uid)\n                    return uid.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)\n                }\n            }\n        }\n        \n        for potentialUID in 501... {\n            do {\n                let node = try ODNode.init(session: session, type: ODNodeType(kODNodeTypeLocalNodes))\n                let query = try ODQuery.init(node: node, forRecordTypes: kODRecordTypeUsers, attribute: kODAttributeTypeUniqueID, matchType: ODMatchType(kODMatchEqualTo), queryValues: String(potentialUID), returnAttributes: kODAttributeTypeNativeOnly, maximumResults: 0)\n                let records = try query.resultsAllowingPartial(false) as! [ODRecord]\n                if records.isEmpty {\n                    newUID = String(potentialUID)\n                    break\n                }\n            } catch {\n                let errorText = error.localizedDescription\n                os_log(\"ODError searching for avaliable UID: %{public}@\", log: createUserLog, type: .error, errorText)\n                return nil\n            }\n        }\n        os_log(\"Found first available UID: %{public}@\", log: createUserLog, type: .default, newUID)\n        return newUID\n    }\n\n    //TODO: Convert to throws\n    /// Finds the local homefolder template that corresponds to the locale of the system and copies it into place.\n    ///\n    /// - Parameter user: The shortname of the user to create a home for as a `String`.\n    func createHomeDirFor(_ user: String) {\n\n        let res=cliTask(\"/usr/sbin/createhomedir -c -u \\(user)\")\n\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.skipUserSetupBuddy.rawValue) == true {\n            \n            if FileManager.default.fileExists(atPath: \"/Users/\\(user)\") {\n                FileManager.default.createFile(atPath: \"/Users/\\(user)/.skipbuddy\", contents: nil)\n            }\n        }\n        TCSLogWithMark(res)\n//        os_log(\"Find system locale...\", log: createUserLog, type: .debug)\n//        let currentLanguage = Locale.current.languageCode ?? \"Non_localized\"\n//        os_log(\"System language is: %{public}@\", log: createUserLog, type: .debug, currentLanguage)\n//        let templateName = templateForLang(currentLanguage)\n//        let sourceURL = URL(fileURLWithPath: \"/System/Library/User Template/\" + templateName)\n//        let homeDirLocations = [\"Desktop\", \"Downloads\", \"Documents\", \"Movies\", \"Music\", \"Pictures\", \"Public\"]\n//        do {\n//            os_log(\"Initializing the user home directory\", log: createUserLog, type: .debug)\n//            try FileManager.default.copyItem(at: sourceURL, to: URL(fileURLWithPath: \"/Users/\" + user))\n//\n//            os_log(\"Copying non-localized folders to new home\", log: createUserLog, type: .debug)\n//            for location in homeDirLocations {\n//                try FileManager.default.copyItem(at: URL(fileURLWithPath: \"/System/Library/User Template/Non_localized/\\(location)\"), to: URL(fileURLWithPath: \"/Users/\" + user + \"/\\(location)\"))\n//            }\n//\n//            os_log(\"Copying language template\", log: createUserLog, type: .debug)\n//            try FileManager.default.copyItem(at: sourceURL, to: URL(fileURLWithPath: \"/Users/\" + user))\n//        } catch {\n//            os_log(\"Home template copy failed with: %{public}@\", log: createUserLog, type: .error, error.localizedDescription)\n//        }\n    }\n    \n    /// Looks at the Apple provided User Pictures directory, recurses it, and delivers a random picture path.\n    ///\n    /// - Returns: A `String` path to a random user picture. If there is a failure it returns an empty `String`.\n    func randomUserPic() -> String {\n        let libraryDir = FileManager.default.urls(for: .libraryDirectory, in: .localDomainMask)\n        guard let library = libraryDir.first else {\n            return \"\"\n        }\n        let picturePath = library.appendingPathComponent(\"User Pictures\", isDirectory: true)\n        let picDirs = (try? FileManager.default.contentsOfDirectory(at: picturePath, includingPropertiesForKeys: [URLResourceKey.isDirectoryKey], options: .skipsHiddenFiles)) ?? []\n        let pics = picDirs.flatMap {(try? FileManager.default.contentsOfDirectory(at: $0, includingPropertiesForKeys: [URLResourceKey.isRegularFileKey], options: .skipsHiddenFiles)) ?? []}\n        return pics[Int(arc4random_uniform(UInt32(pics.count)))].path\n    }\n    \n    /// Given an connonical ISO language code, find and return the macOS home folder template name that is appropriate.\n    ///\n    /// - Parameter code: The `languageCode` of the current user `Locale`.\n    ///             You can find the current language with `Locale.current.languageCode`\n    /// - Returns: A `String` that is the name of the localized home folder template on macOS. If the language code doesn't\n    ///             map to one of the default macOS home templates the `Non_localized` name will be returned.\n    func templateForLang(_ code: String) -> String {\n        let templateName = \".lproj\"\n        switch code {\n        case \"es\":\n            return \"Spanish\" + templateName\n        case \"nl\":\n            return \"Dutch\" + templateName\n        case \"en\":\n            return \"English\" + templateName\n        case \"fr\":\n            return \"French\" + templateName\n        case \"it\":\n            return \"Italian\" + templateName\n        case \"de\":\n            return \"German\" + templateName\n        case \"ja\":\n            return \"Japanese\" + templateName\n        case \"ar\":\n            return \"ar\" + templateName\n        case \"ca\":\n            return \"ca\" + templateName\n        case \"cs\":\n            return \"cs\" + templateName\n        case \"da\":\n            return \"da\" + templateName\n        case \"el\":\n            return \"el\" + templateName\n        case \"es-419\":\n            return \"es_419\" + templateName\n        case \"fi\":\n            return \"fi\" + templateName\n        case \"he\":\n            return \"he\" + templateName\n        case \"hi\":\n            return \"hi\" + templateName\n        case \"hr\":\n            return  \"hr\" + templateName\n        case \"hu\":\n            return \"hu\" + templateName\n        case \"id\":\n            return \"id\" + templateName\n        case \"ko\":\n            return \"ko\" + templateName\n        case \"ms\":\n            return \"ms\" + templateName\n        case \"nb\":\n            return \"no\" + templateName\n        case \"pl\":\n            return \"pl\" + templateName\n        case \"pt\":\n            return \"pt\" + templateName\n        case \"pt-PT\":\n            return \"pt_PT\" + templateName\n        case \"ro\":\n            return \"ro\" + templateName\n        case \"ru\":\n            return \"ru\" + templateName\n        case \"sk\":\n            return \"sk\" + templateName\n        case \"sv\":\n            return \"sv\" + templateName\n        case \"th\":\n            return \"th\" + templateName\n        case \"tr\":\n            return \"tr\" + templateName\n        case \"uk\":\n            return \"uk\" + templateName\n        case \"vi\":\n            return \"vi\" + templateName\n        case \"zh-Hans\":\n            return \"zh_CN\" + templateName\n        case \"zh-Hant\":\n            return \"zh_TW\" + templateName\n        default:\n            return \"Non_localized\"\n        }\n    }\n    \n    fileprivate func setTimestampFor(_ nomadUser: String) {\n        // Add network sign in stamp\n        if let signInTime = getHint(type: .networkSignIn) {\n            if XCredsCreateUser.updateSignIn(name: nomadUser, time: signInTime as AnyObject) {\n                os_log(\"Sign in time updated\", log: createUserLog, type: .default)\n            } else {\n                os_log(\"Could not add timestamp\", log: createUserLog, type: .error)\n            }\n        }\n\n    }\n\n\n\n    fileprivate func addSecureToken(_ username: String, _ userPass: String?,_ adminUsername: String,_ adminPassword: String?) {\n        //MARK: 10.14 fix\n        // check for 10.14\n        // check for no existing local users?\n        // - perhaps looking for diskutil apfs listcryptousers /\n        //     if a user already has a token, this will fail anyway\n        // - gate behind a pref key?\n        \n        // attempt to add token to user\n        \n        \n        os_log(\"Attempting to add a token to new user.\", log: createUserLog, type: .default)\n        \n        let launchPath = \"/usr/sbin/sysadminctl\"\n        \n        var args = [\n            \"-secureTokenOn\",\n            username,\n            \"-password\",\n            userPass ?? \"\",\n            \"-adminUser\",\n            adminUsername,\n            \"-adminPassword\",\n            adminPassword ?? \"\"\n        ]\n        \n        let result = cliTask(launchPath, arguments: args, waitForTermination: true)\n        os_log(\"sysdaminctl result: %{public}@\", log: createUserLog, type: .debug, result)\n        args = [\n            \"********\",\n            \"********\",\n            \"********\",\n            \"********\",\n            \"********\",\n            \"********\",\n            \"********\",\n            \"********\"\n        ]\n    }\n    \n    fileprivate func isFdeEnabled() -> Bool {\n        \n        // check to see if FV is already running\n        \n        let launchPath = \"/usr/bin/fdesetup\"\n        let args = [\n            \"status\"\n        ]\n        if cliTask(launchPath, arguments: args, waitForTermination: true).contains(\"FileVault is Off\") {\n            return false\n        } else {\n            return true\n        }\n    }\n    \n    \n//    fileprivate func CreateSecureTokenManagementUser(_ username: String,_ passwordLocation: String) -> Bool{\n//\n//        // Generating a random password string and assigning that as the password to the user\n//        let password = randomString(length: getManagedPreference(key: .SecureTokenManagementPasswordLength) as? Int ?? 16)\n//\n//        // Checking if the account exists\n//        if cliTask(\"/usr/bin/dscl\", arguments: [\".\", \"-list\", \"/Users\"], waitForTermination: true).components(separatedBy: \"\\n\").contains(username){\n//            // User already exists, should rotate the password\n//            os_log(\"Secure Token management account exists, rotating password\", log: createUserLog, type: .default)\n//\n//            // Getting the old password\n//            let oldPassword = String(data: FileManager.default.contents(atPath: passwordLocation)!, encoding: .ascii)!\n//\n//            // rotating the password\n//            let launchPath = \"/usr/sbin/sysadminctl\"\n//            let args = [\n//                \"-resetPasswordFor\",\n//                \"\\(username)\",\n//                \"-newPassword\",\n//                \"\\(password)\",\n//                \"-adminUser\",\n//                \"\\(username)\",\n//                \"-adminPassword\",\n//                \"\\(oldPassword)\"\n//            ]\n//            _ = cliTask(launchPath, arguments: args, waitForTermination: true)\n//\n//        } else {\n//            os_log(\"Secure Token management account being created\", log: createUserLog, type: .default)\n//\n//            // Creating the user record with sysadminctl becuase it does the magic that allows it to delegate tokens vs manually creating via dscl\n//            var launchPath = \"/usr/sbin/sysadminctl\"\n//            var args = [\n//                \"-addUser\",\n//                \"\\(username)\",\n//                \"-password\",\n//                \"\\(password)\",\n//                \"-UID\",\n//                getManagedPreference(key: .SecureTokenManagementUID) as? String ?? \"400\",\n//                \"-fullName\",\n//                getManagedPreference(key: .SecureTokenManagementFullName) as? String ?? \"NoMAD Login\",\n//                \"-home\",\n//                \"/private/var/_nomadlogin\",\n//                \"-admin\",\n//                \"-picture\",\n//                getManagedPreference(key: .SecureTokenManagementIconPath) as? String ?? \"/Library/Security/SecurityAgentPlugins/NoMADLoginAD.bundle/Contents/Resources/NoMADFDEIcon.png\"\n//            ]\n//            _ = cliTask(launchPath, arguments: args, waitForTermination: true)\n//\n//            // Making the user hiddem\n//            launchPath = \"/usr/bin/dscl\"\n//            args = [\n//                \".\",\n//                \"-create\",\n//                \"/Users/\\(username)\",\n//                \"IsHidden\",\n//                \"1\"\n//            ]\n//            _ = cliTask(launchPath, arguments: args, waitForTermination: true)\n//\n//        }\n//\n//        // Saving that password to the password location\n//        do {\n//            try password.write(toFile: passwordLocation, atomically: true, encoding: String.Encoding.ascii)\n//            var attributes = [FileAttributeKey : Any]()\n//            attributes[.posixPermissions] = 0o600\n//            try FileManager.default.setAttributes(attributes, ofItemAtPath: passwordLocation)\n//        } catch {\n//            os_log(\"Error writing password to: %{public}@\", log: createUserLog, type: .debug, passwordLocation)\n//            return false\n//        }\n//        return true\n//    }\n    \n}\nextension String {\n    var oidc_allowed_chars: String {\n        var allowed = CharacterSet()\n        allowed.formUnion(CharacterSet.alphanumerics)\n        allowed.insert(charactersIn: \"_#\")\n        return self.components(separatedBy: allowed.inverted).joined()\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsEnableFDE.swift",
    "content": "//\n//  EnableFDE.swift\n//  NoMADLoginAD\n//\n//  Created by Admin on 2/5/18.\n//  Copyright © 2018 NoMAD. All rights reserved.\n//\n\nimport Cocoa\n\n@available(macOS, deprecated: 11)\nclass XCredsEnableFDE : XCredsBaseMechanism {\n    let enableFDELog = \"enableFDELog\"\n    // basic mech to enable FileVault\n    // needs to be a separate mech b/c it needs to run after loginwindow:done\n    \n    @objc override  func run() {\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ EnableFDE mech starting mech starting ~~~~~~~~~~~~~~~~~~~\")\n\n        // FileVault\n        \n        if getManagedPreference(key: .EnableFDE) as? Bool == true {\n            // check to see if we're already FileVaulted\n            \n            if isFdeEnabled() {\n                \n                os_log(\"Checking to see if we should rekey\", log: enableFDELog, type: .default)\n                \n                if getManagedPreference(key: .EnableFDERekey) as? Bool ?? false {\n                    rekey()\n                }\n                \n                os_log(\"FileVault is already enabled, skipping mechanism.\", log: enableFDELog, type: .debug)\n                \n            } else {\n                enableFDE()\n            }\n        }\n        \n        // Always let login through\n        \n        let _ = allowLogin()\n    }\n    \n    fileprivate func rekey() {\n        \n        \n        os_log(\"Rekeying FileVault\", log: enableFDELog, type: .default)\n        \n        let userArgs = [\n            \"Username\" : xcredsUser ?? \"\",\n            \"Password\" : xcredsPass ?? \"\",\n            ]\n        \n        var userInfo : Data\n        \n        do {\n            userInfo = try PropertyListSerialization.data(fromPropertyList: userArgs,\n                                                          format: PropertyListSerialization.PropertyListFormat.xml,\n                                                          options: 0)\n        } catch {\n            os_log(\"Unable to create fdesetup arguments.\", log: enableFDELog, type: .error)\n            return\n        }\n        \n        let inPipe = Pipe.init()\n        let outPipe = Pipe.init()\n        let errorPipe = Pipe.init()\n        \n        let task = Process.init()\n        task.launchPath = \"/usr/bin/fdesetup\"\n        task.arguments = [\"changerecovery\", \"-outputplist\", \"-inputplist\"]\n        \n        task.standardInput = inPipe\n        task.standardOutput = outPipe\n        task.standardError = errorPipe\n        task.launch()\n        inPipe.fileHandleForWriting.write(userInfo)\n        inPipe.fileHandleForWriting.closeFile()\n        task.waitUntilExit()\n        \n        let outputData = outPipe.fileHandleForReading.readDataToEndOfFile()\n        outPipe.fileHandleForReading.closeFile()\n        \n        let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()\n        let errorMessage = String(data: errorData, encoding: .utf8)\n        errorPipe.fileHandleForReading.closeFile()\n        \n        let output = NSString(data: outputData, encoding: String.Encoding.utf8.rawValue)! as String\n            \n        // write out the PRK if asked to\n        \n        if getManagedPreference(key: .EnableFDERecoveryKey) as? Bool == true {\n            \n            var recoveryPath = \"/var/db/FDE\"\n            \n            if let newPath = getManagedPreference(key: .EnableFDERecoveryKeyPath) as? String {\n                recoveryPath = newPath\n            }\n            \n            let fm = FileManager.default\n            \n            if !fm.fileExists(atPath: recoveryPath, isDirectory: nil) {\n                do {\n                    os_log(\"Creating folder for recovery key storage.\", log: enableFDELog)\n                    try fm.createDirectory(atPath: recoveryPath, withIntermediateDirectories: true, attributes: [FileAttributeKey.posixPermissions : 0o750])\n                } catch {\n                    os_log(\"Unable to create file path for PRK, defaulting to /var/db/\", log: enableFDELog)\n                    \n                    // reset recovery path to something we know will exist\n                    \n                    recoveryPath = \"/var/db/\"\n                }\n            }\n            \n            recoveryPath += \"/FDESetup.plist\"\n            \n            do {\n                os_log(\"Attempting to write key to: %{public}@\", log: enableFDELog, type: .default, recoveryPath)\n                try output.write(toFile: recoveryPath, atomically: true, encoding: String.Encoding.ascii)\n            } catch {\n                os_log(\"Unable to finish fdesetup: %{public}@\", log: enableFDELog, type: .error, errorMessage ?? \"Unkown error\")\n            }\n        }\n        \n    }\n    \n    fileprivate func enableFDE() {\n        \n        // check to see if boot volume is AFPS, otherwise do nothing\n        \n        if volumeAPFS() {\n            \n            // enable FDE on volume by using fdesetup\n            \n            os_log(\"Enabling FileVault\", log: enableFDELog, type: .default)\n            \n            let userArgs = [\n                \"Username\" : xcredsUser ?? \"\",\n                \"Password\" : xcredsPass ?? \"\",\n                ]\n            \n            var userInfo : Data\n            \n            do {\n                userInfo = try PropertyListSerialization.data(fromPropertyList: userArgs,\n                                                              format: PropertyListSerialization.PropertyListFormat.xml,\n                                                              options: 0)\n            } catch {\n                os_log(\"Unable to create fdesetup arguments.\", log: enableFDELog, type: .error)\n                return\n            }\n            \n            let inPipe = Pipe.init()\n            let outPipe = Pipe.init()\n            let errorPipe = Pipe.init()\n            \n            let task = Process.init()\n            task.launchPath = \"/usr/bin/fdesetup\"\n            task.arguments = [\"enable\", \"-outputplist\", \"-inputplist\"]\n            \n            task.standardInput = inPipe\n            task.standardOutput = outPipe\n            task.standardError = errorPipe\n            task.launch()\n            inPipe.fileHandleForWriting.write(userInfo)\n            inPipe.fileHandleForWriting.closeFile()\n            task.waitUntilExit()\n            \n            let outputData = outPipe.fileHandleForReading.readDataToEndOfFile()\n            outPipe.fileHandleForReading.closeFile()\n            \n            let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()\n            let errorMessage = String(data: errorData, encoding: .utf8)\n            errorPipe.fileHandleForReading.closeFile()\n            \n            let output = NSString(data: outputData, encoding: String.Encoding.utf8.rawValue)! as String\n                    \n            // write out the PRK if asked to\n            \n            // write out the PRK if asked to\n            \n            if getManagedPreference(key: .EnableFDERecoveryKey) as? Bool == true {\n                \n                var recoveryPath = \"/var/db/FDE\"\n                \n                if let newPath = getManagedPreference(key: .EnableFDERecoveryKeyPath) as? String {\n                    recoveryPath = newPath\n                }\n                \n                let fm = FileManager.default\n                \n                if !fm.fileExists(atPath: recoveryPath, isDirectory: nil) {\n                    do {\n                        os_log(\"Creating folder for recovery key storage.\", log: enableFDELog)\n                        try fm.createDirectory(atPath: recoveryPath, withIntermediateDirectories: true, attributes: [FileAttributeKey.posixPermissions : 0o750])\n                    } catch {\n                        os_log(\"Unable to create file path for PRK, defaulting to /var/db/\", log: enableFDELog)\n                        \n                        // reset recovery path to something we know will exist\n                        \n                        recoveryPath = \"/var/db/\"\n                    }\n                }\n                \n                recoveryPath += \"/FDESetup.plist\"\n                \n                do {\n                    os_log(\"Attempting to write key to: %{public}@\", log: enableFDELog, type: .default, recoveryPath)\n                    try output.write(toFile: recoveryPath, atomically: true, encoding: String.Encoding.ascii)\n                } catch {\n                    os_log(\"Unable to finish fdesetup: %{public}@\", log: enableFDELog, type: .error, errorMessage ?? \"Unkown error\")\n                }\n            }\n        } else {\n            os_log(\"Boot volume is not APFS, skipping FDE.\", log: enableFDELog, type: .debug)\n        }\n    }\n    \n    fileprivate func volumeAPFS() -> Bool {\n        \n        // get shared workspace manager\n        \n        let ws = NSWorkspace.shared\n        \n        var description: NSString?\n        var type: NSString?\n        \n        let err = ws.getFileSystemInfo(forPath: \"/\", isRemovable: nil, isWritable: nil, isUnmountable: nil, description: &description, type: &type)\n        \n        if !err {\n            os_log(\"Error determining file system\", log: enableFDELog, type: .error)\n            return false\n        }\n        \n        if type == \"apfs\" {\n            os_log(\"Filesystem is APFS, enabling FileVault\", log: enableFDELog)\n            return true\n        } else {\n            os_log(\"Filesystem is not APFS, skipping FileVault\", log: enableFDELog, type: .error)\n            return false\n        }\n    }\n    \n    fileprivate func isFdeEnabled() -> Bool {\n        // determine if FV is already running\n        if cliTask(\"/usr/bin/fdesetup\", arguments: [\"status\"]).contains(\"FileVault is Off\") {\n            return false\n        } else {\n            return true\n        }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsKeychainAdd.swift",
    "content": "//\n//  KeychainAdd.swift\n//  NoMADLoginAD\n//\n//  Created by Joel Rennich on 1/30/18.\n//  Copyright © 2018 Orchard & Grove Inc. All rights reserved.\n//\n\nimport Cocoa\nimport Security\n\nimport OpenDirectory\n// headless mech to add items to a keychain\n@available(macOS, deprecated: 11)\nclass XCredsKeychainAdd : XCredsBaseMechanism {\n    \n    let fm = FileManager.default\n    var username = \"\"\n    var userpass = \"\"\n    let kItemName = \"xcreds\"\n    \n    @objc override func run() {\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ XCredsKeychainAdd mech starting starting mech starting ~~~~~~~~~~~~~~~~~~~\")\n\n        // get username and password\n        // get reference to user's keychain\n        // add items\n        var err : OSStatus?\n        var userKeychainTemp : SecKeychain?\n        var userKeychain: SecKeychain?\n        username = usernameContext ?? \"\"\n        userpass = passwordContext ?? \"\"\n\n        TCSLogWithMark(\"Getting Home Dir\")\n\n        let (uid, home) = checkUIDandHome(name: username)\n\n        TCSLogWithMark(\"uid: \\(uid ?? 9999 )\")\n\n        guard let homeDir = home as? NSString else {\n            TCSLogErrorWithMark(\"Unable to get home directory path.\")\n            allowLogin()\n            return\n        }\n\n        TCSLogWithMark(\"checking UID\")\n        guard let userUID = uid else {\n            TCSLogErrorWithMark(\"Unable to get uid.\")\n            allowLogin()\n            return\n        }\n\n        // switch uid to user so we have access to home directory and other things\n        TCSLogWithMark()\n\n        seteuid(userUID)\n        TCSLogWithMark()\n\n        // check to ensure the keychain is there\n        let userKeychainPath = homeDir.appendingPathComponent(\"Library/Keychains/login.keychain-db\")\n        TCSLogWithMark(\"finding path\")\n        if fm.fileExists(atPath: userKeychainPath) == false {\n            // if we're not set to create a keychain, move on\n            if getManagedPreference(key: .KeychainCreate) as? Bool == true {\n                os_log(\"No login.keychain-db, creating one\", log: \"keychainAddLog\")\n                SecKeychainResetLogin(UInt32(strlen(userpass.cString(using: .utf8) ?? [])), userpass.cString(using: .utf8) ?? [], true)\n            } else {\n                os_log(\"No login.keychain-db, skipping KeychainAdd\", log: \"keychainAddLog\", type: .default)\n                allowLogin()\n                return\n            }\n        }\n\n        // now test it we can unlock the keychain\n        let tempPath = userKeychainPath + Date().timeIntervalSinceNow.description\n        TCSLogWithMark(\"Link old keychain\")\n        // need to do this on a hardlink to not prevent the keychain reset from working by leaving a handle open\n        link(userKeychainPath, tempPath)\n        \n        TCSLogWithMark(\"Getting Temp Keychain reference.\")\n\n        err = SecKeychainOpen(tempPath, &userKeychainTemp)\n\n        TCSLogWithMark(\"Unlocking Temp Keychain.\")\n        \n        err = SecKeychainUnlock(userKeychainTemp, UInt32(strlen(userpass.cString(using: .utf8) ?? [] )), userpass.cString(using: .utf8) ?? [] , true)\n\n        // remove the link first\n        \n        unlink(tempPath)\n        \n        userKeychainTemp = nil\n        \n        if err != noErr {\n            TCSLogErrorWithMark(\"Unable to unlock keychain reference.\")\n            // check if we should reset\n            \n            if let resetPass = getHint(type: .existingLocalUserPassword) as? String {\n                \n                TCSLogWithMark(\"Resetting keychain with migrated user/pass.\")\n                \n                var myKeychain : SecKeychain?\n                \n                err = SecKeychainOpen(userKeychainPath, &myKeychain)\n                \n                err = SecKeychainChangePassword(myKeychain, UInt32(resetPass.count), resetPass, UInt32(strlen(userpass.cString(using: .utf8) ?? [] )), userpass.cString(using: .utf8) ?? [] )\n\n                if err != 0 {\n                    TCSLogWithMark(\"Unable to reset keychain with migrated user/pass.\")\n                    \n                }\n            }\n            else if (getManagedPreference(key: .KeychainReset) as? Bool ?? true ) {\n                os_log(\"Resetting keychain password.\", log: \"\", type: .info)\n                clearKeychain(path: homeDir as String)\n\n            }\n            else {\n                TCSLogErrorWithMark(\"Keychain is locked, exiting.\")\n                allowLogin()\n                return\n            }\n        }\n        \n\n        // keychain unlock worked, now to get the real one\n\n        TCSLogWithMark(\"Getting Keychain reference.\")\n\n        err = SecKeychainOpen(userKeychainPath, &userKeychain)\n\n        TCSLogWithMark(\"Unlocking Keychain.\")\n\n        err = SecKeychainUnlock(userKeychain, UInt32(strlen(userpass.cString(using: .utf8) ?? [] )), userpass.cString(using: .utf8) ?? [] , true)\n\n\n        if err != noErr {\n            TCSLogErrorWithMark(\"error unlocking keychain!\")\n\n        }\n        let tokenArray = getHint(type: .tokens) as? Array<String>\n        let domainName = getHint(type: .noMADDomain) as? String\n        let shortName = getHint(type: .user) as? String\n\n        TCSLogWithMark(\"got shortname of \\(shortName ?? \"Unknown\")\")\n\n        if let tokenArray = tokenArray, tokenArray.count>2 {\n            TCSLogWithMark(\"We have tokens, so cloud login\")\n            XCredsAudit().tokensUpdated(idToken:tokenArray[0])\n            let xcredsCreds = Creds(accessToken: tokenArray[2], idToken: tokenArray[0], refreshToken: tokenArray[1], password: userpass, jsonDict: Dictionary())\n            TCSLogWithMark(\"saving tokens to keychain\")\n            if TokenManager.saveTokensToKeychain(creds: xcredsCreds, keychainPassword:userpass )==false {\n                TCSLogErrorWithMark(\"Error saving tokens to keychain\")\n            }\n\n            allowLogin()\n        }\n        else if let domainName = domainName, domainName.count>0{\n            TCSLogWithMark(\"AD Login with domain: \\(domainName)\")\n\n            if KeychainUtil().updatePassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue, pass: userpass, keychainPassword:userpass) == false {\n                TCSLogErrorWithMark(\"Error Updating password in keychain\")\n\n            }\n            allowLogin()\n        }\n        else {\n            TCSLogWithMark(\"Local login so saving password to keychain and passing through\")\n            if KeychainUtil().updatePassword(serviceName: PrefKeys.password.rawValue,accountName:PrefKeys.password.rawValue, pass: userpass, keychainPassword:userpass) == false {\n                TCSLogErrorWithMark(\"Error Updating password in keychain\")\n\n            }\n            allowLogin()\n        }\n    }\n\n    // Create keychain item\n    \n    fileprivate func createKeychainItem() {\n        \n    }\n    \n    func clearKeychain(path: String) {\n\n        // find the hardware UUID to kill the local items keychain\n        let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(\"IOPlatformExpertDevice\"))\n        guard let hardwareRaw = IORegistryEntryCreateCFProperty(service, kIOPlatformUUIDKey as CFString, kCFAllocatorDefault, 0) else { return }\n        let uuid = hardwareRaw.takeRetainedValue() as? String ?? \"\"\n\n        if uuid != \"\" {\n            // we have a uuid, now delete the folder\n            os_log(\"Removing local items keychain in order to purge it.\", log: \"\")\n            do {\n                try fm.removeItem(atPath: path + \"/Library/Keychains/\" + uuid)\n            } catch {\n                os_log(\"Unable to remove Local Items folder.\", log: \"\")\n            }\n        }\n\n        os_log(\"Resetting keychain.\", log: \"\")\n\n        SecKeychainResetLogin(UInt32(userpass.count), userpass, true)\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsLoginDone.swift",
    "content": "//\n//\n\n@available(macOS, deprecated: 11)\nclass XCredsLoginDone: XCredsBaseMechanism {\n\n    override init(mechanism: UnsafePointer<MechanismRecord>) {\n        super.init(mechanism: mechanism)\n    }\n\n    @objc override func run() {\n        TCSLogWithMark(\"XCredsLoginDone mech starting\")\n\n        let isAccountCreationPending = getHint(type: .isAccountCreationPending) as? Bool ?? false\n\n        if isAccountCreationPending==true {\n            TCSLogWithMark(\"isAccountCreationPending==true\")\n        }\n        else {\n            TCSLogWithMark(\"isAccountCreationPending==false\")\n        }\n        if isAccountCreationPending == false {\n            TCSLogWithMark(\"Hiding background\")\n            for window in NSApp.windows {\n                window.close()\n            }\n        }\n        else {\n            TCSLogWithMark(\"Not hiding progress indicator to avoid black screen\")\n        }\n        allowLogin()\n\n    }\n    @objc func tearDown() {\n        TCSLogWithMark(\"Got teardown request in XCredsLoginDone\")\n\n    }\n\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsLoginMechanism.swift",
    "content": "import Cocoa\nimport CryptoTokenKit\nimport Network\n\n\n@available(macOS, deprecated: 11)\n@objc class XCredsLoginMechanism: XCredsBaseMechanism {\n    var loginWebViewController: LoginWebViewController?\n    @objc var signInViewController: SignInViewController?\n    enum LoginWindowType {\n        case cloud\n        case usernamePassword\n    }\n    var timer:Timer?\n    let checkADLog = \"checkADLog\"\n    var loginWindowType = LoginWindowType.cloud\n    var mainLoginWindowController:MainLoginWindowController?\n    override init(mechanism: UnsafePointer<MechanismRecord>) {\n        super.init(mechanism: mechanism)\n\n//        SwitchLoginWindow\n        TCSLogWithMark(\"Setting up notification for switch\")\n        NotificationCenter.default.addObserver(forName: Notification.Name(\"SwitchLoginWindow\"), object: nil, queue: nil) { notification in\n\n            TCSLogWithMark(\"switch pressed\")\n\n            switch self.loginWindowType {\n\n            case .cloud:\n                self.showLoginWindowType(loginWindowType: .usernamePassword)\n\n            case .usernamePassword:\n                self.showLoginWindowType(loginWindowType: .cloud)\n            }\n        }\n\n      \n\n\n    }\n    @objc func tearDown() {\n        TCSLogWithMark(\"Got teardown request\")\n\n     \n    }\n\n    override func reload() {\n        if self.loginWindowType == .cloud {\n            TCSLogWithMark(\"reload in controller\")\n            mainLoginWindowController?.setupLoginWindowAppearance()\n            mainLoginWindowController?.controlsViewController?.refreshGridColumn?.isHidden=false\n            loginWebViewController?.loadPage()\n        }\n        else {\n            mainLoginWindowController?.controlsViewController?.refreshGridColumn?.isHidden=true\n\n        }\n    }\n    func useAutologin() -> Bool {\n\n        if UserDefaults(suiteName: \"com.apple.loginwindow\")?.bool(forKey: \"DisableFDEAutoLogin\") ?? false {\n            os_log(\"FDE AutoLogin Disabled per loginwindow preference key\", log: checkADLog, type: .debug)\n            return false\n        }\n\n        TCSLogWithMark(\"Checking for autologin.\")\n        if FileManager.default.fileExists(atPath: \"/tmp/xcredsrun\") {\n            os_log(\"XCreds has run once already. Load regular window as this isn't a reboot\", log: checkADLog, type: .debug)\n            return false\n        }\n\n        os_log(\"XCreds, trying autologin\", log: checkADLog, type: .debug)\n\n        updateRunDict(dict: Dictionary())\n        if let username = getContextString(type: \"fvusername\") {\n            TCSLogWithMark(\"got username = \\(username)\")\n        }\n        else {\n            TCSLogWithMark(\"no username found\")\n\n        }\n       if let _ = getContextString(type: \"fvpassword\") {\n           TCSLogWithMark(\"got fvpassword \")\n       }\n        else {\n            TCSLogWithMark(\"no password found\")\n        }\n\n        if let username = getContextString(type: \"fvusername\"), let password = getContextString(type: \"fvpassword\") {\n            os_log(\"Found username in context, doing autologin\", log: checkADLog, type: .debug)\n            setContextString(type: kAuthorizationEnvironmentUsername, value: username)\n            setContextString(type: kAuthorizationEnvironmentPassword, value: password)\n            return true\n        } else {\n            if let uuid = getEFIUUID() {\n                if let name = XCredsBaseMechanism.getShortname(uuid: uuid) {\n                    os_log(\"Found username in EFI, doing autologin\", log: checkADLog, type: .debug)\n\n                    setContextString(type: kAuthorizationEnvironmentUsername, value: name)\n                    return true\n                }\n            }\n        }\n        return true\n    }\n    fileprivate func getEFIUUID() -> String? {\n        TCSLogWithMark(\"getEFIUUID\")\n        let chosen = IORegistryEntryFromPath(kIOMasterPortDefault, \"IODeviceTree:/chosen\")\n        var properties : Unmanaged<CFMutableDictionary>?\n        let err = IORegistryEntryCreateCFProperties(chosen, &properties, kCFAllocatorDefault, IOOptionBits.init(bitPattern: 0))\n\n        if err != 0 {\n            TCSLogWithMark(\"getEFIUUID error\")\n            return nil\n        }\n\n        guard let props = properties!.takeRetainedValue() as? [ String : AnyHashable ] else {\n            TCSLogWithMark(\"getEFIUUID error props\")\n            return nil\n\n        }\n        guard let uuid = props[\"efilogin-unlock-ident\"] as? Data else {\n\n            TCSLogWithMark(\"getEFIUUID error uuid\")\n\n            return nil\n\n        }\n        TCSLogWithMark(\"uuid=\\(uuid.hexEncodedString())\")\n\n        return String.init(data: uuid, encoding: String.Encoding.utf8)\n    }\n    func selectAndShowLoginWindow(){\n        TCSLogWithMark()\n        if let window = mainLoginWindowController?.window {\n            window.makeKeyAndOrderFront(self)\n            window.orderFrontRegardless()\n        }\n        else {\n            TCSLogWithMark(\"NO MAIN WINDOW FOUND\")\n        }\n\n        let discoveryURL=DefaultsOverride.standardOverride.value(forKey: PrefKeys.discoveryURL.rawValue)\n        let preferLocalLogin = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldPreferLocalLoginInsteadOfCloudLogin.rawValue)\n        let shouldDetectNetwork = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldDetectNetworkToDetermineLoginWindow.rawValue)\n\n        let useROPG = DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldUseROPGForLoginWindowLogin\n.rawValue)\n        TCSLogWithMark(\"checking if local login\")\n        if preferLocalLogin == false,\n           let _ = discoveryURL { // oidc is configured\n            TCSLogWithMark(\"discovery url set and prefer local login is false, so seeing if we need to check network\")\n\n            //\n            //ROPG: show username password\n            //\n            if useROPG == true {\n                TCSLogWithMark(\"using ROPG so showing username/password\")\n                showLoginWindowType(loginWindowType: .usernamePassword)\n            }\n            else {\n                Task{ @MainActor in\n                    do {\n                        try await TokenManager().oidc().getEndpoints()\n                        //have network\n                        TCSLogWithMark(\"network available, showing cloud\")\n                        showLoginWindowType(loginWindowType: .cloud)\n\n                    }\n                    catch{\n                        //no network\n                        if shouldDetectNetwork == true {\n                            TCSLogWithMark(\"endpoints not available so showing username password login window\")\n                            showLoginWindowType(loginWindowType: .usernamePassword)\n\n                        }\n                        else {\n                            TCSLogWithMark(\"no network and not checking so showing cloud\")\n                            showLoginWindowType(loginWindowType: .cloud)\n\n                        }\n\n                    }\n                }\n            }\n\n        }\n        else {\n            TCSLogWithMark(\"preferring showing local\")\n            showLoginWindowType(loginWindowType: .usernamePassword)\n        }\n    }\n\n    @objc override func run() {\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ XCredsLoginMechanism mech starting ~~~~~~~~~~~~~~~~~~~\")\n\n\n        loginWebViewController=nil\n        signInViewController=nil\n        \n        if useAutologin() {\n            os_log(\"Using autologin\", log: checkADLog, type: .debug)\n            super.allowLogin()\n            return\n        }\n\n\n        if mainLoginWindowController == nil {\n            mainLoginWindowController = MainLoginWindowController.init(windowNibName: \"MainLoginWindowController\")\n        }\n        mainLoginWindowController?.mechanism=self\n        \n        let showLoginWindowDelaySeconds = DefaultsOverride.standardOverride.integer(forKey: PrefKeys.showLoginWindowDelaySeconds.rawValue)\n        \n        if showLoginWindowDelaySeconds > 0 {\n            TCSLogWithMark(\"Delaying showing window by \\(showLoginWindowDelaySeconds) seconds\")\n            \n            sleep(UInt32(showLoginWindowDelaySeconds))\n        }\n        NetworkMonitor.shared.startMonitoring()\n        selectAndShowLoginWindow()\n        \n        TCSLogWithMark(\"Verifying if we should show cloud login.\")\n        \n        if (StateFileHelper().fileExists(.returnType)==true){\n            TCSLogWithMark(\"xcreds_return exists\")\n        }\n        else {\n            TCSLogWithMark(\"xcreds_return does NOT exist\")\n        }\n        if StateFileHelper().fileExists(.returnType) == false,\n            DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldShowCloudLoginByDefault.rawValue) == false {\n            setContextString(type: kAuthorizationEnvironmentUsername, value: SpecialUsers.standardLoginWindow.rawValue)\n            TCSLogWithMark(\"marking to show standard login window\")\n\n            do {\n                try StateFileHelper().createFile(.returnType)\n            }\n            catch {\n                TCSLogWithMark(\"error creating return file\")\n\n            }\n            allowLogin()\n            return\n        }\n\n        if StateFileHelper().fileExists(.returnType)==true{\n            TCSLogWithMark(\"xcreds_return exists, removing\")\n            do {\n\n                try StateFileHelper().removeFile(.returnType)\n            }\n            catch {\n\n                TCSLogWithMark(\"Could not remove /usr/local/var/xcreds_return\")\n\n            }\n\n        }\n\n        TCSLogWithMark(\"Showing XCreds Login Window\")\n\n        //for some reason, software update activates and gets in the way. so we delay for 3 seconds before coming back to front\n        timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: false) { timer in\n            NSApp.activate(ignoringOtherApps: true)\n        }\n        \n\n        if let runDict = runDict() {\n\n            TCSLogWithMark(\"Run dict = \\(runDict.debugDescription)\")\n        }\n\n        if let errorMessage = getContextString(type: \"ErrorMessage\"){\n            TCSLogWithMark(\"Sticky error message = \\(errorMessage)\")\n\n            let alert = NSAlert()\n            alert.addButton(withTitle: \"OK\")\n            alert.messageText=errorMessage\n\n            alert.window.canBecomeVisibleWithoutLogin=true\n\n            let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n            if let bundle = bundle {\n                TCSLogWithMark(\"Found bundle\")\n\n                alert.icon=bundle.image(forResource: NSImage.Name(\"icon_128x128\"))\n\n            }\n            alert.runModal()\n\n        }\n\n    }\n   \n    override func allowLogin() {\n        TCSLogWithMark(\"Allowing Login\")\n\n        if loginWebViewController != nil || signInViewController != nil {\n            TCSLogWithMark(\"Dismissing loginWindowWindowController\")\n\n            mainLoginWindowController?.loginTransition {\n                super.allowLogin()\n            }\n        }\n        else {\n            TCSLogWithMark(\"calling allowLogin\")\n            super.allowLogin()\n        }\n\n    }\n    override func denyLogin(message:String?) {\n        loginWebViewController?.loadPage()\n        TCSLog(\"***************** DENYING LOGIN FROM LOGIN MECH ********************\");\n        super.denyLogin(message: message)\n    }\n    \n    func showLoginWindowType(loginWindowType:LoginWindowType)  {\n        TCSLogWithMark()\n\n        switch loginWindowType {\n        case .cloud:\n            self.loginWindowType = LoginWindowType.cloud\n            self.mainLoginWindowController?.controlsViewController?.refreshGridColumn?.isHidden=false\n\n            if loginWebViewController==nil{\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n                if let bundle = bundle{\n\n                    loginWebViewController = LoginWebViewController(nibName:  \"LoginWebViewController\", bundle: bundle)\n                }\n            }\n\n            guard let loginWebViewController = loginWebViewController else {\n                TCSLogWithMark(\"could not create loginWebViewController\")\n                return\n            }\n\n            loginWebViewController.mechanismDelegate=self\n\n\n\n            mainLoginWindowController?.addCenterView(loginWebViewController.view)\n            loginWebViewController.webView.nextKeyView=mainLoginWindowController?.controlsViewController?.view\n\n\n        case .usernamePassword:\n            self.mainLoginWindowController?.controlsViewController?.refreshGridColumn?.isHidden=true\n\n//            NetworkMonitor.shared.stopMonitoring()\n            self.loginWindowType = .usernamePassword\n\n\n            if signInViewController == nil {\n                let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n                if let bundle = bundle{\n                    TCSLogWithMark(\"Creating signInViewController\")\n                    signInViewController = SignInViewController(nibName: \"LocalUsersViewController\", bundle:bundle)\n                }\n            }\n\n            guard let signInViewController = signInViewController else {\n                TCSLogWithMark(\"could not create signInViewController\")\n                return\n            }\n            TCSLogWithMark()\n\n            if let rfidUsers = getHint(type: .rfidUsers) as? RFIDUsers {\n                signInViewController.rfidUsers = rfidUsers\n                TCSLogWithMark(\"rfidUsers! \\(rfidUsers.userDict?.count ?? 0)\")\n            }\n            else {\n                TCSLogWithMark(\"no rfidUsers in hints\")\n            }\n\n            if let localAdmin = getHint(type: .localAdmin) as? LocalAdminCredentials {\n                signInViewController.localAdmin = localAdmin\n            }\n            else {\n                TCSLogWithMark(\"no localAdmin found in hints\")\n            }\n\n            mainLoginWindowController?.addCenterView(signInViewController.view)\n\n            TCSLogWithMark()\n            mainLoginWindowController?.window?.makeFirstResponder(signInViewController.view)\n\n            signInViewController.mechanismDelegate=self\n            if signInViewController.usernameTextField != nil {\n                signInViewController.usernameTextField.isEnabled=true\n            }\n            if signInViewController.passwordTextField != nil {\n                signInViewController.passwordTextField.isEnabled=true\n                signInViewController.passwordTextField.stringValue=\"\"\n            }\n            if signInViewController.signIn != nil {\n                signInViewController.signIn.isEnabled = true\n            }\n            if signInViewController.localOnlyCheckBox != nil {\n                signInViewController.localOnlyCheckBox.isEnabled = true\n            }\n            mainLoginWindowController?.window?.forceToFrontAndFocus(self)\n            mainLoginWindowController?.window?.makeFirstResponder(signInViewController.usernameTextField)\n\n            signInViewController.signIn.nextKeyView=mainLoginWindowController?.controlsViewController?.view\n            mainLoginWindowController?.updateWindow()\n\n        }\n    }\n   \n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsPowerControlMechanism.swift",
    "content": "//\n//  PowerControl.swift\n//  NoMADLoginAD\n//\n//  Created by Josh Wisenbaker on 2/9/18.\n//  Copyright © 2018 NoMAD. All rights reserved.\n//\n\nimport IOKit\nimport IOKit.pwr_mgt\n\nenum SpecialUsers: String {\n    case sleep\n    case restart\n    case shutdown\n    case standardLoginWindow\n}\n@available(macOS, deprecated: 11)\nclass XCredsPowerControlMechanism: XCredsBaseMechanism {\n\n    @objc override func run() {\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ XCredsPowerControlMechanism mech starting starting mech starting ~~~~~~~~~~~~~~~~~~~\")\n\n//        if AuthorizationDBManager.shared.rightExists(right: \"loginwindow:login\"){\n//            TCSLogWithMark(\"setting standard login back to XCreds login\")\n//            let _ = AuthorizationDBManager.shared.replace(right:\"loginwindow:login\", withNewRight: \"XCredsLoginPlugin:LoginWindow\")\n//        }\n        guard let userName = usernameContext else {\n            TCSLogWithMark(\"No username was set somehow, pass the login to the next mech.\")\n            let _ = allowLogin()\n            return\n\n        }\n\n        switch userName {\n        case SpecialUsers.sleep.rawValue:\n            TCSLogWithMark(\"Sleeping system.\")\n            let port = IOPMFindPowerManagement(mach_port_t(MACH_PORT_NULL))\n            IOPMSleepSystem(port)\n            IOServiceClose(port)\n        case SpecialUsers.shutdown.rawValue:\n            TCSLogWithMark(\"Shutting system down system\")\n            let _ = cliTask(\"/sbin/shutdown -h now\")\n        case SpecialUsers.restart.rawValue:\n            TCSLogWithMark(\"Restarting system\")\n            let _ = cliTask(\"/sbin/shutdown -r now\")\n\n        case SpecialUsers.standardLoginWindow.rawValue:\n            TCSLogWithMark(\"mechanism right to boot back to mac login window (SpecialUsers.standardLoginWindow)\")\n            try? StateFileHelper().createFile(.returnType)\n           let _ = AuthRightsHelper.resetRights()\n            if UserDefaults.standard.bool(forKey: \"slowReboot\")==true {\n               sleep(30)\n            }\n            StateFileHelper().killOrReboot()\n\n\n        default:\n            TCSLogWithMark(\"No special users named. pass login to the next mech.\")\n\n            let _ = allowLogin()\n        }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/Mechanisms/XCredsUserSetup.swift",
    "content": "//\n//  XCredsUserSetup.swift\n//\n//\n\nimport ProductLicense\n@available(macOS, deprecated: 11)\nclass XCredsUserSetup: XCredsBaseMechanism{\n\n    @objc override func run() {\n        TCSLogWithMark(\"~~~~~~~~~~~~~~~~~~~ XCredsUserSetup mech starting ~~~~~~~~~~~~~~~~~~~\")\n        \n        let bundle = Bundle.findBundleWithName(name: \"XCreds\")\n\n        if let bundle = bundle {\n            let infoPlist = bundle.infoDictionary\n            if let infoPlist = infoPlist,\n                let build = infoPlist[\"CFBundleVersion\"] as? String,\n                let version = infoPlist[\"CFBundleShortVersionString\"] as? String {\n                \n                VersionCheck.shared.reportLicenseUsage(identifier: \"com.twocanoes.xcreds\", appVersion:version,buildNumber: build, event: .checkin) { isSuccess in\n                    print(isSuccess)\n                }\n\n                \n                TCSLogInfoWithMark(\"------------------------------------------------------------------\")\n                TCSLogInfoWithMark(\"XCreds Login \\(version).\\(build)\")\n                if DefaultsOverride.standardOverride.bool(forKey: \"showDebug\")==false {\n                    TCSLogInfoWithMark(\"Log showing only basic info and errors.\")\n                    TCSLogInfoWithMark(\"Set debugLogging to true to show verbose logging with\")\n                    TCSLogInfoWithMark(\"sudo defaults write /Library/Preferences/com.twocanoes.xcreds showDebug -bool true\")\n                }\n                else {\n                    TCSLogInfoWithMark(\"To disable verbose logging:\")\n                    TCSLogInfoWithMark(\"sudo defaults delete /Library/Preferences/com.twocanoes.xcreds showDebug\")\n\n                }\n                TCSLogInfoWithMark(\"To see all logging options, go to https://twocanoes.com/knowledge-base/capturing-xcreds-logs/\")\n\n\n                TCSLogInfoWithMark(\"------------------------------------------------------------------\")\n            }\n        }\n        TCSLogWithMark(\"checking to see if launchagent should be removed...\")\n        let fm = FileManager.default\n        let launchAgentPath = \"/Library/LaunchAgents/com.twocanoes.xcreds-launchagent.plist\"\n        let launchAgentExists = fm.fileExists(atPath: launchAgentPath)\n        if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldRemoveMenuItemAutoLaunch.rawValue)==true, launchAgentExists == true {\n            do {\n                TCSLogWithMark(\"removing launch agent...\")\n                try fm.removeItem(atPath: launchAgentPath)\n            }\n            catch {\n                TCSLogWithMark(\"error removing launch agent: \\(error)\")\n            }\n        }\n\n        do {\n            let secretKeeper = try SecretKeeper(label: \"XCreds Encryptor\", tag: \"XCreds Encryptor\")\n            let userManager = UserSecretManager(secretKeeper: secretKeeper)\n\n            let users = try userManager.uidUsers()\n            if let keys = users.userDict?.keys, keys.count>0{\n                TCSLogWithMark(\"setting up tap users\");\n                self.setHint(type: .rfidUsers, hint: users as NSSecureCoding)\n            }\n            TCSLogWithMark(\"checking to see if we should set admin credentials\")\n            if let adminUser = try userManager.adminCredentials(){\n\n                TCSLogWithMark(\"Setting Admin User from secure file for keychain reset\")\n                self.setHint(type: .localAdmin, hint: adminUser )\n            }\n\n            else if let aUsername = DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminUserName.rawValue), let aPassword =\n                DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminPassword.rawValue), aUsername.isEmpty==false, aPassword.isEmpty==false{\n\n                TCSLogWithMark(\"Setting Admin User from prefs / override script for keychain reset\")\n\n                let localAdmin = LocalAdminCredentials(username: aUsername, password: aPassword)\n                self.setHint(type: .localAdmin, hint: localAdmin)\n            }\n            try? StateFileHelper().removeFile(.fileVaultLogin)\n\n            if let credentials = getHint(type: .localAdmin) as? LocalAdminCredentials {\n                TCSLogWithMark(\"local admin set in hints\")\n\n                TCSLogWithMark(\"checking to see if we should skip filevault login by seeing if shouldSkipFileVaultLoginAdmin pref is true\")\n                if DefaultsOverride.standardOverride.bool(forKey: PrefKeys.shouldSkipFileVaultLoginAdmin.rawValue)==true,\n                   filevaultAuth(username: credentials.username, password: credentials.password) == true\n                {\n                    TCSLogWithMark(\"Successfully authenticated with FileVault using local admin.\")\n                    try? StateFileHelper().createFile(.fileVaultLogin)\n                }\n            \n                \n\n            }\n            else {\n                TCSLogWithMark(\"local admin not set in hints\")\n\n            }\n            if let aUsername = DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminUserName.rawValue){\n                TCSLogWithMark(\"localAdminUserName set: \\(aUsername)\")\n            }\n            else {\n                TCSLogWithMark(\"localAdminUserName not set\")\n            }\n            if let _ = DefaultsOverride.standardOverride.string(forKey: PrefKeys.localAdminPassword.rawValue){\n                TCSLogWithMark(\"localAdminPassword set\")\n\n            }\n            else {\n                TCSLogWithMark(\"localAdminPassword not set\")\n\n            }\n\n        }\n        catch {\n            TCSLogWithMark(error.localizedDescription)\n        }\n\n        updateDSRecords()\n\n        let _ = allowLogin()\n\n\n    }\n    \n    func updateDSRecords() {\n        guard let nonSystemUsers = try? getAllNonSystemUsers() else{\n            TCSLogWithMark(\"could not get non system users\")\n            return\n        }\n\n        for odRecord in nonSystemUsers {\n            let userDetails = try? odRecord.recordDetails(forAttributes: nil)\n            if let userDetails = userDetails {\n                if let _ = try? odRecord.values(forAttribute: \"dsAttrTypeNative:_xcreds_oidc_full_username\") as? [String]{\n                    TCSLogWithMark(\"user already has oidc full username\")\n                    continue\n                }\n                TCSLogWithMark(\"searching for user in user account\")\n                if let homeDirArray = userDetails[\"dsAttrTypeStandard:NFSHomeDirectory\"] as? Array<String>, homeDirArray.count>0{\n                    let homeDir = homeDirArray[0]\n                    TCSLogWithMark(\"looking in \\(homeDir) for ds_info.plist\")\n                    let appSupportFolder = homeDir + \"/Library/Application Support/XCreds\"\n                    let plistPath = appSupportFolder + \"/ds_info.plist\"\n\n                    TCSLogWithMark(\"looking in path \\(plistPath)\")\n                    if FileManager.default.fileExists(atPath: plistPath){\n                        TCSLogWithMark(\"found ds_info.plist\")\n                        do {\n                            TCSLogWithMark(\"reading plist\")\n                            let dict = try PropertyListDecoder().decode([String:String].self, from: Data(contentsOf: URL(fileURLWithPath: plistPath)))\n                            TCSLogWithMark(\"got plist\")\n\n                            if let currOIDCFullUsername = dict[\"_xcreds_oidc_full_username\"],\n                               let oidcUsername = dict[\"_xcreds_oidc_username\"],\n                               let subValue = dict[\"subValue\"],\n                               let issuerValue = dict[\"issuerValue\"]\n                            {\n                                TCSLogWithMark(\"updating user account info\")\n                                try odRecord.setValue(\"1\", forAttribute: \"dsAttrTypeNative:_xcreds_oidc_updatedfromlocal\")\n\n                                try odRecord.setValue(currOIDCFullUsername, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_full_username\")\n                                try odRecord.setValue(oidcUsername, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_username\")\n                                try odRecord.setValue(subValue, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_sub\")\n                                try odRecord.setValue(issuerValue, forAttribute: \"dsAttrTypeNative:_xcreds_oidc_iss\")\n\n                                \n                                if let currKerberosPrincipal = dict[\"_xcreds_activedirectory_kerberosPrincipal\"] {\n                                    try odRecord.setValue(currKerberosPrincipal, forAttribute: \"dsAttrTypeNative:_xcreds_activedirectory_kerberosPrincipal\")\n                                }\n                                TCSLogWithMark(\"removing file\")\n                                try FileManager.default.removeItem(atPath: plistPath)\n\n                            }\n                        }\n                        catch {\n                            TCSLogWithMark(\"error decoding propertylist: \\(error)\")\n                        }\n\n                    }\n\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/PinPromptWindowController.swift",
    "content": "//\n//  PinPromptWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 12/6/24.\n//\n\nimport Cocoa\n\nclass PinPromptWindowController: NSWindowController {\n    @IBOutlet weak var pinTextField: NSSecureTextField!\n    var pin:String?\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        self.window?.canBecomeVisibleWithoutLogin=true\n    }\n    \n    @IBAction func cancelButtonPressed(_ sender: NSButton) {\n        NSApp.stopModal(withCode: .cancel)\n    }\n    @IBAction func okButtonPressed(_ sender: NSButton) {\n        if !pinTextField.stringValue.isEmpty {\n            pin = pinTextField.stringValue\n            NSApp.stopModal(withCode: .OK)\n        }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/PinPromptWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"PinPromptWindowController\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"pinTextField\" destination=\"W0Z-gI-6XW\" id=\"szP-Sh-d8T\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" titlebarAppearsTransparent=\"YES\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <rect key=\"contentRect\" x=\"1364\" y=\"527\" width=\"337\" height=\"124\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"337\" height=\"124\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"W0Z-gI-6XW\">\n                        <rect key=\"frame\" x=\"20\" y=\"65\" width=\"297\" height=\"36\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"FkN-cM-zrd\">\n                            <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                        <connections>\n                            <action selector=\"pinTextField:\" target=\"-2\" id=\"oGt-sd-H3i\"/>\n                        </connections>\n                    </secureTextField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Bfq-Nd-CDN\">\n                        <rect key=\"frame\" x=\"250\" y=\"13\" width=\"74\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"KHP-VB-ljb\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"60\" id=\"Htk-M8-0b7\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"okButtonPressed:\" target=\"-2\" id=\"Gjg-q5-YeC\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a3M-C0-4jk\">\n                        <rect key=\"frame\" x=\"176\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ltr-oU-xgW\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"cNj-9z-EyE\"/>\n                        </connections>\n                    </button>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" ambiguous=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oOf-if-sef\">\n                        <rect key=\"frame\" x=\"146\" y=\"109\" width=\"45\" height=\"31\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"PIN\" id=\"Yhs-JC-HcV\">\n                            <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"W0Z-gI-6XW\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"1ah-FN-wEc\"/>\n                    <constraint firstItem=\"W0Z-gI-6XW\" firstAttribute=\"top\" secondItem=\"oOf-if-sef\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"9Pu-aB-GIg\"/>\n                    <constraint firstItem=\"Bfq-Nd-CDN\" firstAttribute=\"leading\" secondItem=\"a3M-C0-4jk\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"JWO-3A-I7p\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"Bfq-Nd-CDN\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"Kva-Ru-T9i\"/>\n                    <constraint firstItem=\"Bfq-Nd-CDN\" firstAttribute=\"top\" secondItem=\"W0Z-gI-6XW\" secondAttribute=\"bottom\" constant=\"25\" id=\"MnP-zU-TSp\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Bfq-Nd-CDN\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"NiB-QW-fcn\"/>\n                    <constraint firstItem=\"W0Z-gI-6XW\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"o2c-J6-VBT\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"a3M-C0-4jk\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"xeS-j4-kLx\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"157.5\" y=\"-107\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/PinSetWindowController.swift",
    "content": "//\n//  PinPromptWindowController.swift\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 12/6/24.\n//\n\nimport Cocoa\n\nclass PinSetWindowController: NSWindowController {\n    @IBOutlet weak var pinTextField: NSSecureTextField!\n    @IBOutlet weak var verifyPinTextField: NSSecureTextField!\n\n    var pin:String?\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        self.window?.canBecomeVisibleWithoutLogin=true\n    }\n    \n    @IBAction func skipPINButtonPressed(_ sender: NSButton) {\n        pin=nil\n        NSApp.stopModal(withCode: .alertThirdButtonReturn)\n\n    }\n    @IBAction func cancelButtonPressed(_ sender: NSButton) {\n        NSApp.stopModal(withCode: .cancel)\n    }\n    @IBAction func okButtonPressed(_ sender: NSButton) {\n        if !pinTextField.stringValue.isEmpty,\n           !verifyPinTextField.stringValue.isEmpty,\n           pinTextField.stringValue == verifyPinTextField.stringValue\n\n        {\n            pin = pinTextField.stringValue\n            NSApp.stopModal(withCode: .OK)\n        }\n        else {\n            self.window?.shakeWindow()\n        }\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/PinSetWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"PinSetWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"pinTextField\" destination=\"W0Z-gI-6XW\" id=\"szP-Sh-d8T\"/>\n                <outlet property=\"verifyPinTextField\" destination=\"JHx-SF-9KL\" id=\"ylV-01-1TZ\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Add PIN\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <rect key=\"contentRect\" x=\"1364\" y=\"527\" width=\"337\" height=\"282\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"337\" height=\"282\"/>\n                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                <subviews>\n                    <stackView distribution=\"fill\" orientation=\"vertical\" alignment=\"centerX\" horizontalStackHuggingPriority=\"249.99998474121094\" verticalStackHuggingPriority=\"249.99998474121094\" detachesHiddenViews=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pIq-mZ-WSD\">\n                        <rect key=\"frame\" x=\"44\" y=\"104\" width=\"248\" height=\"158\"/>\n                        <subviews>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oOf-if-sef\">\n                                <rect key=\"frame\" x=\"80\" y=\"127\" width=\"88\" height=\"31\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Set PIN\" id=\"Yhs-JC-HcV\">\n                                    <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"W0Z-gI-6XW\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"83\" width=\"248\" height=\"36\"/>\n                                <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"FkN-cM-zrd\">\n                                    <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <allowedInputSourceLocales>\n                                        <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                                    </allowedInputSourceLocales>\n                                </secureTextFieldCell>\n                                <connections>\n                                    <action selector=\"pinTextField:\" target=\"-2\" id=\"oGt-sd-H3i\"/>\n                                    <outlet property=\"nextKeyView\" destination=\"JHx-SF-9KL\" id=\"pLj-hb-gAq\"/>\n                                </connections>\n                            </secureTextField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"o64-Lg-Dfb\">\n                                <rect key=\"frame\" x=\"67\" y=\"44\" width=\"114\" height=\"31\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Verify PIN\" id=\"MyA-dJ-oGZ\">\n                                    <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JHx-SF-9KL\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"248\" height=\"36\"/>\n                                <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"QJZ-4H-hbW\">\n                                    <font key=\"font\" textStyle=\"largeTitle\" name=\".SFNS-Regular\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <allowedInputSourceLocales>\n                                        <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                                    </allowedInputSourceLocales>\n                                </secureTextFieldCell>\n                                <connections>\n                                    <action selector=\"pinTextField:\" target=\"-2\" id=\"764-1x-rqA\"/>\n                                    <outlet property=\"nextKeyView\" destination=\"pIq-mZ-WSD\" id=\"YVL-LM-yof\"/>\n                                </connections>\n                            </secureTextField>\n                        </subviews>\n                        <visibilityPriorities>\n                            <integer value=\"1000\"/>\n                            <integer value=\"1000\"/>\n                            <integer value=\"1000\"/>\n                            <integer value=\"1000\"/>\n                        </visibilityPriorities>\n                        <customSpacing>\n                            <real value=\"3.4028234663852886e+38\"/>\n                            <real value=\"3.4028234663852886e+38\"/>\n                            <real value=\"3.4028234663852886e+38\"/>\n                            <real value=\"3.4028234663852886e+38\"/>\n                        </customSpacing>\n                    </stackView>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Bfq-Nd-CDN\">\n                        <rect key=\"frame\" x=\"250\" y=\"13\" width=\"74\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"KHP-VB-ljb\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"60\" id=\"5OQ-T0-juh\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"okButtonPressed:\" target=\"-2\" id=\"Gjg-q5-YeC\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a3M-C0-4jk\">\n                        <rect key=\"frame\" x=\"176\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ltr-oU-xgW\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"62\" id=\"WM9-JG-hHT\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"cNj-9z-EyE\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vd4-Fm-Gzb\">\n                        <rect key=\"frame\" x=\"13\" y=\"13\" width=\"119\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Don't Use PIN\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Kce-iB-G6O\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"skipPINButtonPressed:\" target=\"-2\" id=\"i4c-Th-Em4\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Bfq-Nd-CDN\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"0V0-Nf-XVF\"/>\n                    <constraint firstItem=\"Vd4-Fm-Gzb\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"59I-YN-7gq\"/>\n                    <constraint firstItem=\"a3M-C0-4jk\" firstAttribute=\"top\" secondItem=\"pIq-mZ-WSD\" secondAttribute=\"bottom\" constant=\"64\" id=\"CMJ-Aq-74P\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"Vd4-Fm-Gzb\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"D74-Fq-3OZ\"/>\n                    <constraint firstItem=\"pIq-mZ-WSD\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"44\" id=\"EkM-Fu-JXD\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"a3M-C0-4jk\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"I2K-uH-d0K\"/>\n                    <constraint firstItem=\"pIq-mZ-WSD\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"Syc-hu-Xaf\"/>\n                    <constraint firstItem=\"Bfq-Nd-CDN\" firstAttribute=\"leading\" secondItem=\"a3M-C0-4jk\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"cSZ-CM-EIv\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"Bfq-Nd-CDN\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"dRy-dt-ymd\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"pIq-mZ-WSD\" secondAttribute=\"trailing\" constant=\"45\" id=\"xXh-6b-RB6\"/>\n                </constraints>\n                <connections>\n                    <outlet property=\"nextKeyView\" destination=\"W0Z-gI-6XW\" id=\"M2X-gu-3J5\"/>\n                </connections>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"157.5\" y=\"-102\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/SetupCardWindowController.swift",
    "content": "//\n//  SetupCardWindowController.swift\n//  XCreds\n//\n//  Created by Timothy Perfitt on 12/4/24.\n//\n\nimport Cocoa\nimport CryptoTokenKit\n\nclass SetupCardWindowController: NSWindowController {\n\n    var pin:String?\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        TCSLogWithMark()\n\n\n        TCSLogWithMark()\n        self.window?.close()\n        NSApp.stopModal(withCode: NSApplication.ModalResponse.OK)\n    \n\n\n//        guard let readerName = DefaultsOverride.standardOverride.string(forKey: PrefKeys.ccidSlotName.rawValue) else {\n//            TCSLogWithMark(\"No ccid slot name\")\n//            return\n//        }\n//        let watcher = TKTokenWatcher()\n//\n//\n//        watcher.setInsertionHandler({ tokenID in\n//            watcher.addRemovalHandler({ tokenID in\n//                TCSLogWithMark(\"card removed\")\n//            }, forTokenID: tokenID)\n//\n//            let slotNames = TKSmartCardSlotManager.default?.slotNames\n//\n//            guard let slotNames = slotNames, slotNames.count>0 else {\n//                return\n//            }\n//\n//            if slotNames.contains(readerName) == false {\n//                TCSLogWithMark(\"reader \\(readerName) not found\")\n//            }\n//            let slot = TKSmartCardSlotManager.default?.slotNamed(readerName)\n//            guard let tkSmartCard = slot?.makeSmartCard() else {\n//                return\n//            }\n//            TCSLogWithMark(\"card inserted\")\n//\n//            let builtInReader = CCIDCardReader(tkSmartCard: tkSmartCard)\n//            TCSLogWithMark()\n//\n//            let returnData = builtInReader.sendAPDU(cla: 0xFF, ins: 0xCA, p1: 0, p2: 0, data: nil)\n//            TCSLogWithMark()\n//            if let returnData=returnData, returnData.count>2{\n//                DispatchQueue.main.async {\n//                    TCSLogWithMark()\n//                    let hex=returnData[0...returnData.count-3].hexEncodedString()\n//\n//                    let pinSetWindowController = PinSetWindowController(windowNibName: \"PinSetWindowController\")\n//                    let res = NSApp.runModal(for: pinSetWindowController.window!)\n//\n//                    if res == .OK{\n//                        self.pin = pinSetWindowController.pin\n//\n//                    }\n//\n//                    if res == .cancel {\n//                        pinSetWindowController.window?.close()\n//                        return\n//                    }\n//\n//                    pinSetWindowController.window?.close()\n//\n//\n//                    self.uid = hex\n//                    TCSLogWithMark()\n//                    self.window?.close()\n//                    NSApp.stopModal(withCode: NSApplication.ModalResponse.OK)\n//                }\n//            }\n//\n//        })\n\n    }\n    \n    @IBAction func cancelButtonPressed(_ sender: NSButton) {\n        self.window?.close()\n        NSApp.stopModal(withCode: .cancel)\n\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/SetupCardWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"SetupCardWindowController\" customModule=\"XCreds\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Set Up Login Card\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"632\" y=\"409\" width=\"480\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dQs-Af-OwT\">\n                        <rect key=\"frame\" x=\"392\" y=\"13\" width=\"76\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Tpm-t6-chr\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancelButtonPressed:\" target=\"-2\" id=\"HO6-bl-VGM\"/>\n                        </connections>\n                    </button>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lpS-XI-Yvh\">\n                        <rect key=\"frame\" x=\"17\" y=\"154\" width=\"445\" height=\"96\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" id=\"Hj7-wW-UNQ\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <string key=\"title\">To pair an RFID card  to your user account, tap the card to the reader now. The card can then be used instead of entering your password when logging in to this Mac. You will be prompted to optionally set a PIN that will be required when tapping to log in. Using a PIN helps secure your password and prevents someone who has your card but does not know your PIN from logging in.</string>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mZ7-4C-UaT\">\n                        <rect key=\"frame\" x=\"142\" y=\"95\" width=\"195\" height=\"28\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" controlSize=\"large\" lineBreakMode=\"clipping\" alignment=\"center\" title=\"Tap Card to Log In\" id=\"eed-Fj-ywd\">\n                            <font key=\"font\" metaFont=\"system\" size=\"24\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-238\" y=\"-18\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/WifiWindowController.swift",
    "content": "//\n//  WifiView.swift\nimport Cocoa\nimport CoreWLAN\n\nclass OKTabPopUpButton: NSPopUpButton {\n  override var canBecomeKeyView: Bool {return true} //\n}\n@available(macOS, deprecated: 11)\nclass WifiWindowController: NSWindowController, NetworkManagerDelegate, NSMenuDelegate {\n//    @IBOutlet weak var backgroundView: NonBleedingView!\n//    @IBOutlet weak var mainView: NonBleedingView!\n    @IBOutlet weak var certificateLabel: NSTextField!\n    @IBOutlet weak var wifiCredentialTitleLabel: NSTextField?\n    @IBOutlet weak var networkSearch: NSButton?\n    @IBOutlet weak var networkPassword: NSSecureTextField?\n    @IBOutlet weak var networkUsername: NSTextField?\n    @IBOutlet weak var networkConnectButton: NSButton?\n    @IBOutlet weak var networkstatusLabel: NSTextField?\n    @IBOutlet weak var networkWifiPopup: NSPopUpButton?\n//    @IBOutlet weak var networkOpenStatusLabel: NSTextField!\n    @IBOutlet weak var certificatePopupButton: NSPopUpButton!\n    @IBOutlet weak var networkPasswordLabel: NSTextField!\n    //    @IBOutlet weak var dismissButton: NSButton!\n    @IBOutlet var credentialsWindow: NSWindow!\n    @IBOutlet weak var networkConnectionSpinner: NSProgressIndicator?\n    @IBOutlet weak var addSSIDMenuButton: NSButton?\n    @IBOutlet weak var addSSIDButton: NSButton?\n    @IBOutlet weak var addSSIDText: NSTextField?\n    @IBOutlet weak var addSSIDLabel: NSTextField?\n    \n    @IBOutlet weak var wifiSwitch: NSSwitch!\n    @IBOutlet weak var networkUsernameLabel: NSTextField!\n    @IBOutlet weak var wifiPopupMenu: NSMenu!\n    @IBAction func help(_ sender: Any) {\n    }\n\n    @IBOutlet weak var networkUsernameView: NSView?\n    @IBOutlet weak var networkPasswordView: NSView?\n\n    var networks: Set<CWNetwork> = []\n    var selectedNetwork:CWNetwork?\n    let wifiLog = \"wifiLog\"\n    private var defaultFadeDuration: TimeInterval = 0.1\n    private var completionHandler: (() -> Void)?\n    var delegate: XCredsMechanismProtocol?\n    let networkManager = NetworkManager()\n\n    @IBAction func wifiCredentialCancelButtonPressed(_ sender: NSButton) {\n        NSApp.stopModal()\n        credentialsWindow.orderOut(self)\n        updateNetworks()\n\n    }\n    override func awakeFromNib() {\n        TCSLogWithMark()\n        super.awakeFromNib()\n        TCSLogWithMark()\n\n        configureAppearance()\n        TCSLogWithMark()\n        updateAvailableNetworks()\n        self.networkUsernameView?.isHidden=true\n        self.networkPasswordView?.isHidden=true\n        certificatePopupButton.removeAllItems()\n        certificatePopupButton.addItem(withTitle: \"None\")\n        TCSLogWithMark(\"adding wifi networks\")\n        certificatePopupButton.addItems(withTitles: NetworkManager().identityCommonNames())\n\n\n        networkManager.wifiState() { state in\n            switch state {\n            case .off:\n                self.wifiSwitch.state = .off\n\n            case .on:\n                self.wifiSwitch.state = .on\n            }\n        }\n    }\n\n\n    @IBAction func menuItemSelected(_ popupButton: NSPopUpButton) {\n\n        if popupButton.titleOfSelectedItem == networkManager.getCurrentSSID() {\n            print(\"selected current\");\n        }\n        else {\n            if let network = popupButton.selectedItem?.representedObject as? CWNetwork {\n                selectedNetwork = network\n                configureUIForSelectedNetwork(network: network)\n            }\n        }\n\n\n\n    }\n    func menuNeedsUpdate(_ menu: NSMenu) {\n        updateNetworks()\n    }\n\n    @objc func updateAvailableNetworks() {\n        DispatchQueue.global().async {\n\n            DispatchQueue.main.async {\n                self.networkWifiPopup?.isEnabled=false\n                self.networkConnectionSpinner?.startAnimation(true)\n                self.networkConnectionSpinner?.isHidden=false\n\n            }\n\n            if let availableNetworks = self.networkManager.findNetworks() {\n                self.networks=availableNetworks\n            }\n            DispatchQueue.main.async {\n                self.networkWifiPopup?.isEnabled=true\n                self.networkConnectionSpinner?.stopAnimation(self)\n                self.networkConnectionSpinner?.isHidden=true\n                self.updateNetworks()\n            }\n        }\n\n\n    }\n\n    func updateNetworks() {\n        os_log(\"Remove allItems\")\n        self.networkWifiPopup?.removeAllItems()\n        if networks.count == 0 {\n            os_log(\"Unable to find any networks\", log: wifiLog, type: .debug)\n            self.networkWifiPopup?.addItem(withTitle: \"No networks\")\n        }\n        for network in networks {\n            if let networkName = network.ssid {\n                 self.networkWifiPopup?.addItem(withTitle: networkName)\n                self.networkWifiPopup?.lastItem?.representedObject=network\n                 self.networks.insert(network)\n            }\n        }\n\n        self.networkWifiPopup?.selectItem(withTitle: networkManager.getCurrentSSID() ?? \"\")\n\n        configCurrentNetwork()\n\n    }\n    func configCurrentNetwork() {\n        TCSLogWithMark()\n        if let currentNetworkName = networkManager.getCurrentSSID() {\n             self.networkstatusLabel?.stringValue = \"Connected to: \\(currentNetworkName)\"\n        } else {\n             self.networkstatusLabel?.stringValue = \"Connected via Ethernet\"\n        }\n        TCSLogWithMark()\n    }\n\n    private func configureAppearance() {\n        TCSLogWithMark()\n        self.networkWifiPopup?.removeAllItems()\n        self.networkWifiPopup?.addItem(withTitle: \"Choose Network...\")\n    }\n\n\n\n    func set(completionHandler: (() -> Void)?) {\n        self.completionHandler = completionHandler\n    }\n\n    @IBAction func dismissButton(_ sender: Any) {\n        TCSLogWithMark(\"closing window\")\n        DispatchQueue.main.async {\n            TCSLogWithMark(\"Triggering login window reload\")\n            self.delegate?.reload()\n            self.window?.close()\n        }\n    }\n\n    @IBAction func connect(_ sender: Any) {\n        if let selectedNetwork = selectedNetwork {\n\n            let userPassword = self.networkPassword?.stringValue\n            let username = self.networkUsername?.stringValue\n            var identity:SecIdentity?\n            if certificatePopupButton.indexOfSelectedItem>0{\n                let cn = certificatePopupButton.title\n                TCSLogWithMark(\"using cert \\(cn)\")\n                let identityFromCN = TCSKeychain.findIdentity(withSubject: cn)\n                TCSLogWithMark(\"using cert2 \\(identityFromCN.debugDescription)\")\n\n                identity = identityFromCN?.takeRetainedValue()\n                TCSLogWithMark(\"using identity: \\(cn)\")\n                TCSLogWithMark(\"identity: \\(identity.debugDescription)\")\n            }\n            TCSLogWithMark(\"connectWiFi\")\n            let connected = networkManager.connectWifi(with: selectedNetwork, password: userPassword, username: username, identity: identity)\n            TCSLogWithMark(\"done connectWifi\")\n\n            if connected {\n                TCSLogWithMark(\"connected\")\n                NSApp.stopModal()\n                credentialsWindow.orderOut(self)\n\n                networkManager.delegate = self\n                networkManager.internetConnected()\n                return\n            } else {\n                TCSLogWithMark(\"not connected\")\n                credentialsWindow.shake(self)\n            }\n        }\n    }\n\n\n    @IBAction func wifiButtonPressed(_ sender: NSSwitch) {\n\n        if sender.state == .off {\n            networkManager.setWiFiState(.off) {\n                self.updateAvailableNetworks()\n\n\n\n            }\n        }\n        else {\n            networkManager.setWiFiState(.on) {\n                self.networkWifiPopup?.isEnabled=false\n                self.networkConnectionSpinner?.startAnimation(true)\n                self.networkConnectionSpinner?.isHidden=false\n\n                DispatchQueue.main.asyncAfter(deadline: .now() + 3) {\n                    self.updateAvailableNetworks()\n                }\n            }\n        }\n        TCSLogWithMark(\"Wifi Button Switch changed\")\n\n\n    }\n    func configureUIForSelectedNetwork(network: CWNetwork) {\n        self.networkUsername?.stringValue = \"\"\n        self.networkPassword?.stringValue = \"\"\n        let securityType = networkManager.networkSecurityType(network)\n\n        switch securityType {\n        case .none:\n            connect(self)\n\n            return\n        case .password:\n            self.networkUsername?.isHidden = true\n            networkUsernameLabel.isHidden = true\n            certificateLabel.isHidden = true\n            self.certificatePopupButton.isHidden = true\n\n            self.networkPassword?.isHidden = false\n            networkPasswordLabel?.isHidden = false\n\n        case .enterpriseUserPassword:\n            self.networkUsername?.isHidden = false\n            networkUsernameLabel.isHidden = false\n\n            self.networkPassword?.isHidden = false\n            networkPasswordLabel?.isHidden = false\n            certificateLabel.isHidden = false\n            self.certificatePopupButton.isHidden = false\n\n        }\n        wifiCredentialTitleLabel?.stringValue = \"The wifi network \\\"\\(network.ssid ?? \"\" )\\\" requires login:\"\n        credentialsWindow.canBecomeVisibleWithoutLogin = true\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n            self.credentialsWindow.level = .screenSaver+10\n        }\n        NSApp.runModal(for: credentialsWindow)\n\n    }\n\n    @IBAction func searchButton(_ sender: Any) {\n        self.updateAvailableNetworks()\n    }\n    \n    @IBAction func addSSIDMenuButton(_ sender: Any){\n        // Hiding the other UI\n        networkUsernameView?.isHidden = true\n        networkPasswordView?.isHidden = true\n        \n        // Making the add SSID options appear\n        addSSIDText?.isHidden = false\n        addSSIDLabel?.isHidden = false\n        addSSIDButton?.isHidden = false\n    }\n    \n    @IBAction func addSSIDButton(_ sender: Any){\n        \n        // Searching for a WiFi of that name\n        let results = networkManager.findNetworkWithSSID(ssid: addSSIDText?.stringValue ?? \"Unknown SSID\" ) ?? []\n        \n        // Adding the SSID to the network list\n        for network in results {\n            self.networkWifiPopup?.addItem(withTitle: network.ssid ?? \"Unknown SSID\")\n            self.networkWifiPopup?.selectItem(withTitle: network.ssid ?? \"Unknown SSID\")\n        }\n        networks.formUnion(results)\n        \n        // Making the other views accessible again\n        networkUsernameView?.isHidden = false\n        networkPasswordView?.isHidden = false\n        \n        // Hiding the add SSID options\n        addSSIDText?.isHidden = true\n        addSSIDLabel?.isHidden = true\n        addSSIDButton?.isHidden = true\n        \n        // Updating the network changed UI\n//        self.configureUIForSelectedNetwork()\n    }\n\n    // In order to prevent a NSView from bleeding it's mouse events to the parent, one must implement the empty methods.\n\n\n\n    // MARK: - NetworkManager Delegates\n    func networkManagerFullyFinishedInternetConnectionTimer() {\n//        self.enableUI()\n        self.networkUsername?.stringValue = \"\"\n        self.networkPassword?.stringValue = \"\"\n    }\n\n    func networkManagerConnectedToNetwork() {\n        TCSLogWithMark(\"WiFi successfully connected leaving manager\")\n        self.dismissButton(self)\n    }\n}\n"
  },
  {
    "path": "XCredsLoginPlugIn/WifiWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"23727\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23727\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"WifiWindowController\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"certificateLabel\" destination=\"eqw-jG-xk4\" id=\"PKZ-wy-nD9\"/>\n                <outlet property=\"certificatePopupButton\" destination=\"Sb1-PH-di9\" id=\"Dxm-0p-sb5\"/>\n                <outlet property=\"credentialsWindow\" destination=\"lLG-Bl-vZe\" id=\"OXn-89-N40\"/>\n                <outlet property=\"networkConnectionSpinner\" destination=\"Z7T-Xy-w9X\" id=\"nGG-sI-Zj8\"/>\n                <outlet property=\"networkPassword\" destination=\"iXc-w6-KVu\" id=\"igd-gX-Ai2\"/>\n                <outlet property=\"networkPasswordLabel\" destination=\"bbs-5k-6Qs\" id=\"Ibt-6i-QHU\"/>\n                <outlet property=\"networkUsername\" destination=\"ju4-Cc-cV9\" id=\"VTm-O0-0RK\"/>\n                <outlet property=\"networkUsernameLabel\" destination=\"cST-FL-tNs\" id=\"Q7b-m4-MFi\"/>\n                <outlet property=\"networkWifiPopup\" destination=\"vwT-dQ-vyr\" id=\"SUF-IL-RMQ\"/>\n                <outlet property=\"wifiCredentialTitleLabel\" destination=\"Tjq-cj-K2q\" id=\"mkK-jQ-i7r\"/>\n                <outlet property=\"wifiPopupMenu\" destination=\"58J-Jm-X2j\" id=\"EtJ-Gw-8uZ\"/>\n                <outlet property=\"wifiSwitch\" destination=\"yFB-SG-43g\" id=\"Fhi-sh-pAT\"/>\n                <outlet property=\"window\" destination=\"QEp-dc-tSh\" id=\"t7T-qq-1E5\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titleVisibility=\"hidden\" id=\"QEp-dc-tSh\" customClass=\"LoginWindow\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"144\" y=\"174\" width=\"450\" height=\"356\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"82w-TR-3gA\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"356\"/>\n                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                <subviews>\n                    <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"brE-li-Fg3\">\n                        <rect key=\"frame\" x=\"83\" y=\"49\" width=\"284\" height=\"237\"/>\n                        <subviews>\n                            <progressIndicator wantsLayer=\"YES\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" maxValue=\"100\" bezeled=\"NO\" indeterminate=\"YES\" controlSize=\"small\" style=\"spinning\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Z7T-Xy-w9X\">\n                                <rect key=\"frame\" x=\"259\" y=\"6\" width=\"16\" height=\"16\"/>\n                            </progressIndicator>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iR4-yt-s83\">\n                                <rect key=\"frame\" x=\"259\" y=\"88\" width=\"37\" height=\"15\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"smallSquare\" bezelStyle=\"smallSquare\" image=\"NSRefreshFreestandingTemplate\" imagePosition=\"only\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Ekl-sd-DJK\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"searchButton:\" target=\"-2\" id=\"CUS-s8-IAg\"/>\n                                    <outlet property=\"nextKeyView\" destination=\"kuQ-OG-WIQ\" id=\"kes-qf-4ut\"/>\n                                </connections>\n                            </button>\n                            <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rQj-eC-ymc\">\n                                <rect key=\"frame\" x=\"102\" y=\"166\" width=\"82\" height=\"54\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"48\" id=\"FPm-UJ-bFA\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"82\" id=\"cB9-ep-mTD\"/>\n                                </constraints>\n                                <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyUpOrDown\" image=\"globe\" catalog=\"system\" id=\"Yzt-2U-PjT\"/>\n                            </imageView>\n                            <popUpButton verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vwT-dQ-vyr\" customClass=\"OKTabPopUpButton\" customModule=\"XCredsLoginPlugin\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"28\" y=\"81\" width=\"236\" height=\"25\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <popUpButtonCell key=\"cell\" type=\"push\" title=\"Choose Network\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"borderAndBezel\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"ejl-yP-KaF\" id=\"gAm-ea-iCE\">\n                                    <behavior key=\"behavior\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"message\"/>\n                                    <menu key=\"menu\" id=\"58J-Jm-X2j\">\n                                        <items>\n                                            <menuItem title=\"Choose Network\" state=\"on\" id=\"ejl-yP-KaF\"/>\n                                            <menuItem title=\"Item 2\" id=\"qUq-Yo-uy1\"/>\n                                            <menuItem title=\"Item 3\" id=\"iYg-8m-GqD\"/>\n                                        </items>\n                                        <connections>\n                                            <outlet property=\"delegate\" destination=\"-2\" id=\"LyO-Pq-bte\"/>\n                                        </connections>\n                                    </menu>\n                                    <connections>\n                                        <action selector=\"menuItemSelected:\" target=\"-2\" id=\"nIa-ZQ-8j6\"/>\n                                    </connections>\n                                </popUpButtonCell>\n                                <connections>\n                                    <outlet property=\"nextKeyView\" destination=\"iR4-yt-s83\" id=\"LIp-mY-ESs\"/>\n                                </connections>\n                            </popUpButton>\n                            <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VOb-lv-VeC\">\n                                <rect key=\"frame\" x=\"5\" y=\"81.5\" width=\"23\" height=\"26\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" image=\"wifi\" catalog=\"system\" id=\"2Jg-hD-hZt\"/>\n                            </imageView>\n                            <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kms-sE-nNp\">\n                                <rect key=\"frame\" x=\"103\" y=\"124\" width=\"78\" height=\"22\"/>\n                                <subviews>\n                                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hzq-cw-efs\">\n                                        <rect key=\"frame\" x=\"-2\" y=\"4\" width=\"31\" height=\"16\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"WiFi\" id=\"e8q-2t-IwV\">\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <switch horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" baseWritingDirection=\"leftToRight\" alignment=\"left\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yFB-SG-43g\">\n                                        <rect key=\"frame\" x=\"38\" y=\"-2\" width=\"42\" height=\"25\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <connections>\n                                            <action selector=\"wifiButtonPressed:\" target=\"-2\" id=\"0CC-zU-i3s\"/>\n                                        </connections>\n                                    </switch>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"22\" id=\"PGs-FC-Txv\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"78\" id=\"TKe-GE-Rba\"/>\n                                </constraints>\n                            </customView>\n                            <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kuQ-OG-WIQ\">\n                                <rect key=\"frame\" x=\"121\" y=\"17\" width=\"48\" height=\"51\"/>\n                                <buttonCell key=\"cell\" type=\"smallSquare\" bezelStyle=\"smallSquare\" image=\"NSStopProgressFreestandingTemplate\" imagePosition=\"overlaps\" alignment=\"center\" imageScaling=\"proportionallyUpOrDown\" inset=\"2\" id=\"UsA-xf-nXF\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                                </buttonCell>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"48.5\" id=\"WYs-JW-yBM\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"45\" id=\"aw1-es-Ffm\"/>\n                                </constraints>\n                                <connections>\n                                    <action selector=\"orderOut:\" target=\"QEp-dc-tSh\" id=\"5AN-s0-1oe\"/>\n                                    <outlet property=\"nextKeyView\" destination=\"vwT-dQ-vyr\" id=\"HwE-Ru-27Y\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"284\" id=\"2tT-CM-f1g\"/>\n                            <constraint firstItem=\"rQj-eC-ymc\" firstAttribute=\"top\" secondItem=\"brE-li-Fg3\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"AOP-D6-1UR\"/>\n                            <constraint firstItem=\"rQj-eC-ymc\" firstAttribute=\"leading\" secondItem=\"brE-li-Fg3\" secondAttribute=\"leading\" constant=\"102\" id=\"F0K-V8-Yq4\"/>\n                            <constraint firstAttribute=\"height\" constant=\"237\" id=\"I2A-qs-Isw\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Z7T-Xy-w9X\" secondAttribute=\"bottom\" constant=\"6\" id=\"JSO-aG-z1G\"/>\n                            <constraint firstItem=\"Kms-sE-nNp\" firstAttribute=\"centerX\" secondItem=\"brE-li-Fg3\" secondAttribute=\"centerX\" id=\"bF0-Uc-vAe\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Z7T-Xy-w9X\" secondAttribute=\"trailing\" constant=\"9\" id=\"dqB-Nh-jJU\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"kuQ-OG-WIQ\" secondAttribute=\"bottom\" constant=\"20\" id=\"j95-bp-174\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"kuQ-OG-WIQ\" secondAttribute=\"trailing\" constant=\"115\" id=\"mrR-I6-9lQ\"/>\n                            <constraint firstItem=\"Kms-sE-nNp\" firstAttribute=\"top\" secondItem=\"rQj-eC-ymc\" secondAttribute=\"bottom\" constant=\"23\" id=\"sw1-xH-pSA\"/>\n                        </constraints>\n                    </customView>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"brE-li-Fg3\" firstAttribute=\"centerX\" secondItem=\"82w-TR-3gA\" secondAttribute=\"centerX\" id=\"2fO-Lk-ZFa\"/>\n                    <constraint firstItem=\"brE-li-Fg3\" firstAttribute=\"centerY\" secondItem=\"82w-TR-3gA\" secondAttribute=\"centerY\" constant=\"10.5\" id=\"R9C-rw-N18\"/>\n                </constraints>\n            </view>\n            <point key=\"canvasLocation\" x=\"267\" y=\"-378\"/>\n        </window>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" titleVisibility=\"hidden\" id=\"lLG-Bl-vZe\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"144\" y=\"174\" width=\"480\" height=\"198\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"3440\" height=\"1415\"/>\n            <view key=\"contentView\" id=\"Dza-jC-NB8\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"198\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Y2g-NK-A2W\">\n                        <rect key=\"frame\" x=\"20\" y=\"154\" width=\"4\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" id=\"Pku-Kx-wjy\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Tjq-cj-K2q\">\n                        <rect key=\"frame\" x=\"28\" y=\"137\" width=\"434\" height=\"47\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"47\" id=\"uYQ-Hk-yD8\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" selectable=\"YES\" title=\"The wifi network &quot;Europa&quot; requires a password. Please enter it below:\" id=\"WTE-UB-iIn\">\n                            <font key=\"font\" metaFont=\"systemBold\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Cgl-qV-y0O\">\n                        <rect key=\"frame\" x=\"381\" y=\"13\" width=\"86\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Join\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"cPE-0Q-pm2\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"72\" id=\"uVD-yY-HTS\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"connect:\" target=\"-2\" id=\"hSO-Mr-Vz4\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mVP-CL-XEv\">\n                        <rect key=\"frame\" x=\"297\" y=\"13\" width=\"86\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"0jZ-wI-6zS\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\">s</string>\n                            <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                        </buttonCell>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"72\" id=\"E5I-gG-M9v\"/>\n                        </constraints>\n                        <connections>\n                            <action selector=\"wifiCredentialCancelButtonPressed:\" target=\"-2\" id=\"axX-HP-CGX\"/>\n                        </connections>\n                    </button>\n                    <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ju4-Cc-cV9\">\n                        <rect key=\"frame\" x=\"167\" y=\"107\" width=\"293\" height=\"22\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" placeholderString=\"Username\" drawsBackground=\"YES\" id=\"AWi-NV-QKq\">\n                            <font key=\"font\" metaFont=\"message\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cST-FL-tNs\">\n                        <rect key=\"frame\" x=\"28\" y=\"110\" width=\"124\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Network Username:\" id=\"2MT-3V-4C7\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bbs-5k-6Qs\">\n                        <rect key=\"frame\" x=\"28\" y=\"85\" width=\"124\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Network Password:\" id=\"gPn-og-da2\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eqw-jG-xk4\">\n                        <rect key=\"frame\" x=\"80\" y=\"60\" width=\"72\" height=\"16\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" alignment=\"right\" title=\"Certificate:\" id=\"zg7-zl-3F2\">\n                            <font key=\"font\" usesAppearanceFont=\"YES\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <secureTextField focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iXc-w6-KVu\">\n                        <rect key=\"frame\" x=\"166\" y=\"82\" width=\"294\" height=\"21\"/>\n                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" placeholderString=\"Password\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"ytx-J6-yi1\">\n                            <font key=\"font\" metaFont=\"message\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <allowedInputSourceLocales>\n                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                            </allowedInputSourceLocales>\n                        </secureTextFieldCell>\n                    </secureTextField>\n                    <popUpButton verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Sb1-PH-di9\">\n                        <rect key=\"frame\" x=\"164\" y=\"52\" width=\"300\" height=\"25\"/>\n                        <popUpButtonCell key=\"cell\" type=\"push\" title=\"Item 1\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"borderAndBezel\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"3p3-NJ-fhq\" id=\"Vf9-S1-c8f\">\n                            <behavior key=\"behavior\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"message\"/>\n                            <menu key=\"menu\" id=\"Tjl-lD-s5R\">\n                                <items>\n                                    <menuItem title=\"Item 1\" state=\"on\" id=\"3p3-NJ-fhq\"/>\n                                    <menuItem title=\"Item 2\" id=\"asc-8t-DJg\"/>\n                                    <menuItem title=\"Item 3\" id=\"2jW-WN-ffg\"/>\n                                </items>\n                            </menu>\n                        </popUpButtonCell>\n                    </popUpButton>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"Sb1-PH-di9\" firstAttribute=\"leading\" secondItem=\"eqw-jG-xk4\" secondAttribute=\"trailing\" constant=\"17\" id=\"5gZ-Wb-iAe\"/>\n                    <constraint firstItem=\"ju4-Cc-cV9\" firstAttribute=\"trailing\" secondItem=\"iXc-w6-KVu\" secondAttribute=\"trailing\" id=\"851-Ej-Mek\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Sb1-PH-di9\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"B1z-AB-w1H\"/>\n                    <constraint firstItem=\"cST-FL-tNs\" firstAttribute=\"trailing\" secondItem=\"bbs-5k-6Qs\" secondAttribute=\"trailing\" id=\"ETg-kG-VRZ\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Cgl-qV-y0O\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"H5w-mY-Kke\"/>\n                    <constraint firstItem=\"Tjq-cj-K2q\" firstAttribute=\"leading\" secondItem=\"cST-FL-tNs\" secondAttribute=\"leading\" id=\"HTn-AO-uti\"/>\n                    <constraint firstItem=\"Y2g-NK-A2W\" firstAttribute=\"leading\" secondItem=\"Dza-jC-NB8\" secondAttribute=\"leading\" constant=\"22\" id=\"HuV-sd-pwl\"/>\n                    <constraint firstItem=\"iXc-w6-KVu\" firstAttribute=\"leading\" secondItem=\"bbs-5k-6Qs\" secondAttribute=\"trailing\" constant=\"16\" id=\"KXK-GF-Uvu\"/>\n                    <constraint firstItem=\"ju4-Cc-cV9\" firstAttribute=\"top\" secondItem=\"Tjq-cj-K2q\" secondAttribute=\"bottom\" constant=\"8\" id=\"MdM-a7-vXf\"/>\n                    <constraint firstItem=\"eqw-jG-xk4\" firstAttribute=\"top\" secondItem=\"bbs-5k-6Qs\" secondAttribute=\"bottom\" constant=\"9\" id=\"OdU-8h-A0G\"/>\n                    <constraint firstItem=\"bbs-5k-6Qs\" firstAttribute=\"top\" secondItem=\"cST-FL-tNs\" secondAttribute=\"bottom\" constant=\"9\" id=\"PB3-XW-peS\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"iXc-w6-KVu\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"Ra1-57-vsP\"/>\n                    <constraint firstItem=\"Y2g-NK-A2W\" firstAttribute=\"top\" secondItem=\"Dza-jC-NB8\" secondAttribute=\"top\" constant=\"28\" id=\"TIP-q5-HGp\"/>\n                    <constraint firstItem=\"Tjq-cj-K2q\" firstAttribute=\"top\" secondItem=\"Dza-jC-NB8\" secondAttribute=\"top\" constant=\"14\" id=\"VO4-OZ-S9A\"/>\n                    <constraint firstItem=\"ju4-Cc-cV9\" firstAttribute=\"leading\" secondItem=\"cST-FL-tNs\" secondAttribute=\"trailing\" constant=\"17\" id=\"W0O-tI-1Yb\"/>\n                    <constraint firstItem=\"Tjq-cj-K2q\" firstAttribute=\"trailing\" secondItem=\"ju4-Cc-cV9\" secondAttribute=\"trailing\" id=\"Z1x-lW-vZt\"/>\n                    <constraint firstItem=\"Tjq-cj-K2q\" firstAttribute=\"leading\" secondItem=\"Y2g-NK-A2W\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"ZfP-cE-ULA\"/>\n                    <constraint firstItem=\"mVP-CL-XEv\" firstAttribute=\"baseline\" secondItem=\"Cgl-qV-y0O\" secondAttribute=\"baseline\" id=\"eiY-ga-hJQ\"/>\n                    <constraint firstItem=\"eqw-jG-xk4\" firstAttribute=\"trailing\" secondItem=\"cST-FL-tNs\" secondAttribute=\"trailing\" id=\"fO1-43-4p5\"/>\n                    <constraint firstItem=\"Sb1-PH-di9\" firstAttribute=\"top\" secondItem=\"iXc-w6-KVu\" secondAttribute=\"bottom\" constant=\"6\" id=\"fbl-NS-14q\"/>\n                    <constraint firstItem=\"iXc-w6-KVu\" firstAttribute=\"top\" secondItem=\"ju4-Cc-cV9\" secondAttribute=\"bottom\" constant=\"4\" id=\"ghe-p6-nei\"/>\n                    <constraint firstItem=\"cST-FL-tNs\" firstAttribute=\"top\" secondItem=\"Tjq-cj-K2q\" secondAttribute=\"bottom\" constant=\"11\" id=\"iz3-ph-UoI\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Tjq-cj-K2q\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"kM1-R6-wcM\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"ju4-Cc-cV9\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"pjT-AB-wrY\"/>\n                    <constraint firstItem=\"ju4-Cc-cV9\" firstAttribute=\"baseline\" secondItem=\"cST-FL-tNs\" secondAttribute=\"firstBaseline\" id=\"tu7-he-y3N\"/>\n                    <constraint firstItem=\"bbs-5k-6Qs\" firstAttribute=\"trailing\" secondItem=\"cST-FL-tNs\" secondAttribute=\"trailing\" id=\"uQa-ui-T9p\"/>\n                    <constraint firstItem=\"Cgl-qV-y0O\" firstAttribute=\"leading\" secondItem=\"mVP-CL-XEv\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"x00-6e-tqS\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"mVP-CL-XEv\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"yGC-lr-KZQ\"/>\n                    <constraint firstItem=\"cST-FL-tNs\" firstAttribute=\"leading\" secondItem=\"bbs-5k-6Qs\" secondAttribute=\"leading\" id=\"yUP-zO-kDB\"/>\n                </constraints>\n            </view>\n            <point key=\"canvasLocation\" x=\"-323\" y=\"-467\"/>\n        </window>\n    </objects>\n    <resources>\n        <image name=\"NSRefreshFreestandingTemplate\" width=\"20\" height=\"20\"/>\n        <image name=\"NSStopProgressFreestandingTemplate\" width=\"20\" height=\"20\"/>\n        <image name=\"globe\" catalog=\"system\" width=\"15\" height=\"15\"/>\n        <image name=\"wifi\" catalog=\"system\" width=\"17\" height=\"13\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "XCredsLoginPlugIn/XCredsLoginPlugin.h",
    "content": "//\n//  XCredsLoginPlugin.h\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/2/22.\n//\n\n#import <Foundation/Foundation.h>\n\n\n@import Foundation;\n@import Security.AuthorizationPlugin;\n@import Security.AuthSession;\nextern OSStatus SecKeychainChangePassword(SecKeychainRef keychainRef, UInt32 oldPasswordLength, const void* oldPassword, UInt32 newPasswordLength, const void* newPassword);\n\nextern OSStatus SecKeychainResetLogin(UInt32 passwordLength,\n                                      const void* password,\n                                      Boolean resetSearchList);\n\nextern OSStatus SecKeychainItemSetAccessWithPassword(SecKeychainItemRef item, SecAccessRef access, UInt32 passLength, const void* password);\n\n\n// Plugin constants\n\nenum {\n    kPluginMagic = 'PlgN'\n};\n\nstruct PluginRecord {\n    OSType fMagic;\n    const AuthorizationCallbacks *fCallbacks;\n};\n\ntypedef struct PluginRecord PluginRecord;\n\n#pragma mark - Mechanism\n\nenum {\n    kMechanismMagic = 'Mchn'\n};\n\nstruct MechanismRecord {\n    OSType                          fMagic;\n    AuthorizationEngineRef          fEngine;\n    const PluginRecord *            fPlugin;\n    AuthorizationString             fMechID;\n    Boolean                         fCheckAD;\n    Boolean                         fUserSetup;\n\n    Boolean                         fLoginWindow;\n    Boolean                         fPowerControl;\n    Boolean                         fEnableFDE;\n    Boolean                         fKeychainAdd;\n    Boolean                         fCreateUser;\n    Boolean                         fLoginDone;\n\n};\n\ntypedef struct MechanismRecord MechanismRecord;\n\n#pragma mark\n#pragma mark ObjC AuthPlugin Wrapper\n\n@interface XCredsLoginPlugin : NSObject\n- (OSStatus)MechanismCreate:(AuthorizationPluginRef)inPlugin\n                  EngineRef:(AuthorizationEngineRef)inEngine\n                MechanismId:(AuthorizationMechanismId)mechanismId\n               MechanismRef:(AuthorizationMechanismRef *)outMechanism;\n\n// Starts authentication\n\n- (OSStatus)MechanismInvoke:(AuthorizationMechanismRef)inMechanism;\n\n// Decactive mechanism\n\n- (OSStatus)MechanismDeactivate:(AuthorizationMechanismRef)inMechanism;\n\n// Destroys mechanism\n\n- (OSStatus)MechanismDestroy:(AuthorizationMechanismRef)inMechanism;\n\n// Plugin parts\n\n// Destroy plugin\n\n- (OSStatus)PluginDestroy:(AuthorizationPluginRef)inPlugin;\n\n// Creates plugin\n\n- (OSStatus)AuthorizationPluginCreate:(const AuthorizationCallbacks *)callbacks\n                            PluginRef:(AuthorizationPluginRef *)outPlugin\n                      PluginInterface:(const AuthorizationPluginInterface **)outPluginInterface;\n\n@end\n\n"
  },
  {
    "path": "XCredsLoginPlugIn/XCredsLoginPlugin.m",
    "content": "//\n//  XCredsLoginPlugin.m\n//  XCredsLoginPlugin\n//\n//  Created by Timothy Perfitt on 7/2/22.\n//\n\n#import \"XCredsLoginPlugin.h\"\n#import \"XCredsLoginPlugin-Swift.h\"\n#import <Foundation/Foundation.h>\nXCredsLoginPlugin *authorizationPlugin = nil;\n\n//os_log_t pluginLog = nil;\nXCredsLoginMechanism *loginWindowMechanism = nil;\nXCredsLoginDone *loginDone = nil;\n\n\n\n\nstatic OSStatus PluginDestroy(AuthorizationPluginRef inPlugin) {\n\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    return [authorizationPlugin PluginDestroy:inPlugin];\n}\n\nstatic OSStatus MechanismCreate(AuthorizationPluginRef inPlugin,\n                                AuthorizationEngineRef inEngine,\n                                AuthorizationMechanismId mechanismId,\n                                AuthorizationMechanismRef *outMechanism) {\n\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d id:%s\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding] ,__LINE__,mechanismId]);\n\n    return [authorizationPlugin MechanismCreate:inPlugin\n                                      EngineRef:inEngine\n                                    MechanismId:mechanismId\n                                   MechanismRef:outMechanism];\n}\n\nstatic OSStatus MechanismInvoke(AuthorizationMechanismRef inMechanism) {\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n\n//    mechanism->fMechID = mechanismId;\n\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d id:%s\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__,mechanism->fMechID]);\n\n    return [authorizationPlugin MechanismInvoke:inMechanism];\n}\n\nstatic OSStatus MechanismDeactivate(AuthorizationMechanismRef inMechanism) {\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d id:%s\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__,mechanism->fMechID]);\n\n    return [authorizationPlugin MechanismDeactivate:inMechanism];\n}\n\nstatic OSStatus MechanismDestroy(AuthorizationMechanismRef inMechanism) {\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d id:%s\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__,mechanism->fMechID]);\n\n    return [authorizationPlugin MechanismDestroy:inMechanism];\n}\n\nstatic AuthorizationPluginInterface gPluginInterface = {\n    kAuthorizationPluginInterfaceVersion,\n    &PluginDestroy,\n    &MechanismCreate,\n    &MechanismInvoke,\n    &MechanismDeactivate,\n    &MechanismDestroy\n};\n\nextern OSStatus AuthorizationPluginCreate(const AuthorizationCallbacks *callbacks,\n                                          AuthorizationPluginRef *outPlugin,\n                                          const AuthorizationPluginInterface **outPluginInterface) {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    if (authorizationPlugin == nil) {\n        authorizationPlugin = [[XCredsLoginPlugin alloc] init];\n    }\n\n    return [authorizationPlugin AuthorizationPluginCreate:callbacks\n                                                PluginRef:outPlugin\n                                          PluginInterface:outPluginInterface];\n}\n\n// Implementation\n\n\n@implementation XCredsLoginPlugin\n\n\n- (OSStatus)AuthorizationPluginCreate:(const AuthorizationCallbacks *)callbacks\n                            PluginRef:(AuthorizationPluginRef *)outPlugin\n                      PluginInterface:(const AuthorizationPluginInterface **)outPluginInterface {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    PluginRecord *plugin = (PluginRecord *) malloc(sizeof(*plugin));\n    if (plugin == NULL) return errSecMemoryError;\n    plugin->fMagic = kPluginMagic;\n    plugin->fCallbacks = callbacks;\n    *outPlugin = plugin;\n    *outPluginInterface = &gPluginInterface;\n    return errSecSuccess;\n}\n\n- (OSStatus)MechanismCreate:(AuthorizationPluginRef)inPlugin\n                  EngineRef:(AuthorizationEngineRef)inEngine\n                MechanismId:(AuthorizationMechanismId)mechanismId\n               MechanismRef:(AuthorizationMechanismRef *)outMechanism {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    MechanismRecord *mechanism = (MechanismRecord *)malloc(sizeof(MechanismRecord));\n    if (mechanism == NULL) return errSecMemoryError;\n    TCSLog([NSString stringWithFormat:@\"==========> Authorization Plugin %s Mechanism created.<===========\\n\",mechanismId]);\n    mechanism->fMagic = kMechanismMagic;\n    mechanism->fEngine = inEngine;\n    mechanism->fPlugin = (PluginRecord *)inPlugin;\n    mechanism->fMechID = mechanismId;\n    mechanism->fUserSetup = (strcmp(mechanismId, \"UserSetup\") == 0);\n    mechanism->fLoginWindow = (strcmp(mechanismId, \"LoginWindow\") == 0);\n    mechanism->fPowerControl = (strcmp(mechanismId, \"PowerControl\") == 0);\n    mechanism->fEnableFDE = (strcmp(mechanismId, \"EnableFDE\") == 0);\n    mechanism->fKeychainAdd = (strcmp(mechanismId, \"KeychainAdd\") == 0);\n    mechanism->fCreateUser = (strcmp(mechanismId, \"CreateUser\") == 0);\n    mechanism->fLoginDone = (strcmp(mechanismId, \"LoginDone\") == 0);\n\n    *outMechanism = mechanism;\n\n    return errSecSuccess;\n}\n\n- (OSStatus)MechanismInvoke:(AuthorizationMechanismRef)inMechanism {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n\n\n    if (mechanism->fLoginWindow) {\n        if (loginWindowMechanism==nil){\n            loginWindowMechanism = [[XCredsLoginMechanism alloc] initWithMechanism:mechanism];\n        }\n        [loginWindowMechanism run];\n\n    }\n    else if (mechanism->fUserSetup){\n        XCredsUserSetup *userSetup = [[XCredsUserSetup alloc] initWithMechanism:mechanism];\n        [userSetup run];\n\n    }\n    else if (mechanism->fPowerControl){\n        XCredsPowerControlMechanism *powerControl = [[XCredsPowerControlMechanism alloc] initWithMechanism:mechanism];\n        [powerControl run];\n\n    }\n    else if (mechanism->fEnableFDE){\n        XCredsEnableFDE *fdeMech = [[XCredsEnableFDE alloc] initWithMechanism:mechanism];\n        [fdeMech run];\n\n    }\n    else if (mechanism->fKeychainAdd){\n        XCredsKeychainAdd *keychainAdd = [[XCredsKeychainAdd alloc] initWithMechanism:mechanism];\n        [keychainAdd run];\n\n    }\n    else if (mechanism->fCreateUser){\n        XCredsCreateUser *createUser = [[XCredsCreateUser alloc] initWithMechanism:mechanism];\n        [createUser run];\n\n    }\n    else if (mechanism->fLoginDone){\n        loginDone = [[XCredsLoginDone alloc] initWithMechanism:mechanism];\n        [loginDone run];\n\n    }\n\n    return noErr;\n}\n\n- (OSStatus)MechanismDeactivate:(AuthorizationMechanismRef)inMechanism {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    OSStatus err;\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n\n    err = mechanism->fPlugin->fCallbacks->DidDeactivate(mechanism->fEngine);\n    return err;\n}\n\n- (OSStatus)MechanismDestroy:(AuthorizationMechanismRef)inMechanism {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    MechanismRecord *mechanism = (MechanismRecord *)inMechanism;\n    if (mechanism->fLoginWindow) {\n        [loginWindowMechanism tearDown];\n    }\n    if (mechanism->fLoginDone) {\n        [loginDone tearDown];\n    }\n    free(mechanism);\n    return noErr;\n}\n\n\n- (OSStatus)PluginDestroy:(AuthorizationPluginRef)inPlugin {\n    TCSLog([NSString stringWithFormat:@\"%s %s:%d\",__FUNCTION__, [[[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding],__LINE__]);\n\n    free(inPlugin);\n    return noErr;\n}\n@end\n"
  },
  {
    "path": "XCredsLoginPlugIn/errorpage.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n        <style>\n            .center-screen {\n              display: flex;\n              flex-direction: column;\n              justify-content: center;\n              align-items: center;\n              text-align: center;\n              min-height: 100vh;\n            }\n        </style>\n    </head>\n\t<body>\n        <div class=\"center-screen\">\n            <h1>Trial or License Expired</h1>\n            <p>please visit twocanoes.com for more information</p>\n            </div>\n        </div>\n\t</body>\n</html>\n"
  },
  {
    "path": "XCredsLoginPlugIn/loadpage.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n        <style>\n            .center-screen {\n              display: flex;\n              flex-direction: column;\n              justify-content: center;\n              align-items: center;\n              text-align: center;\n              min-height: 100vh;\n            }\n        </style>\n    </head>\n\t<body>\n        <div class=\"center-screen\">\n\t\t<h1>Please Wait....</h1>\n        <p>(or try connecting to network or check preferences)</p>\n        </div>\n\t</body>\n</html>\n"
  },
  {
    "path": "app_to_test.sh",
    "content": "#!/bin/sh -e \n\n\nset -e\nset -x \na=123\nBUILD_DIR=\"/tmp/xcreds\"\nDERIVED_DATA_DIR=\"${BUILD_DIR}/DerivedData\"\nif [ \"${1}\" ]; then\nREMOTE_MAC=$1\nelse \nREMOTE_MAC=\"test.local\"\nfi\n\nagvtool bump\nxcodebuild  -scheme \"XCreds\"  -configuration \"Release\" -derivedDataPath  \"${DERIVED_DATA_DIR}\"\n\nssh  root@\"${REMOTE_MAC}\" 'bash -c \"if [ -e \"/Applications/XCreds.app\" ] ; then echo removing; rm -rf \"/Applications/XCreds.app\"; fi\"'\n\nif [ -e /tmp/xcreds/xcreds.zip ]; then\n\trm /tmp/xcreds/xcreds.zip\nfi\n\npushd /tmp/xcreds/DerivedData/Build/Products/Release/\nzip -r /tmp/xcreds/xcreds.zip XCreds.app\npopd \n\nssh  root@\"${REMOTE_MAC}\" 'bash -c \"if [ -e \"/tmp/xcreds.zip\" ] ; then echo removing; rm -rf \"/tmp/xcreds.zip\"; fi\"'\n\nscp -Cr /tmp/xcreds/xcreds.zip root@\"${REMOTE_MAC}\":/tmp/xcreds.zip\n\n\nssh root@\"${REMOTE_MAC}\" unzip /tmp/xcreds.zip -d /Applications\n#scp -r /tmp/xcreds/DerivedData/Build/Products/Release/XCreds.app root@\"${REMOTE_MAC}\":/Applications\nssh root@\"${REMOTE_MAC}\" /Applications/XCreds.app/Contents/Resources/xcreds_login.sh -r\n\nssh  root@\"${REMOTE_MAC}\" /Applications/XCreds.app/Contents/Resources/xcreds_login.sh -i\n\n#ssh  root@\"${REMOTE_MAC}\" killall -9 SecurityAgent || echo \"unable to kill\"\nssh root@\"${REMOTE_MAC}\" reboot\nexit 0\n"
  },
  {
    "path": "auth_mech_fixup/auth_mech_fixup-Bridging-Header.h",
    "content": "//\n//  XCreds-Bridging-Header.h\n//  XCreds\n//\n//  Created by Timothy Perfitt on 6/3/22.\n//\n\n#ifndef XCreds_Bridging_Header_h\n#define XCreds_Bridging_Header_h\n#import \"TCSUnifiedLogger.h\"\n\n#endif /* XCreds_Bridging_Header_h */\n"
  },
  {
    "path": "auth_mech_fixup/main.swift",
    "content": "//\n//  main.swift\n//  auth_mech_fixup\n//\n//  Created by Timothy Perfitt on 5/31/23.\n//\n\nimport Foundation\n\nif AuthorizationDBManager.shared.rightExists(right: \"XCredsLoginPlugin:LoginWindow\") == true {\n    TCSLogWithMark(\"XCreds auth rights already installed.\")\n    exit(0)\n\n}\nTCSLogErrorWithMark(\"XCreds rights do not exist. Fixing and rebooting\")\n\nif AuthRightsHelper.resetRights()==false {\n    TCSLogErrorWithMark(\"error resetting rights\")\n    exit(1)\n}\nif AuthRightsHelper.addRights()==false {\n    TCSLogErrorWithMark(\"error adding rights\")\n    exit(1)\n}\n"
  },
  {
    "path": "authrights/authrights.swift",
    "content": "//\n//  main.swift\n//  authrights\n//\n//  Created by Timothy Perfitt on 7/11/22.\n//\n\nimport ArgumentParser\n\n@main\nstruct AuthRights: ParsableCommand {\n\n    @Flag(name: .shortAndLong, help: \"print rights\")\n    var printRights:Int\n\n    @Flag(name: .shortAndLong, help: \"delete right\")\n    var deleteRight:Int\n\n    @Option(name: .shortAndLong, help: \"insert before this rule\")\n    var beforeThisRight: String?\n\n    @Option(name: .shortAndLong, help: \"insert after this rule\")\n    var afterThisRight: String?\n\n    @Option(name: .shortAndLong, help: \"replace this rule\")\n    var replaceThisRight: String?\n\n    @Argument(help: \"Rule to insert\")\n    var right: String?\n\n    mutating func run() throws {\n\n       let manager = AuthorizationDBManager.shared\n        if (printRights == 1) {\n            let info = manager.consoleRights().joined(separator: \"\\n\")\n\n            print(info)\n            return\n        }\n\n        guard let right = right else {\n            print(\"must specify right\")\n            return\n        }\n\n        if deleteRight == 1 {\n            if manager.remove(right: right)==false {\n//                print(\"error removing right\")\n            }\n\n        }\n        else if beforeThisRight != nil {\n\n            if manager.insertRight(newRight:right , beforeRight: beforeThisRight!)==false{\n\n                print(\"error inserting before right\")\n            }\n        }\n        else if afterThisRight != nil {\n//            print(\"inserting right after\")\n            if manager.insertRight(newRight: right, afterRight: afterThisRight!)==false{\n\n                print(\"error inserting after right\")\n            }\n\n        }\n        else if replaceThisRight != nil {\n            if manager.replace(right: replaceThisRight!, withNewRight: right)==false{\n\n                print(\"error replacing right\")\n            }\n\n        }\n        else {\n            print(\"No placement option specified\")\n        }\n    }\n}\n"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/bash \n\nset -e\n\necho \"post to github? (Y/n)\"\nread should_upload\nif [ \"${should_upload}\" = \"n\" ]; then\n\techo \"not uploading\"\nelse\n   export upload=1\n   echo \"uploading to github when done\"\nfi\n\n\necho \"updated manifest version? (y/N)\"\nread should_update_manifest\nif [ \"${should_update_manifest}\" = \"y\" ]; then\n   export update_manifest=1\n   echo \"updating manifest\"\nfi\n\n\n\npushd ./build_resources/buildscripts/\n\nSKIP_DMG=1 ./build.sh\n\npopd\n"
  },
  {
    "path": "build_resources/DropDMG/XCreds/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>content</key>\n\t<dict>\n\t\t<key>identifier</key>\n\t\t<string>Layout.ED28A313-0EA9-4192-9652-7AA315AA59ED</string>\n\t\t<key>options</key>\n\t\t<dict>\n\t\t\t<key>fontSize</key>\n\t\t\t<integer>12</integer>\n\t\t\t<key>iconSize</key>\n\t\t\t<integer>128</integer>\n\t\t\t<key>layoutItems</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.1F40890E-6379-429C-902A-F52E81C1B604</string>\n\t\t\t\t\t<key>name</key>\n\t\t\t\t\t<string>XCreds.pkg</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{304, 96}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>file</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.9F03F118-1251-4179-9D61-1091A7F850A6</string>\n\t\t\t\t\t<key>name</key>\n\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{144, 320}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>file</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.3125D295-9961-40A5-A990-E098A423D71A</string>\n\t\t\t\t\t<key>name</key>\n\t\t\t\t\t<string>Uninstaller</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{320, 320}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>file</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.19C61CBE-0A4A-4AFC-87F7-228B0913D85C</string>\n\t\t\t\t\t<key>name</key>\n\t\t\t\t\t<string>Legal</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{512, 320}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>file</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.0AEAED19-1696-44FA-B375-05AEF81CA833</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{75.078125, 458.642578125}</string>\n\t\t\t\t\t<key>rtf</key>\n\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf2511\n\\cocoatextscaling0\\cocoaplatform0{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\expandedcolortbl;;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\partightenfactor0\n\n\\f0\\fs24 \\cf0 $\\{DATE\\}}</string>\n\t\t\t\t\t<key>size</key>\n\t\t\t\t\t<string>{118.15625, 21.28515625}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>text</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.5747FF97-6356-4318-84CF-6B8008FD617F</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{442.083984375, 462.75}</string>\n\t\t\t\t\t<key>rtf</key>\n\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1671\\cocoasubrtf400\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\expandedcolortbl;;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qr\\partightenfactor0\n\n\\f0\\fs24 \\cf0 Version: $\\{APP_VERSION\\} ($\\{APP_SHORT_VERSION_STRING\\})}</string>\n\t\t\t\t\t<key>size</key>\n\t\t\t\t\t<string>{340.14453125, 37.203125}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>text</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.3430069F-246D-45AB-BCEF-B9C85FDFD038</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{392, 505}</string>\n\t\t\t\t\t<key>rtf</key>\n\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1138\\cocoasubrtf320\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qr\n\n\\f0\\fs24 \\cf0 $\\{APP_BASENAME\\} $\\{APP_VERSION\\}}</string>\n\t\t\t\t\t<key>size</key>\n\t\t\t\t\t<string>{240, 18}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>text</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>identifier</key>\n\t\t\t\t\t<string>LayoutItem.7FDD4C8D-1A72-4322-91F7-A52C239C0996</string>\n\t\t\t\t\t<key>position</key>\n\t\t\t\t\t<string>{384.5, 424}</string>\n\t\t\t\t\t<key>rtf</key>\n\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1138\\cocoasubrtf320\n{\\fonttbl}\n{\\colortbl;\\red255\\green255\\blue255;}\n}</string>\n\t\t\t\t\t<key>size</key>\n\t\t\t\t\t<string>{129, 16}</string>\n\t\t\t\t\t<key>type</key>\n\t\t\t\t\t<string>text</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>windowInsets</key>\n\t\t\t<string>{0, 0}</string>\n\t\t\t<key>windowOriginTopLeft</key>\n\t\t\t<string>{100, 100}</string>\n\t\t</dict>\n\t</dict>\n\t<key>documentCreator</key>\n\t<string>DropDMG 3.6.4b1</string>\n\t<key>documentType</key>\n\t<string>com.c-command.DropDMG.Layout</string>\n\t<key>formatVersion</key>\n\t<integer>1</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build_resources/Legal/License Agreements.txt",
    "content": "Copyright 2022 Twocanoes Software, Inc\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "build_resources/Packages/XCreds/License Agreements.txt",
    "content": "XCreds Support Agreement\nThis is a XCreds Support Agreement (“Agreement”) between Customer and Twocanoes.\nBy clicking on the \"accept\" button, Customer is consenting to be legally bound by and are becoming a party to this Agreement with Twocanoes. If Customer does not agree to all of the terms of this Agreement, click the \"disagree\" button. In addition to and apart from clicking “accept,” payment of the applicable Support Service Fees and receipt by Twocanoes of those Support Service Fees will constitute Customer’s acceptance of the terms of this Agreement.\n1. Definitions\n1.1. Documentation means any specifications, such as technical or other specifications, or documentation that Twocanoes may make available to Customer regarding or for use with the Software.\n1.2. Software means the software (including source code and object code) data, files, and other materials provided or made available by Twocanoes for use in authentication on Apple computers to Open ID Connect Identity Providers.\n1.3. Support Hours are generally 9 am to 5 pm central time, Monday through Friday, excluding holidays.\n1.4. Support Time means the sum total of the hours or fractions of hours one or more persons affiliated with Twocanoes spend in providing Support Services to a Customer under this Agreement.\n1.5. Support Request means a request by the Customer for Support Services under this Agreement.\n1.6. Support Period means a one year period starting upon payment of the Support Service Fee and acceptance of this Agreement and any subsequent renewal periods.\n1.7. Support Services means the provision of technical support, technical assistance, technical guidance, and/or bug fixes, available under the purchased Level of Service, under this Agreement.\n1.8. Service Fees means the fees for Support Services under this Agreement specified in a Twocanoes invoice or checkout webpage or screen.\n1.9. Customer means the person, entity, or company who is entering to this Agreement. If you are entering into this Agreement on behalf of Customer company, educational institution, or other entity, you represent and warrant that you have full legal authority to bind Customer company, educational institution, or other entity to this Agreement and Customer also refers to Customer company, educational institution, or entity. If you do not have the requisite authority, you may not accept this Agreement or use the Support Services.\n1.10. Twocanoes means Twocanoes Software, Inc., an Illinois Corporation, having a place of business at 34 W. Chicago Avenue, Naperville, IL 60540.\n2. Service\n2.1. Support Services. Subject to the terms of this Agreement, Twocanoes will, during the Support Period, provide Customer with Support Services for the Software during Support Hours at the applicable Level of Service purchased by the Customer.\n2.2. Level of Service means the support service level purchased by the Customer. There are the following Levels of Service:\n2.2.1.Basic. Under the Basic Level of Service, Twocanoes will respond to up to two Support Requests per month (“Basic Support Limit”). Twocanoes will initially respond to a Support Request within the Basic Support Limit within three business days. This does not guarantee that the issue for which support was requested will be resolved within three business days. However, Twocanoes is committed to resolving the support issue in a timely fashion. If the identified issue will not be resolved within three business days, Twocanoes will communicate an estimated timeline for resolution.\n2.2.2.Premium. Under the Premium Level of Service, Twocanoes will respond to up to five Support Requests per calendar month (“Premium Support Limit”). Twocanoes will initially respond to a Support Request within the Premium Support Limit within one business day. This does not guarantee that the issue for which support was requested will be resolved within one business day. However, Twocanoes is committed to resolving the support issue in a timely fashion. If the identified issue will not be resolved within one business day, Twocanoes will communicate an estimated timeline for resolution. In addition, Twocanoes will provide the following additional support, under the Premium Level of Service, when requested by the Customer in a Support Request, so long as it is within the Premium Support Limit:\n2.2.2.1. Deployment Assistance and Support. Twocanoes will be available for a pre- deployment plan phone call with customer or customer’s representative of up to one hour. During the call Twocanoes will discuss a deployment plan with the customer and will offer practices and/or suggestions for deployment plan appropriate for the customer’s circumstances. Twocanoes will also be available to provide up to 8 hours of Support Time for issues rising during the customer’s testing and deployment using the Software.\n2.2.2.2. Software Customization. Twocanoes will provide up to 8 hours of Support Time to add additional related features to software features for the purpose of streamlining and optimizing customer deployments and authentication.\n2.2.2.3. Software Support. Twocanoes will provide up to 8 hours of Support Time to add additional related features to the Software for the purpose of streamlining and optimizing customer workflows.\n2.2.2.4. Documentation. Twocanoes will provide up to 8 hours of Support Time to review and comment on customer developed documentation before, during, or after deployment.\n2.3. Customer Responsibilities\n2.3.1.Customer will provide Twocanoes with all information, access, and participation by Customer reasonably requested by Twocanoes to respond to the Support Request and enable Twocanoes to provide Support Services.\n2.3.2.Customer will promptly report problems with the Software to Twocanoes.\n2.3.3.Customer will promptly implement and deploy solutions provided by Twocanoes. The Customer may need to upgrade to the newest or a newer version of the Software in order to resolve or partially resolve an issue raised in a Support Request.\n2.3.4.Customer is responsible for backing up the data on the computers where the Software is used. The Customer should ensure such a backup is complete before or at the time a Support Request is made.\n2.3.5.Customer is responsible for maintaining equipment, software, and services to access and use the Software, such as Arduino hardware, computers, operating systems, and network access. Support Services do not include repair of defective hardware, including Arduino hardware.\n2.4. Exclusions\n2.4.1.Support Services do not cover problems caused by: (a) misuse, (b) abuse, (c) neglect, (d) accident, (e) causes other than ordinary use, (f) user or third party customization or modification of the Software or the code thereof (g), improper installation of the Software not in accordance with the Documentation, or (h) third party software.\n2.4.2.If Customer has not paid the applicable Service Fees or is not in compliance with this Agreement, Twocanoes is not obligated to provide Support Services.\n2.4.3.The Software is not to be used for nuclear activities, chemical or biological weapons, or missile projects or where the deployment failure could lead to death, personal injury, property damage or environmental damage. Therefore, Support Services do not cover problems with the Software when the Software is used in such situations.\n2.5. Intellectual Property. Any suggestion, idea, improvement, customization, change, or additional functionality or feature suggested, provided, or made by Customer to Twocanoes for the Software or Arduino firmware in connection with a Support Request (“Improvement”) will be owned by Twocanoes. Customer hereby assigns all of Customer’s right, title, and interest in any Improvement to Twocanoes and agrees to execute all reasonable documents necessary or advisable to perfect such ownership in the Improvement to Twocanoes.\n3. Fees\n3.1. Service Fees are due on the Effective Date. In the case of renewal, Service Fees are due by the beginning of the renewal period or as otherwise provided on the applicable invoice or checkout webpage.\n3.2. Except as otherwise stated herein, Service Fees are non-refundable.\n\n3.3. Service Fees do not include any taxes or similar that may imposed, required, or levied by any unit of government by reason of the services under this Agreement. The payment of such taxes or similar, if any, shall be the obligation of the Customer.\n4. Term\n4.1. This Agreement takes effect upon the first of (1) Customer clicking on the “accept” button or (2) payment of the applicable Support Service Fees and receipt by Twocanoes of those Support Service Fees will constitute Customer acceptance of the terms of this Agreement (“Effective Date”). This agreement will terminate one year from the Effective Date for Premium support and thirty days from the Effective Date for Basic support. This Agreement may be renewed upon a renewal offer by Twocanoes and acceptance and payment of the then existing Support Service Fees by Customer.\n4.2. Customer may terminate this Agreement at any time by providing written notice to Twocanoes. The Service Fees paid are nonrefundable.\n4.3. Twocanoes may at any time terminate this Agreement with Customer if: (a) Customer fails to comply with any term of this Agreement, including the timely payment of Support Fees; or (b) Twocanoes is required by law to do so.\n4.4. Twocanoes may, within 60 days notice of Customer, terminate this Agreement if Twocanoes decides to no longer support the Software or a version of the Software.\n4.5. Notwithstanding any termination of this Agreement, the provisions of this agreement that are intended to survive, will survive the termination of this Agreement, including the provisions of section 6 through 9.\n5. Modifications\n5.1. Twocanoes can modify this Agreement upon 30 days written notice to Customer. The subsequent request for Support Services after receipt of written notice by Customer will be deemed acceptance of the modification. This Agreement shall not be modified by any purchase order or acknowledgement by Customer.\n6. WARRANTIES AND DISCLAIMER OF WARRANTIES\n6.1. Twocanoes warrants the Support Services will be provided professionally within industry standards for software support.\n6.2. Customer shall notify Twocanoes of any defects or deficiencies in the Support Services within 30 days of when the defective or deficient Support Service were provided.\n6.3. Twocanoes does not warrant that the Software will operate uninterrupted or error-free. The Software may contain errors that could cause failures or loss of data. Twocanoes does not warrant that Twocanoes will correct all errors in the Software or that the Software will be compatible with future Twocanoes or Apple products or software.\n6.4. Written or oral advice provided by Twocanoes does not create a warranty.\n6.5. TO THE FULLEST EXTENT PERMITTED BY LAW, THE WARRANTY OF\n\nSECTION 6.1 IS THE EXCLUSIVE WARRANTY, AND TWOCANOES DISCLAIMS ALL OTHER WARRANTIES EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATIONS THE WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, SATISFACTORY QUALITY, ACCURACY, TIMELINESS, AND NON- INFRINGEMENT OF THIRD-PARTY RIGHTS, regardless of whether Twocanoes knows or had reason to know of Customers’ particular needs.\n6.6. If Customer requests Arduino flashing under section 2.2.3.5, then Customer warrants that Customer has all rights necessary for Twocanoes to flash any customer-provided Arduino firmware on Arduino units and Customer hereby grants and provides to Twocanoes all such rights necessary for Twocanoes to flash any customer-provided custom Arduino firmware on Arduino units for the Customer.\n6.7. If Customer requests Arduino customization, software customization/support, or package customization, or other improvement to the Software or firmware, then Customer warrants that Customer has all rights necessary for Twocanoes to carry out and implement such request.\n7. LIMITATION OF LIABILITY\n7.1. Twocanoes’ complete and entire liability for any breach of a warranty under section 6.1 shall be only: (a) correcting errors in the Software that cause the breach or if Twocanoes cannot substantially correct the errors upon the application of reasonable effort the Customer may terminate this Agreement and receive a prorated portion of the unused Service Fees paid to Twocanoes for the then existing Service Period, or (b) having the Support Services that are asserted to be deficient performed again.\n7.2. Except to the extent provided in section 7.1 for breach of section 6.1 warranty, to the fullest extent permitted by law, Customer agrees that Twocanoes, its subsidiaries, its affiliates, and their respective officers, employees, agents, and independent contractors shall not be liable to Customer for any direct, incidental, consequential, special, exemplary, indirect, or punitive damages of any kind, including but not limited to, damages for loss of data, goodwill, profits, attorney’s fees or other intangible losses or personal injury, even if Twocanoes had been advised of the possibility of such loss or damages or any claim by a third party, arising out of or in any way related to this Agreement or the Support Services.\n8. Indemnification\n8.1. To the maximum extent permitted by law, Customer agrees to indemnify, defend and hold harmless Twocanoes, its subsidiaries, its affiliates, and their respective officers, employees, agents, and independent contractors (each is an “Indemnified Party”) from all losses, liabilities, claims, damages, expenses and costs, including attorneys’ fees and court costs (collectively “Losses”) incurred by an Indemnified Party as a result of (a) Customer’s breach or non-compliance of this Agreement, (b) a customization, modification, feature, packaging, or development request or customer-provided firmware made or provided under subsections section 2.2.3.1 to 2.2.3.6, and (c) any claims any install package created with the Software violates or infringes any third party intellectual property rights or defames any person or violates their rights of publicity or privacy.\n8.2. The Software is not intended for use application, deployments, or situations, where (i) inaccuracies or errors in the information, data or content provided by the Software is important, or (ii) Software or deployment failure could lead to death, personal injury, property damage or environmental damage. Customer agree to indemnify, defend and hold harmless each Indemnified Party from any Losses incurred by such Indemnified Party by reason of any such use.\n9. General\n9.1. Choice of Law and Forum. This Agreement will be governed by the laws of the State of Illinois in the United States of America, without regard to its choice of law rules. Any action to enforce this agreement shall be brought in a court of competent jurisdiction located in DuPage County, Illinois or in the United States District Court for the Northern District of Illinois, Eastern Division.\n9.2. Severability. If any provision of this Agreement is held to be legally invalid, illegal or unenforceable the remaining provisions shall nevertheless remain in full force and effect.\n9.3. No Waiver. The waiver or failure of either party to exercise in any respect any right provided for herein shall not be deemed a waiver of any further right hereunder.\n9.4. Merger and Integration. This written Agreement is the exclusive agreement between Customer and Twocanoes concerning the support services covered by this Agreement and supersedes and merges any and all prior oral or written agreements, negotiations or other dealings between the parties concerning such support services.\n9.5. Titles and Headings. The Section headings in this Agreement have no legal or contractual effect and are only for convenience.\n9.6. Notice to Customer. Twocanoes may provide Customer with notice related to this Agreement or the Software via the email address or other contact information Customer provides to Twocanoes.\n9.7. Notice to Twocanoes. Customer can provide Twocanoes notice under this Agreement by email at support@twocanoes.com.\n\nUpdated May 5, 2023\n"
  },
  {
    "path": "build_resources/Packages/XCreds/Success.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf2577\n\\cocoatextscaling0\\cocoaplatform0{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\expandedcolortbl;;}\n\\margl1440\\margr1440\\vieww24660\\viewh15820\\viewkind0\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\fs48 \\cf0 \\\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\qc\\partightenfactor0\n\n\\fs24 \\cf0 {{\\NeXTGraphic Pasted Graphic.png \\width2500 \\height2100 \\appleattachmentpadding0 \\appleembedtype0 \\appleaqc\n}}\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\qc\\partightenfactor0\n\\cf0 \\\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\partightenfactor0\n\\cf0 \\\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\qc\\partightenfactor0\n\n\\fs48 \\cf0 The installation was successful.\n\\fs24 \\\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\partightenfactor0\n\\cf0 \\\n}"
  },
  {
    "path": "build_resources/Packages/XCreds/XCreds_template.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PACKAGES</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>MUST-CLOSE-APPLICATION-ITEMS</key>\n\t\t\t<array/>\n\t\t\t<key>MUST-CLOSE-APPLICATIONS</key>\n\t\t\t<false/>\n\t\t\t<key>PACKAGE_FILES</key>\n\t\t\t<dict>\n\t\t\t\t<key>DEFAULT_INSTALL_LOCATION</key>\n\t\t\t\t<string>/</string>\n\t\t\t\t<key>HIERARCHY</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Utilities</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_CAN_DOWNGRADE</key>\n\t\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_POSTINSTALL_PATH</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_PREINSTALL_PATH</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>XCreds.app</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Applications</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Application Support</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Audio</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Automator</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>ColorPickers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Filesystems</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Fonts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Frameworks</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Input Methods</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Internet Plug-Ins</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchAgents</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PreferencePanes</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Preferences</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Printers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PrivilegedHelperTools</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1005</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickLook</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickTime</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Screen Savers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Scripts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Services</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Widgets</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>etc</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>var</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>private</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>System</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Shared</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1023</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Users</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>include</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>lib</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>local</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>share</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>usr</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>/</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PAYLOAD_TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>PRESERVE_EXTENDED_ATTRIBUTES</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>SHOW_INVISIBLE</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>SPLIT_FORKS</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>TREAT_MISSING_FILES_AS_WARNING</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<integer>5</integer>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SCRIPTS</key>\n\t\t\t<dict>\n\t\t\t\t<key>POSTINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>scripts/postinstall.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PREINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>scripts/preinstall.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>RESOURCES</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SETTINGS</key>\n\t\t\t<dict>\n\t\t\t\t<key>AUTHENTICATION</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>CONCLUSION_ACTION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>FOLLOW_SYMBOLIC_LINKS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t<string>com.twocanoes.pkg.secureremoteaccess</string>\n\t\t\t\t<key>LOCATION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>XCreds</string>\n\t\t\t\t<key>OVERWRITE_PERMISSIONS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>PAYLOAD_SIZE</key>\n\t\t\t\t<integer>-1</integer>\n\t\t\t\t<key>REFERENCE_PATH</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>RELOCATABLE</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>USE_HFS+_COMPRESSION</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<string>{pkgversion}</string>\n\t\t\t</dict>\n\t\t\t<key>TYPE</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>UUID</key>\n\t\t\t<string>159A1918-3691-445B-AAE5-744196155DEC</string>\n\t\t</dict>\n\t</array>\n\t<key>PROJECT</key>\n\t<dict>\n\t\t<key>PROJECT_COMMENTS</key>\n\t\t<dict>\n\t\t\t<key>NOTES</key>\n\t\t\t<data>\n\t\t\t</data>\n\t\t</dict>\n\t\t<key>PROJECT_PRESENTATION</key>\n\t\t<dict>\n\t\t\t<key>BACKGROUND</key>\n\t\t\t<dict>\n\t\t\t\t<key>APPAREANCES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>DARK_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t\t<key>LIGHT_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t</dict>\n\t\t\t\t<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION TYPE</key>\n\t\t\t<dict>\n\t\t\t\t<key>HIERARCHIES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>INSTALLER</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LIST</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>DESCRIPTION</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>OPTIONS</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HIDDEN</key>\n\t\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PACKAGE_UUID</key>\n\t\t\t\t\t\t\t\t<string>159A1918-3691-445B-AAE5-744196155DEC</string>\n\t\t\t\t\t\t\t\t<key>TITLE</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>UUID</key>\n\t\t\t\t\t\t\t\t<string>D37049DF-3918-47ED-9C84-35D20546CC02</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>REMOVED</key>\n\t\t\t\t\t\t<dict/>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION_STEPS</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewIntroductionController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Introduction</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewReadMeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>ReadMe</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewLicenseController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>License</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewDestinationSelectController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>TargetSelect</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationTypeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>PackageSelection</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Install</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewSummaryController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>INTRODUCTION</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>LICENSE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>License Agreements.txt</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>README</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>SUMMARY</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Success.rtfd</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>TITLE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<string>XCreds</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>PROJECT_REQUIREMENTS</key>\n\t\t<dict>\n\t\t\t<key>LIST</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BEHAVIOR</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t<key>DICTIONARY</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISK_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>\n\t\t\t\t\t\t<integer>110000</integer>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>IC_REQUIREMENT_CHECK_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t\t<string>fr.whitebox.Packages.requirement.os</string>\n\t\t\t\t\t<key>MESSAGE</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>NAME</key>\n\t\t\t\t\t<string>Operating System</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>RESOURCES</key>\n\t\t\t<array/>\n\t\t\t<key>ROOT_VOLUME_ONLY</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>PROJECT_SETTINGS</key>\n\t\t<dict>\n\t\t\t<key>ADVANCED_OPTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installer-script.options:hostArchitectures</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>arm64,x86_64</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>BUILD_FORMAT</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>BUILD_PATH</key>\n\t\t\t<dict>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>build</string>\n\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t<integer>3</integer>\n\t\t\t</dict>\n\t\t\t<key>CERTIFICATE</key>\n\t\t\t<dict>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Developer ID Installer: Twocanoes Software, Inc. (UXP6YEHSPW)</string>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>/Users/tperfitt/Library/Keychains/login.keychain</string>\n\t\t\t</dict>\n\t\t\t<key>EXCLUDED_FILES</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.DS_Store</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .DS_Store files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".DS_Store\" files created by the Finder.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.pbdevelopment</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .pbdevelopment files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".pbdevelopment\" files created by ProjectBuilder or Xcode.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>CVS</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvsignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvspass</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.svn</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.git</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.gitignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove SCM metadata</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>classes.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>designable.db</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>info.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Optimize nib files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"classes.nib\", \"info.nib\" and \"designable.nib\" files within .nib bundles.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>Resources Disabled</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove Resources Disabled folders</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"Resources Disabled\" folders.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>SEPARATOR</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>NAME</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PAYLOAD_ONLY</key>\n\t\t\t<false/>\n\t\t\t<key>REFERENCE_FOLDER_PATH</key>\n\t\t\t<string>/private/tmp/pGqhe/packages_reference</string>\n\t\t\t<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>TYPE</key>\n\t<integer>0</integer>\n\t<key>VERSION</key>\n\t<integer>2</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build_resources/Packages/XCreds/scripts/postinstall.sh",
    "content": "#!/bin/bash\n\nset -e\nset -x\n\n\nscript_path=\"${0}\"\npackage_path=\"${1}\"\ntarget_path=\"${2}\"\ntarget_volume=\"${3}\"\nxcreds_login_script=\"${target_path}\"/Applications/XCreds.app/Contents/Resources/xcreds_login.sh\nplugin_path=\"${target_path}\"/Applications/XCreds.app/Contents/Resources/XCredsLoginPlugin.bundle\nauth_backup_folder=\"${target_path}\"/Library/\"Application Support\"/xcreds\nrights_backup_path=\"${auth_backup_folder}\"/rights.bak\n\n\nif [ ! -e  \"${auth_backup_folder}\" ]; then\n\tmkdir -p \"${auth_backup_folder}\"\nfi\n\nif [ ! -e \"${rights_backup_path}\" ]; then \n\tsecurity authorizationdb read system.login.console > \"${rights_backup_path}\"\nfi\n\nif [ -e  \"${plugin_path}\" ]; then\n\tif [ -e \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle ]; then\n\t\trm -rf \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\n\tfi\n\tcp -R \"${plugin_path}\" \"${target_volume}\"/Library/Security/SecurityAgentPlugins/\n\tchown -R root:wheel \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\nfi\n\nif [ -e ${xcreds_login_script} ]; then\n\t\"${xcreds_login_script}\" -i \nelse\n\techo \"could not find xcreds_login_script tool\"\n\texit -1\nfi\n\nif /usr/bin/pgrep -q \"Setup Assistant\"; then\n    # loginwindow hasn't been displayed yet - exit successfully\n    /usr/bin/logger \"XCreds: authorization mechanic setup complete\"\n    echo \"XCreds: authorization mechanic setup complete\"\n    exit 0\nfi\n\nwhile [[ ! -f \"/var/db/.AppleSetupDone\" ]]; do\n sleep 1\n /usr/bin/logger \"Waiting for Setup Assistant to complete\"\n echo \"Waiting for Setup Assistant to complete\"\ndone\n\n#if [ -e \"${target_volume}\"/Applications/XCreds.app/Contents/MacOS/XCreds ]; then\n#\n#\techo \"briefly starting up XCreds app to register CCID extension\"\n#\t\"${target_volume}\"/Applications/XCreds.app/Contents/MacOS/XCreds -r\n#\n#fi\n\n# if Finder is not loaded and override file doesn't exist, reload the loginwindow\nif  /usr/bin/pgrep -q \"Finder\"  || [ -f /Users/Shared/.xcredsPreventLoginWindowKill ]; then\n\texit 0\nelse \n\t/usr/bin/logger \"XCreds: Reload loginwindow\"\n\t/usr/bin/killall -9 loginwindow\nfi\n"
  },
  {
    "path": "build_resources/Packages/XCreds/scripts/preinstall.sh",
    "content": "#!/bin/sh\n\nkillall XCreds\n\nif [ -d \"/Applications/XCreds.app\" ] ; then \n    rm -rf \"/Applications/XCreds.app\" \nfi\n\n"
  },
  {
    "path": "build_resources/Packages/XCreds/template.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PACKAGES</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>MUST-CLOSE-APPLICATION-ITEMS</key>\n\t\t\t<array/>\n\t\t\t<key>MUST-CLOSE-APPLICATIONS</key>\n\t\t\t<false/>\n\t\t\t<key>PACKAGE_FILES</key>\n\t\t\t<dict>\n\t\t\t\t<key>DEFAULT_INSTALL_LOCATION</key>\n\t\t\t\t<string>/</string>\n\t\t\t\t<key>HIERARCHY</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Utilities</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_CAN_DOWNGRADE</key>\n\t\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_POSTINSTALL_PATH</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>BUNDLE_PREINSTALL_PATH</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>XCreds.app</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Applications</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Application Support</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Audio</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Automator</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>ColorPickers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Filesystems</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Fonts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Frameworks</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Input Methods</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Internet Plug-Ins</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchAgents</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PreferencePanes</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Preferences</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Printers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PrivilegedHelperTools</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1005</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickLook</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickTime</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Screen Savers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Scripts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Services</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Widgets</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>etc</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>var</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>private</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>System</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Shared</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1023</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Users</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>include</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>lib</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>local</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>share</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>usr</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>/</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PAYLOAD_TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>PRESERVE_EXTENDED_ATTRIBUTES</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>SHOW_INVISIBLE</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>SPLIT_FORKS</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>TREAT_MISSING_FILES_AS_WARNING</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<integer>5</integer>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SCRIPTS</key>\n\t\t\t<dict>\n\t\t\t\t<key>POSTINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>scripts/postinstall.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PREINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>scripts/preinstall.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>RESOURCES</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SETTINGS</key>\n\t\t\t<dict>\n\t\t\t\t<key>AUTHENTICATION</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>CONCLUSION_ACTION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>FOLLOW_SYMBOLIC_LINKS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t<string>com.twocanoes.pkg.secureremoteaccess</string>\n\t\t\t\t<key>LOCATION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>XCreds</string>\n\t\t\t\t<key>OVERWRITE_PERMISSIONS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>PAYLOAD_SIZE</key>\n\t\t\t\t<integer>-1</integer>\n\t\t\t\t<key>REFERENCE_PATH</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>RELOCATABLE</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>USE_HFS+_COMPRESSION</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<string>{pkgversion}</string>\n\t\t\t</dict>\n\t\t\t<key>TYPE</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>UUID</key>\n\t\t\t<string>159A1918-3691-445B-AAE5-744196155DEC</string>\n\t\t</dict>\n\t</array>\n\t<key>PROJECT</key>\n\t<dict>\n\t\t<key>PROJECT_COMMENTS</key>\n\t\t<dict>\n\t\t\t<key>NOTES</key>\n\t\t\t<data>\n\t\t\t</data>\n\t\t</dict>\n\t\t<key>PROJECT_PRESENTATION</key>\n\t\t<dict>\n\t\t\t<key>BACKGROUND</key>\n\t\t\t<dict>\n\t\t\t\t<key>APPAREANCES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>DARK_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t\t<key>LIGHT_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t</dict>\n\t\t\t\t<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION TYPE</key>\n\t\t\t<dict>\n\t\t\t\t<key>HIERARCHIES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>INSTALLER</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LIST</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>DESCRIPTION</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>OPTIONS</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HIDDEN</key>\n\t\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PACKAGE_UUID</key>\n\t\t\t\t\t\t\t\t<string>159A1918-3691-445B-AAE5-744196155DEC</string>\n\t\t\t\t\t\t\t\t<key>TITLE</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>UUID</key>\n\t\t\t\t\t\t\t\t<string>D37049DF-3918-47ED-9C84-35D20546CC02</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>REMOVED</key>\n\t\t\t\t\t\t<dict/>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION_STEPS</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewIntroductionController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Introduction</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewReadMeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>ReadMe</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewLicenseController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>License</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewDestinationSelectController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>TargetSelect</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationTypeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>PackageSelection</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Install</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewSummaryController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>INTRODUCTION</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>LICENSE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>License Agreements.txt</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>README</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>SUMMARY</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Success.rtfd</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>TITLE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<string>XCreds</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>PROJECT_REQUIREMENTS</key>\n\t\t<dict>\n\t\t\t<key>LIST</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BEHAVIOR</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t<key>DICTIONARY</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISK_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>\n\t\t\t\t\t\t<integer>110000</integer>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>IC_REQUIREMENT_CHECK_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t\t<string>fr.whitebox.Packages.requirement.os</string>\n\t\t\t\t\t<key>MESSAGE</key>\n\t\t\t\t\t<array/>\n\t\t\t\t\t<key>NAME</key>\n\t\t\t\t\t<string>Operating System</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>RESOURCES</key>\n\t\t\t<array/>\n\t\t\t<key>ROOT_VOLUME_ONLY</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>PROJECT_SETTINGS</key>\n\t\t<dict>\n\t\t\t<key>ADVANCED_OPTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installer-script.options:hostArchitectures</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>arm64,x86_64</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>BUILD_FORMAT</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>BUILD_PATH</key>\n\t\t\t<dict>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>build</string>\n\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t<integer>3</integer>\n\t\t\t</dict>\n\t\t\t<key>CERTIFICATE</key>\n\t\t\t<dict>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Developer ID Installer: Twocanoes Software, Inc. (UXP6YEHSPW)</string>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>/Users/tperfitt/Library/Keychains/login.keychain</string>\n\t\t\t</dict>\n\t\t\t<key>EXCLUDED_FILES</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.DS_Store</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .DS_Store files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".DS_Store\" files created by the Finder.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.pbdevelopment</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .pbdevelopment files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".pbdevelopment\" files created by ProjectBuilder or Xcode.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>CVS</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvsignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvspass</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.svn</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.git</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.gitignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove SCM metadata</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>classes.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>designable.db</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>info.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Optimize nib files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"classes.nib\", \"info.nib\" and \"designable.nib\" files within .nib bundles.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>Resources Disabled</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove Resources Disabled folders</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"Resources Disabled\" folders.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>SEPARATOR</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>NAME</key>\n\t\t\t<string>XCreds</string>\n\t\t\t<key>PAYLOAD_ONLY</key>\n\t\t\t<false/>\n\t\t\t<key>REFERENCE_FOLDER_PATH</key>\n\t\t\t<string>/private/tmp/pGqhe/packages_reference</string>\n\t\t\t<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>TYPE</key>\n\t<integer>0</integer>\n\t<key>VERSION</key>\n\t<integer>2</integer>\n</dict>\n</plist>"
  },
  {
    "path": "build_resources/Packages/XCreds Launch Agent/XCreds Launch Agent.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PACKAGES</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>MUST-CLOSE-APPLICATION-ITEMS</key>\n\t\t\t<array/>\n\t\t\t<key>MUST-CLOSE-APPLICATIONS</key>\n\t\t\t<false/>\n\t\t\t<key>PACKAGE_FILES</key>\n\t\t\t<dict>\n\t\t\t\t<key>DEFAULT_INSTALL_LOCATION</key>\n\t\t\t\t<string>/</string>\n\t\t\t\t<key>HIERARCHY</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Applications</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Application Support</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Automator</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Filesystems</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Frameworks</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Input Methods</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Internet Plug-Ins</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Keyboard Layouts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>agent/com.twocanoes.xcreds-launchagent.plist</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>420</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchAgents</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchDaemons</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PreferencePanes</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Preferences</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Printers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PrivilegedHelperTools</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1005</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickLook</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickTime</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Screen Savers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Scripts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Services</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Widgets</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Shared</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1023</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Users</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>/</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PAYLOAD_TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>PRESERVE_EXTENDED_ATTRIBUTES</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>SHOW_INVISIBLE</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>SPLIT_FORKS</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>TREAT_MISSING_FILES_AS_WARNING</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<integer>5</integer>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SETTINGS</key>\n\t\t\t<dict>\n\t\t\t\t<key>AUTHENTICATION</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>CONCLUSION_ACTION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>FOLLOW_SYMBOLIC_LINKS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t<string>com.twocanoes.pkg.XCredsLaunchAgent</string>\n\t\t\t\t<key>LOCATION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>XCreds Launch Agent</string>\n\t\t\t\t<key>OVERWRITE_PERMISSIONS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>PAYLOAD_SIZE</key>\n\t\t\t\t<integer>-1</integer>\n\t\t\t\t<key>REFERENCE_PATH</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>RELOCATABLE</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>USE_HFS+_COMPRESSION</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<string>1.0</string>\n\t\t\t</dict>\n\t\t\t<key>TYPE</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>UUID</key>\n\t\t\t<string>6D2A2863-F3EC-4EF4-A1B4-CFAA44FE45F4</string>\n\t\t</dict>\n\t</array>\n\t<key>PROJECT</key>\n\t<dict>\n\t\t<key>PROJECT_COMMENTS</key>\n\t\t<dict>\n\t\t\t<key>NOTES</key>\n\t\t\t<data>\n\t\t\t</data>\n\t\t</dict>\n\t\t<key>PROJECT_PRESENTATION</key>\n\t\t<dict>\n\t\t\t<key>BACKGROUND</key>\n\t\t\t<dict>\n\t\t\t\t<key>APPAREANCES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>DARK_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t\t<key>LIGHT_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t</dict>\n\t\t\t\t<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION_STEPS</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewIntroductionController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Introduction</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewReadMeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>ReadMe</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewLicenseController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>License</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewDestinationSelectController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>TargetSelect</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationTypeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>PackageSelection</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Install</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewSummaryController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>INTRODUCTION</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>TITLE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<string>XCreds Launch Agent</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>PROJECT_SETTINGS</key>\n\t\t<dict>\n\t\t\t<key>BUILD_FORMAT</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>BUILD_PATH</key>\n\t\t\t<dict>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>build</string>\n\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t</dict>\n\t\t\t<key>CERTIFICATE</key>\n\t\t\t<dict>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Developer ID Installer: Twocanoes Software, Inc. (UXP6YEHSPW)</string>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>/Users/tperfitt/Library/Keychains/login.keychain</string>\n\t\t\t</dict>\n\t\t\t<key>EXCLUDED_FILES</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.DS_Store</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .DS_Store files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".DS_Store\" files created by the Finder.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.pbdevelopment</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .pbdevelopment files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".pbdevelopment\" files created by ProjectBuilder or Xcode.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>CVS</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvsignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvspass</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.svn</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.git</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.gitignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove SCM metadata</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>classes.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>designable.db</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>info.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Optimize nib files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"classes.nib\", \"info.nib\" and \"designable.nib\" files within .nib bundles.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>Resources Disabled</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove Resources Disabled folders</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"Resources Disabled\" folders.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>SEPARATOR</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>NAME</key>\n\t\t\t<string>XCreds Launch Agent</string>\n\t\t\t<key>PAYLOAD_ONLY</key>\n\t\t\t<false/>\n\t\t\t<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>TYPE</key>\n\t<integer>0</integer>\n\t<key>VERSION</key>\n\t<integer>2</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build_resources/Packages/XCreds Launch Agent/agent/com.twocanoes.xcreds-launchagent.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.twocanoes.xcreds-launchagent</string>\n\t<key>ProcessType</key>\n\t<string>Interactive</string>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>/Applications/XCreds.app/Contents/MacOS/XCreds</string>\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "build_resources/Packages/XCreds Uninstaller/Scripts/postinstall.sh",
    "content": "#!/bin/bash\n\nset -e\nset -x\n\nscript_path=\"${0}\"\npackage_path=\"${1}\"\ntarget_path=\"${2}\"\ntarget_volume=\"${3}\"\nauthrights_path=\"${target_path}\"/Applications/XCreds.app/Contents/Resources/authrights\nplugin_path=\"${target_path}\"/Applications/XCreds.app/Contents/Resources/XCredsLoginPlugin.bundle\nauth_backup_folder=\"${target_volume}\"/Library/\"Application Support\"/xcreds\nrights_backup_path=\"${auth_backup_folder}\"/rights.bak\n\nif [ -e \"${rights_backup_path}\" ]; then \n\tsecurity authorizationdb write system.login.console < \"${rights_backup_path}\"\nfi\n\nif [ -e  \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle ]; then\n\trm -rf \"${target_volume}\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\nfi\n\nif [ -e  \"${target_volume}\"/Applications/XCreds.app ]; then\n\trm -rf \"${target_volume}\"/Applications/XCreds.app\n\t\nfi"
  },
  {
    "path": "build_resources/Packages/XCreds Uninstaller/XCreds Uninstaller.pkgproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PACKAGES</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>MUST-CLOSE-APPLICATION-ITEMS</key>\n\t\t\t<array/>\n\t\t\t<key>MUST-CLOSE-APPLICATIONS</key>\n\t\t\t<false/>\n\t\t\t<key>PACKAGE_FILES</key>\n\t\t\t<dict>\n\t\t\t\t<key>DEFAULT_INSTALL_LOCATION</key>\n\t\t\t\t<string>/private/tmp</string>\n\t\t\t\t<key>HIERARCHY</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Utilities</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Applications</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Application Support</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Audio</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>ColorPickers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Documentation</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Filesystems</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Fonts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1021</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Frameworks</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Input Methods</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Internet Plug-Ins</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchAgents</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>LaunchDaemons</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PreferencePanes</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Preferences</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Printers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>PrivilegedHelperTools</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1005</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickLook</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>QuickTime</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Screen Savers</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Scripts</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Services</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Widgets</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Automator</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>etc</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>tmp</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>509</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>var</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>private</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>Extensions</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Library</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>System</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>Shared</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>1023</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>80</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>Users</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>include</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>lib</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t\t\t<string>bin</string>\n\t\t\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>local</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>sbin</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t\t\t<string>share</string>\n\t\t\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</array>\n\t\t\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>usr</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>-1</integer>\n\t\t\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>GID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>/</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t<key>PERMISSIONS</key>\n\t\t\t\t\t<integer>493</integer>\n\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>UID</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PAYLOAD_TYPE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>PRESERVE_EXTENDED_ATTRIBUTES</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>SHOW_INVISIBLE</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>SPLIT_FORKS</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>TREAT_MISSING_FILES_AS_WARNING</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<integer>5</integer>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SCRIPTS</key>\n\t\t\t<dict>\n\t\t\t\t<key>POSTINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t<string>Scripts/postinstall.sh</string>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>PREINSTALL_PATH</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t<integer>0</integer>\n\t\t\t\t</dict>\n\t\t\t\t<key>RESOURCES</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>PACKAGE_SETTINGS</key>\n\t\t\t<dict>\n\t\t\t\t<key>AUTHENTICATION</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>CONCLUSION_ACTION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>FOLLOW_SYMBOLIC_LINKS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t<string>com.twocanoes.pkgXCreds</string>\n\t\t\t\t<key>LOCATION</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Uninstall XCreds</string>\n\t\t\t\t<key>OVERWRITE_PERMISSIONS</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>PAYLOAD_SIZE</key>\n\t\t\t\t<integer>-1</integer>\n\t\t\t\t<key>REFERENCE_PATH</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>RELOCATABLE</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>USE_HFS+_COMPRESSION</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>VERSION</key>\n\t\t\t\t<string>{pkg_version}</string>\n\t\t\t</dict>\n\t\t\t<key>TYPE</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>UUID</key>\n\t\t\t<string>A2BD87BA-4D9E-4570-955E-0EFCEF409EEA</string>\n\t\t</dict>\n\t</array>\n\t<key>PROJECT</key>\n\t<dict>\n\t\t<key>PROJECT_COMMENTS</key>\n\t\t<dict>\n\t\t\t<key>NOTES</key>\n\t\t\t<data>\n\t\t\tPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M\n\t\t\tIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv\n\t\t\tc3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l\n\t\t\tcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7\n\t\t\tIGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250\n\t\t\tZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp\n\t\t\tdGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u\n\t\t\tdGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD\n\t\t\tb2NvYVZlcnNpb24iIGNvbnRlbnQ9IjE1MDQuODMiPgo8c3R5bGUg\n\t\t\tdHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5\n\t\t\tPgo8L2JvZHk+CjwvaHRtbD4K\n\t\t\t</data>\n\t\t</dict>\n\t\t<key>PROJECT_PRESENTATION</key>\n\t\t<dict>\n\t\t\t<key>BACKGROUND</key>\n\t\t\t<dict>\n\t\t\t\t<key>APPAREANCES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>DARK_AQUA</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>ALIGNMENT</key>\n\t\t\t\t\t\t<integer>6</integer>\n\t\t\t\t\t\t<key>BACKGROUND_PATH</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>PATH</key>\n\t\t\t\t\t\t\t<string>icon_512x512.png</string>\n\t\t\t\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>CUSTOM</key>\n\t\t\t\t\t\t<true/>\n\t\t\t\t\t\t<key>LAYOUT_DIRECTION</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>SCALING</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>LIGHT_AQUA</key>\n\t\t\t\t\t<dict/>\n\t\t\t\t</dict>\n\t\t\t\t<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION TYPE</key>\n\t\t\t<dict>\n\t\t\t\t<key>HIERARCHIES</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>INSTALLER</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LIST</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>CHILDREN</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>DESCRIPTION</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>OPTIONS</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>HIDDEN</key>\n\t\t\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>PACKAGE_UUID</key>\n\t\t\t\t\t\t\t\t<string>A2BD87BA-4D9E-4570-955E-0EFCEF409EEA</string>\n\t\t\t\t\t\t\t\t<key>TITLE</key>\n\t\t\t\t\t\t\t\t<array/>\n\t\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t\t\t<key>UUID</key>\n\t\t\t\t\t\t\t\t<string>C163E7C4-1DF1-468E-89F2-35B04AC6824F</string>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<key>REMOVED</key>\n\t\t\t\t\t\t<dict/>\n\t\t\t\t\t</dict>\n\t\t\t\t</dict>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>INSTALLATION_STEPS</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewIntroductionController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Introduction</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewReadMeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>ReadMe</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewLicenseController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>License</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewDestinationSelectController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>TargetSelect</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationTypeController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>PackageSelection</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewInstallationController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Install</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>\n\t\t\t\t\t<string>ICPresentationViewSummaryController</string>\n\t\t\t\t\t<key>INSTALLER_PLUGIN</key>\n\t\t\t\t\t<string>Summary</string>\n\t\t\t\t\t<key>LIST_TITLE_KEY</key>\n\t\t\t\t\t<string>InstallerSectionTitle</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>INTRODUCTION</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>LICENSE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t\t<key>MODE</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>README</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>SUMMARY</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array/>\n\t\t\t</dict>\n\t\t\t<key>TITLE</key>\n\t\t\t<dict>\n\t\t\t\t<key>LOCALIZATIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t<string>Secure Remote Access (Uninstall)</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>PROJECT_REQUIREMENTS</key>\n\t\t<dict>\n\t\t\t<key>LIST</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>BEHAVIOR</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t<key>DICTIONARY</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISK_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>\n\t\t\t\t\t\t<integer>101100</integer>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>IC_REQUIREMENT_CHECK_TYPE</key>\n\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t<key>IDENTIFIER</key>\n\t\t\t\t\t<string>fr.whitebox.Packages.requirement.os</string>\n\t\t\t\t\t<key>MESSAGE</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>LANGUAGE</key>\n\t\t\t\t\t\t\t<string>English</string>\n\t\t\t\t\t\t\t<key>VALUE</key>\n\t\t\t\t\t\t\t<string>Winclone 6 Requires OS X 10.11 or greater.  Please send an email to support@twocanoes.com for help.</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>NAME</key>\n\t\t\t\t\t<string>Operating System</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>RESOURCES</key>\n\t\t\t<array/>\n\t\t\t<key>ROOT_VOLUME_ONLY</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>PROJECT_SETTINGS</key>\n\t\t<dict>\n\t\t\t<key>BUILD_FORMAT</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>BUILD_PATH</key>\n\t\t\t<dict>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>PATH_TYPE</key>\n\t\t\t\t<integer>3</integer>\n\t\t\t</dict>\n\t\t\t<key>CERTIFICATE</key>\n\t\t\t<dict>\n\t\t\t\t<key>NAME</key>\n\t\t\t\t<string>Developer ID Installer: Twocanoes Software, Inc. (UXP6YEHSPW)</string>\n\t\t\t\t<key>PATH</key>\n\t\t\t\t<string>/Users/tperfitt/Library/Keychains/login.keychain</string>\n\t\t\t</dict>\n\t\t\t<key>EXCLUDED_FILES</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.DS_Store</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .DS_Store files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".DS_Store\" files created by the Finder.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.pbdevelopment</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove .pbdevelopment files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \".pbdevelopment\" files created by ProjectBuilder or Xcode.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>CVS</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvsignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.cvspass</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.svn</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.git</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>.gitignore</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove SCM metadata</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>classes.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>designable.db</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>info.nib</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Optimize nib files</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"classes.nib\", \"info.nib\" and \"designable.nib\" files within .nib bundles.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<false/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>PATTERNS_ARRAY</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>REGULAR_EXPRESSION</key>\n\t\t\t\t\t\t\t<false/>\n\t\t\t\t\t\t\t<key>STRING</key>\n\t\t\t\t\t\t\t<string>Resources Disabled</string>\n\t\t\t\t\t\t\t<key>TYPE</key>\n\t\t\t\t\t\t\t<integer>1</integer>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>PROTECTED</key>\n\t\t\t\t\t<true/>\n\t\t\t\t\t<key>PROXY_NAME</key>\n\t\t\t\t\t<string>Remove Resources Disabled folders</string>\n\t\t\t\t\t<key>PROXY_TOOLTIP</key>\n\t\t\t\t\t<string>Remove \"Resources Disabled\" folders.</string>\n\t\t\t\t\t<key>STATE</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>SEPARATOR</key>\n\t\t\t\t\t<true/>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>NAME</key>\n\t\t\t<string>Uninstall XCreds</string>\n\t\t\t<key>PAYLOAD_ONLY</key>\n\t\t\t<false/>\n\t\t\t<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>TYPE</key>\n\t<integer>0</integer>\n\t<key>VERSION</key>\n\t<integer>2</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build_resources/buildscripts/build.sh",
    "content": "#!/bin/sh \nset -e\n#export SKIP_NOTARY=1\nPRODUCT_NAME=\"XCreds\"\nSCRIPT_FOLDER=\"$(dirname $0)\"\nPROJECT_FOLDER=\"../../\"\nSRC_PATH=\"../../\"\necho manifest: $update_manifest\necho upload: $upload\n###########################\n\nif [ -e \"${SRC_PATH}/../build/bitbucket_creds.sh\" ] ; then \n\tsource \"${SRC_PATH}/../build/bitbucket_creds.sh\"\nfi\nif [ -e /Applications/DropDMG.app ]; then \n\tosascript -e 'tell application \"DropDMG\" to get version'\nfi\n\npushd ../..\n\n\nif [ \"${1}\" == \"--force\" ] ; then\n\techo skipping clean check\nelse\n\t\n\tif output=\"$(git status --porcelain)\" && [ -z \"$output\" ]; then\n\t\techo \"'git status --porcelain' had no errors AND the working directory\" \\\n\t\t\"is clean.\"\n\telse \n\t\techo \"Working directory has UNCOMMITTED CHANGES.\"\n\t\texit -1\n\tfi\nfi\ncarthage update\nxcodebuild -resolvePackageDependencies\n\n\nagvtool next-version -all\n\nbuildNumber=$(agvtool what-version -terse)\nversion=$(xcodebuild -showBuildSettings |grep MARKETING_VERSION|tr -d 'MARKETING_VERSION =')\n./release_notes.sh  > release-notes.md\n\n\n\nbuildNumber=$(agvtool what-version -terse)\npopd\n\nmarketing_version=$(sed -n '/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' \"${PROJECT_FOLDER}\"/XCreds.xcodeproj/project.pbxproj)\n\ndate=$(date)\n\n\n/usr/libexec/PlistBuddy   -c \"Set :pfm_last_modified \\\"${date}\\\"\" \"${PROJECT_FOLDER}/Profile Manifest/com.twocanoes.xcreds.plist\"\n/usr/libexec/PlistBuddy   -c \"Set :pfm_description  \\\"XCreds ${marketing_version} (${buildNumber}) OAuth Settings\\\"\" \"${PROJECT_FOLDER}/Profile Manifest/com.twocanoes.xcreds.plist\"\n\nif  [ -n \"${update_manifest}\" ];  then\n\techo \"getting current manifest version\"\n\tcurr_vers=$(/usr/libexec/PlistBuddy   -c \"Print :pfm_version\" \"${PROJECT_FOLDER}/Profile Manifest/com.twocanoes.xcreds.plist\")\n\tcurr_vers=$((${curr_vers}+1))\n\techo \"setting version to  : ${curr_vers}\"\n\t/usr/libexec/PlistBuddy   -c \"Set :pfm_version ${curr_vers}\" \"${PROJECT_FOLDER}/Profile Manifest/com.twocanoes.xcreds.plist\"\t\nfi\n\n\n\ntemp_folder=$(mktemp -d \"/tmp/${PRODUCT_NAME}.XXXXXXXX\")\nBUILD_FOLDER=\"${temp_folder}/build\"\npushd \"${PROJECT_FOLDER}/Profile Manifest\"\n./build.py . -o ./jamf/ --overwrite\n\npopd \n\n\ngit commit -a -m 'updated build number, manifest and other build files'\ngit tag -a \"tag-${version}(${buildNumber})\" -m \"tag-${version}(${buildNumber})\"\ngit push --tags\ngit push\n\nxcodebuild archive -project \"${SRC_PATH}/${PRODUCT_NAME}.xcodeproj\" -scheme \"${PRODUCT_NAME}\" -archivePath  \"${temp_folder}/${PRODUCT_NAME}.xcarchive\"\n\n\nxcodebuild -exportArchive -archivePath \"${temp_folder}/${PRODUCT_NAME}.xcarchive\"  -exportOptionsPlist \"${SRC_PATH}/build_resources/exportOptions.plist\" -exportPath \"${BUILD_FOLDER}\" -allowProvisioningUpdates \n\n\necho saving symbols\nmkdir -p \"${PROJECT_FOLDER}/products/symbols/${buildNumber}\"\n\n\ncp -R \"${temp_folder}/${PRODUCT_NAME}.xcarchive/dSYMs/\" \"${PROJECT_FOLDER}/products/symbols/${buildNumber}/\"\n\n\ncp -Rv \"${SRC_PATH}/build_resources/\" \"${BUILD_FOLDER}\"\n\necho \"output is in ${BUILD_FOLDER}\"\nif [ -e /Users/tperfitt/Documents/Projects/build/build.sh ] ; then \n\t/Users/tperfitt/Documents/Projects/build/build.sh  \"${BUILD_FOLDER}\" \"${temp_folder}\" \"${PRODUCT_NAME}\" \"${BUILD_FOLDER}/XCreds.app\" \"${SCRIPT_FOLDER}/build_post.sh\"\nfi\n"
  },
  {
    "path": "build_resources/buildscripts/build_post.sh",
    "content": "#!/bin/sh\nset -x \nprebeta_filename=\"${1}\"\n\nif [ ! -e Builds ] ; then\n\tmkdir Builds\nfi\n\ncp \"${prebeta_filename}\" ../../products/builds/\nopen ../../products/builds/\n\n\n\nfilename=\"${prebeta_filename}\"\n\nthis_dir=$(dirname $0)\nsource ${this_dir}/../../../build/github_creds.sh \n\n#echo \"Uploading ${prebeta_filename}\"\nif [ -f \"${prebeta_filename}\" ] &&  [ -n \"${upload}\" ]; then\n\n#\tcurl --progress-bar -X POST \"https://${bitbucket_username}:${bitbucket_password}@api.bitbucket.org/2.0/repositories/twocanoes/xcreds/downloads\" --form files=@\"${prebeta_filename}\" > /tmp/curl.log\n\towner=\"twocanoes\"\n\tGH_API=\"https://api.github.com\"\n\trepo=\"xcreds\"\n\ttag=\"prebeta\"\n\tGH_REPO=\"$GH_API/repos/$owner/$repo\"\n\tGH_TAGS=\"$GH_REPO/releases/tags/$tag\"\n\tAUTH=\"Authorization: token $github_api_token\"\n\tif [[ \"$tag\" == 'LATEST' ]]; then\n\t\tGH_TAGS=\"$GH_REPO/releases/latest\"\n\tfi\n\n\tcurl -o /dev/null -sH \"$AUTH\" $GH_REPO || { echo \"Error: Invalid repo, token or network issue!\";  exit 1; }\n\tresponse=$(curl -sH \"$AUTH\" $GH_TAGS)\n\t\n\t# Get ID of the asset based on given filename.\n\teval $(echo \"$response\" | grep -m 1 \"id.:\" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')\n\t[ \"$id\" ] || { echo \"Error: Failed to get release id for tag: $tag\"; echo \"$response\" | awk 'length($0)<100' >&2; exit 1; }\n\t\n\t# Upload asset\n\techo \"Uploading asset... \"\n\t\n\t# Construct url\n\tGH_ASSET=\"https://uploads.github.com/repos/$owner/$repo/releases/$id/assets?name=$(basename $filename)\"\n\tcurl --data-binary @\"$filename\" -H \"Authorization: token $github_api_token\" -H \"Content-Type: application/octet-stream\" $GH_ASSET\n\nfi\n\n"
  },
  {
    "path": "build_resources/exportOptions.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>method</key>\n\t<string>developer-id</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "com.twocanoes.FileVaultLoginHelper.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.twocanoes.FileVaultLoginHelper</string>\n\t<key>BundleProgram</key>\n\t<string>Contents/MacOS/FileVaultLoginHelper</string>\n\t<key>MachServices</key>\n\t<dict>\n\t\t<key>com.twocanoes.FileVaultLoginHelper</key>\n\t\t<true/>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "com.twocanoes.xcreds-launchagent.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>KeepAlive</key>\n    <true/>\n\t<key>Label</key>\n\t<string>com.twocanoes.xcreds-launchagent</string>\n\t<key>ProcessType</key>\n\t<string>Interactive</string>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>/Applications/XCreds.app/Contents/MacOS/XCreds</string>\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "com.twocanoes.xcreds-overlay.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.twocanoes.xcreds-overlay</string>\n\t<key>ThrottleInterval</key>\n\t<integer>30</integer>\n\t<key>LimitLoadToSessionType</key>\n\t<string>LoginWindow</string>\n\t<key>OnDemand</key>\n\t<false/>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>/Applications/XCreds.app/Contents/Resources/XCreds Login Overlay.app/Contents/MacOS/XCreds Login Overlay</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "headers/DNSResolver.h",
    "content": "//\n//  DNSResolver.h\n//  NoMAD\n//\n//  Created by Boushy, Phillip on 9/28/16.\n//  Copyright © 2016 Orchard & Grove Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <dns_sd.h>\n\n@protocol DNSResolverDelegate;\n\n@interface DNSResolver : NSObject\n\n- initWithQueryType:(NSString*)queryType andValue:(NSString*)queryValue;\n\n// Setup by init...\n@property NSString *\t\t\t\t\t\t\t\t\t\t\t\tqueryType; //SRV,\n@property NSString *\t\t\t\t\t\t\t\t\t\t\t\tqueryValue; // hostname, IP, or SRV url\n// Changeable any time.\n@property (nonatomic, weak,   readwrite) id<DNSResolverDelegate>\tdelegate;\n\n// Properties set by class methods.\n@property (nonatomic, assign, readonly) BOOL\t\t\t\t\t\tfinished;   // observable\n@property (nonatomic, copy,   readonly) NSError *\t\t\t\t\terror;      // observable\n@property (readonly) NSArray *\t\t\t\t\t\t\t\t\t\tqueryResults;\n\n-(void)startQuery;\n-(void)stopQuery;\n-(void)stopQueryWithError:(NSError *)error;\n\n@end\n\n\n// Keys for the dictionaries in the results array:\n\nextern NSString * kSRVResolverPriority;     // NSNumber, host byte order\nextern NSString * kSRVResolverWeight;       // NSNumber, host byte order\nextern NSString * kSRVResolverPort;         // NSNumber, host byte order\nextern NSString * kSRVResolverTarget;       // NSString\n\nextern NSString * kDNSResolverErrorDomain; //Figure out what the heck this means...\n\n\n\n\n@protocol DNSResolverDelegate <NSObject>\n\n@optional\n\n- (void)dnsResolver:(DNSResolver *)resolver didReceiveQueryResult:(NSDictionary *)queryResult;\n// Called when we've successfully receive an answer.  The result parameter is a copy\n// of the dictionary that we just added to the results array.  This callback can be\n// called multiple times if there are multiple results.  You learn that the last\n// result was delivered by way of the -srvResolver:didStopWithError: callback.\n\n- (void)dnsResolver:(DNSResolver *)resolver didStopQueryWithError:(NSError *)error;\n// Called when the query stops (except when you stop it yourself by calling -stop),\n// either because it's received all the results (error is nil) or there's been an\n// error (error is not nil).\n\n@end\n"
  },
  {
    "path": "headers/GSSItem.h",
    "content": "/*\n * Copyright (c) 2011 Kungliga Tekniska HÃ¶gskolan\n * (Royal Institute of Technology, Stockholm, Sweden).\n * All rights reserved.\n *\n * Portions Copyright (c) 2011 Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of KTH nor the names of its contributors may be\n *    used to endorse or promote products derived from this software without\n *    specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <CoreFoundation/CoreFoundation.h>\n#include <dispatch/dispatch.h>\n#include <Availability.h>\n\n/*\n * Type is any of the kGSSAttrTypeNNN credential types below, type are\n * strings\n */\nextern const CFTypeRef kGSSAttrClass\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nextern const CFStringRef kGSSAttrClassKerberos\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFStringRef kGSSAttrClassNTLM\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFStringRef kGSSAttrClassIAKerb\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/*\n * Item supports acquiring a gss_cred_id_t with GSSItemOperation\n */\nextern const CFTypeRef kGSSAttrSupportGSSCredential\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/*\n * kGSSAttrNameGSSExportedName, kGSSAttrNameGSSUsername,\n * kGSSAttrNameGSSServiceBasedHostname, can set and will be returned\n *\n * kGSSAttrNameDisplay can only be returned, constructed from the\n * other name types after creation.\n */\nextern const CFTypeRef kGSSAttrNameType\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrNameTypeGSSExportedName /* CFDataRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrNameTypeGSSUsername /* CFStringRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrNameTypeGSSHostBasedService /* CFStringRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nextern const CFTypeRef kGSSAttrName\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/* name suiteable to display to user */\nextern const CFTypeRef kGSSAttrNameDisplay /* CFStringRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/*\n * Unique UUID for this entry\n */\nextern const CFTypeRef kGSSAttrUUID /* CFUUIDRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n\n/*\n * If the item is a transient credential it can have associated\n * expiration time.\n */\nextern const CFTypeRef kGSSAttrTransientExpire\t/* CFDateRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrTransientDefaultInClass /* CFBooleanRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n/*\n * Credential to use to use when acquiring with with\n * GSSItemOperation(kGSSOperationAcquire) or when dealing with a\n * persistant credential.\n *\n * The credentials is not exportable and will always show up as\n * the cfobject kGSSAttrCredentialExists when queried.\n */\n\nextern const CFTypeRef kGSSAttrCredentialPassword /* CFStringRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrCredentialStore /* CFBooleanRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrCredentialSecIdentity /* SecIdentityRef */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrCredentialExists\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/*\n * Status of a credentials\n */\n\nextern const CFTypeRef kGSSAttrStatusPersistant\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrStatusAutoAcquire\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrStatusAutoAcquireStatus\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSAttrStatusTransient\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/*\n * Create/Modify/Delete/Search GSS items\n *\n * Credentials needs a type, name\n */\n\ntypedef struct GSSItem *GSSItemRef;\n\nGSSItemRef\nGSSItemAdd(CFDictionaryRef attributes, CFErrorRef *error)\n__attribute__((cf_returns_retained))\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nBoolean\nGSSItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate, CFErrorRef *error)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nBoolean\nGSSItemDelete(CFDictionaryRef query, CFErrorRef *error)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nBoolean\nGSSItemDeleteItem(GSSItemRef item, CFErrorRef *error)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n/**\n * Will never return a zero length array, GSSItemCopyMatching() will return more then one entry or a NULL pointer.\n */\n\nCFArrayRef\nGSSItemCopyMatching(CFDictionaryRef query, CFErrorRef *error)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\n\n\n/*\n * Use a GSSItem to convert to either another type or to perform an\n * operation with the credential.\n *\n */\n\ntypedef struct __GSSOperationType const * GSSOperation;\n\nextern const struct __GSSOperationType __kGSSOperationAcquire /* NULL, NULL|error */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationAcquire (&__kGSSOperationAcquire)\n\nextern const struct __GSSOperationType __kGSSOperationRenewCredential\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationRenewCredential (&__kGSSOperationRenewCredential)\n\nextern const struct __GSSOperationType __kGSSOperationGetGSSCredential /* gss_cred_it_t, NULL|error */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationGetGSSCredential (&__kGSSOperationGetGSSCredential)\n\nextern const struct __GSSOperationType __kGSSOperationDestoryTransient /* kCFBoolean{True,False}, NULL|error */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const struct __GSSOperationType __kGSSOperationDestroyTransient /* kCFBoolean{True,False}, NULL|error */\n__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);\n#define kGSSOperationDestoryTransient (&__kGSSOperationDestroyTransient)\n#define kGSSOperationDestroyTransient (&__kGSSOperationDestroyTransient)\n\nextern const struct __GSSOperationType __kGSSOperationRemoveBackingCredential /* kCFBoolean{True,False}, NULL|error */\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationRemoveBackingCredential (&__kGSSOperationRemoveBackingCredential)\n\nextern const struct __GSSOperationType __kGSSOperationChangePassword\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationChangePassword (&__kGSSOperationChangePassword)\n\nextern const CFTypeRef kGSSOperationChangePasswordOldPassword\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\nextern const CFTypeRef kGSSOperationChangePasswordNewPassword\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nextern const struct __GSSOperationType __kGSSOperationCredentialDiagnostics\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationCredentialDiagnostics (&__kGSSOperationCredentialDiagnostics)\n\nextern const struct __GSSOperationType __kGSSOperationSetDefault\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n#define kGSSOperationSetDefault (&__kGSSOperationSetDefault)\n\ntypedef void (^GSSItemOperationCallbackBlock)(CFTypeRef result, CFErrorRef error);\n\nBoolean\nGSSItemOperation(GSSItemRef item, GSSOperation op, CFDictionaryRef options,\n                 dispatch_queue_t q, GSSItemOperationCallbackBlock fun)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nCFTypeRef\nGSSItemGetValue(GSSItemRef item, CFStringRef key)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n\nCFTypeID\nGSSItemGetTypeID(void)\n__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);\n"
  },
  {
    "path": "headers/krb5.h",
    "content": "/*\n * This file is auto generated.  Please do not edit it.\n */\n\n#ifndef __KERBEROS5__\n#define __KERBEROS5__\n\n/* This file is generated, please don't edit it directly.  */\n#ifndef KRB5_KRB5_H_INCLUDED\n#define KRB5_KRB5_H_INCLUDED\n/* -*- c -*-\n * include/krb5.h\n *\n * Copyright 1989,1990,1995,2001, 2003, 2007  by the Massachusetts Institute of Technology.\n * All Rights Reserved.\n *\n * Export of this software from the United States of America may\n *   require a specific license from the United States Government.\n *   It is the responsibility of any person or organization contemplating\n *   export to obtain such a license before exporting.\n *\n * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and\n * distribute this software and its documentation for any purpose and\n * without fee is hereby granted, provided that the above copyright\n * notice appear in all copies and that both that copyright notice and\n * this permission notice appear in supporting documentation, and that\n * the name of M.I.T. not be used in advertising or publicity pertaining\n * to distribution of the software without specific, written prior\n * permission.    Furthermore if you modify this software you must label\n * your software as modified software and not distribute it in such a\n * fashion that it might be confused with the original M.I.T. software.\n * M.I.T. makes no representations about the suitability of\n * this software for any purpose.  It is provided \"as is\" without express\n * or implied warranty.\n *\n *\n * General definitions for Kerberos version 5.\n */\n\n/*\n * Copyright (C) 1998 by the FundsXpress, INC.\n *\n * All rights reserved.\n *\n * Export of this software from the United States of America may require\n * a specific license from the United States Government.  It is the\n * responsibility of any person or organization contemplating export to\n * obtain such a license before exporting.\n *\n * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and\n * distribute this software and its documentation for any purpose and\n * without fee is hereby granted, provided that the above copyright\n * notice appear in all copies and that both that copyright notice and\n * this permission notice appear in supporting documentation, and that\n * the name of FundsXpress. not be used in advertising or publicity pertaining\n * to distribution of the software without specific, written prior\n * permission.  FundsXpress makes no representations about the suitability of\n * this software for any purpose.  It is provided \"as is\" without express\n * or implied warranty.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n\n#ifndef __has_extension\n#define __has_extension(x) 0\n#endif\n\n#ifndef KERBEROS_APPLE_DEPRECATED\n#if __has_extension(attribute_deprecated_with_message)\n#define KERBEROS_APPLE_DEPRECATED(x) __attribute__((deprecated(x)))\n#else\n#if !defined(__GNUC__) && !defined(__attribute__)\n#define __attribute__(x)\n#endif\n#define KERBEROS_APPLE_DEPRECATED(x) __attribute__((deprecated))\n#endif\n#endif\n\n\n#ifndef KRB5_GENERAL__\n#define KRB5_GENERAL__\n\n/* By default, do not expose deprecated interfaces. */\n#ifndef KRB5_DEPRECATED\n#define KRB5_DEPRECATED 0\n#endif\n\n#if defined(__MACH__) && defined(__APPLE__)\n#    include <TargetConditionals.h>\n#    if TARGET_RT_MAC_CFM\n#    error \"Use KfM 4.0 SDK headers for CFM compilation.\"\n#    endif\n#endif\n\n#if defined(_MSDOS) || defined(_WIN32)\n#include <win-mac.h>\n#endif\n\n#ifndef KRB5_CONFIG__\n#ifndef KRB5_CALLCONV\n#define KRB5_CALLCONV\n#define KRB5_CALLCONV_C\n#endif /* !KRB5_CALLCONV */\n#endif /* !KRB5_CONFIG__ */\n\n#ifndef KRB5_CALLCONV_WRONG\n#define KRB5_CALLCONV_WRONG\n#endif\n\n#ifndef THREEPARAMOPEN\n#define THREEPARAMOPEN(x,y,z) open(x,y,z)\n#endif\n\n#define KRB5_OLD_CRYPTO\n\n#include <stdlib.h>\n#include <limits.h>        /* for *_MAX */\n#include <stdarg.h>\n\n#ifndef KRB5INT_BEGIN_DECLS\n#if defined(__cplusplus)\n#define KRB5INT_BEGIN_DECLS    extern \"C\" {\n#define KRB5INT_END_DECLS    }\n#else\n#define KRB5INT_BEGIN_DECLS\n#define KRB5INT_END_DECLS\n#endif\n#endif\n\nKRB5INT_BEGIN_DECLS\n\n#if TARGET_OS_MAC\n#    pragma pack(push,2)\n#endif\n\n#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 30203\n# define KRB5_ATTR_DEPRECATED __attribute__((deprecated))\n#elif defined _WIN32\n# define KRB5_ATTR_DEPRECATED __declspec(deprecated)\n#else\n# define KRB5_ATTR_DEPRECATED\n#endif\n\n/* from profile.h */\nstruct _profile_t;\n/* typedef struct _profile_t *profile_t; */\n\n/*\n * begin wordsize.h\n */\n\n/*\n * Word-size related definition.\n */\n\ntypedef    unsigned char    krb5_octet;\n\n#if INT_MAX == 0x7fff\ntypedef    int    krb5_int16;\ntypedef    unsigned int    krb5_ui_2;\n#elif SHRT_MAX == 0x7fff\ntypedef    short    krb5_int16;\ntypedef    unsigned short    krb5_ui_2;\n#else\n#error undefined 16 bit type\n#endif\n\n#if INT_MAX == 0x7fffffffL\ntypedef    int    krb5_int32;\ntypedef    unsigned int    krb5_ui_4;\n#elif LONG_MAX == 0x7fffffffL\ntypedef    long    krb5_int32;\ntypedef    unsigned long    krb5_ui_4;\n#elif SHRT_MAX == 0x7fffffffL\ntypedef    short    krb5_int32;\ntypedef    unsigned short    krb5_ui_4;\n#else\n#error: undefined 32 bit type\n#endif\n\n#define VALID_INT_BITS      INT_MAX\n#define VALID_UINT_BITS      UINT_MAX\n\n#define KRB5_INT32_MAX    2147483647\n/* this strange form is necessary since - is a unary operator, not a sign\n indicator */\n#define KRB5_INT32_MIN    (-KRB5_INT32_MAX-1)\n\n#define KRB5_INT16_MAX 65535\n/* this strange form is necessary since - is a unary operator, not a sign\n indicator */\n#define KRB5_INT16_MIN    (-KRB5_INT16_MAX-1)\n\n/*\n * end wordsize.h\n */\n\n/*\n * begin \"base-defs.h\"\n */\n\n/*\n * Basic definitions for Kerberos V5 library\n */\n\n#ifndef FALSE\n#define    FALSE    0\n#endif\n#ifndef TRUE\n#define    TRUE    1\n#endif\n\ntypedef    unsigned int krb5_boolean;\ntypedef    unsigned int krb5_msgtype;\ntypedef    unsigned int krb5_kvno;\n\ntypedef    krb5_int32 krb5_addrtype;\ntypedef krb5_int32 krb5_enctype;\ntypedef krb5_int32 krb5_cksumtype;\ntypedef krb5_int32 krb5_authdatatype;\ntypedef krb5_int32 krb5_keyusage;\n\ntypedef krb5_int32    krb5_preauthtype; /* This may change, later on */\ntypedef    krb5_int32    krb5_flags;\ntypedef krb5_int32    krb5_timestamp;\ntypedef    krb5_int32    krb5_error_code;\ntypedef krb5_int32    krb5_deltat;\n\ntypedef krb5_error_code    krb5_magic;\n\ntypedef struct _krb5_data {\n    krb5_magic magic;\n    unsigned int length;\n    char *data;\n} krb5_data;\n\ntypedef struct _krb5_octet_data {\n    krb5_magic magic;\n    unsigned int length;\n    krb5_octet *data;\n} krb5_octet_data;\n\n/*\n * Hack length for crypto library to use the afs_string_to_key It is\n * equivalent to -1 without possible sign extension\n * We also overload for an unset salt type length - which is also -1, but\n * hey, why not....\n */\n#define SALT_TYPE_AFS_LENGTH UINT_MAX\n#define SALT_TYPE_NO_LENGTH  UINT_MAX\n\ntypedef    void * krb5_pointer;\ntypedef void const * krb5_const_pointer;\n\ntypedef struct krb5_principal_data {\n    krb5_magic magic;\n    krb5_data realm;\n    krb5_data *data;        /* An array of strings */\n    krb5_int32 length;\n    krb5_int32 type;\n} krb5_principal_data;\n\ntypedef    krb5_principal_data * krb5_principal;\n\n/*\n * Per V5 spec on definition of principal types\n */\n\n/* Name type not known */\n#define KRB5_NT_UNKNOWN            0\n/* Just the name of the principal as in DCE, or for users */\n#define KRB5_NT_PRINCIPAL        1\n/* Service and other unique instance (krbtgt) */\n#define KRB5_NT_SRV_INST        2\n/* Service with host name as instance (telnet, rcommands) */\n#define KRB5_NT_SRV_HST            3\n/* Service with host as remaining components */\n#define KRB5_NT_SRV_XHST        4\n/* Unique ID */\n#define KRB5_NT_UID            5\n/* PKINIT */\n#define KRB5_NT_X500_PRINCIPAL        6\n/* Name in form of SMTP email name */\n#define KRB5_NT_SMTP_NAME        7\n/* Windows 2000 UPN */\n#define KRB5_NT_ENTERPRISE_PRINCIPAL    10\n/* Windows 2000 UPN and SID */\n#define KRB5_NT_MS_PRINCIPAL        -128\n/* NT 4 style name */\n#define KRB5_NT_MS_PRINCIPAL_AND_ID    -129\n/* NT 4 style name and SID */\n#define KRB5_NT_ENT_PRINCIPAL_AND_ID    -130\n\n/* constant version thereof: */\ntypedef const krb5_principal_data *krb5_const_principal;\n\n#define krb5_princ_realm(context, princ) (&(princ)->realm)\n#define krb5_princ_set_realm(context, princ,value) ((princ)->realm = *(value))\n#define krb5_princ_set_realm_length(context, princ,value) (princ)->realm.length = (value)\n#define krb5_princ_set_realm_data(context, princ,value) (princ)->realm.data = (value)\n#define    krb5_princ_size(context, princ) (princ)->length\n#define    krb5_princ_type(context, princ) (princ)->type\n#define    krb5_princ_name(context, princ) (princ)->data\n#define    krb5_princ_component(context, princ,i)        \\\n(((i) < krb5_princ_size(context, princ))    \\\n? (princ)->data + (i)            \\\n: NULL)\n\n/*\n * Constants for realm referrals.\n */\n#define        KRB5_REFERRAL_REALM    \"\"\n\n/*\n * Referral-specific functions.\n */\nkrb5_boolean KRB5_CALLCONV krb5_is_referral_realm(const krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * end \"base-defs.h\"\n */\n\n/*\n * begin \"hostaddr.h\"\n */\n\n/* structure for address */\ntypedef struct _krb5_address {\n    krb5_magic magic;\n    krb5_addrtype addrtype;\n    unsigned int length;\n    krb5_octet *contents;\n} krb5_address;\n\n/* per Kerberos v5 protocol spec */\n#define    ADDRTYPE_INET        0x0002\n#define    ADDRTYPE_CHAOS        0x0005\n#define    ADDRTYPE_XNS        0x0006\n#define    ADDRTYPE_ISO        0x0007\n#define ADDRTYPE_DDP        0x0010\n#define ADDRTYPE_INET6        0x0018\n/* not yet in the spec... */\n#define ADDRTYPE_ADDRPORT    0x0100\n#define ADDRTYPE_IPPORT        0x0101\n\n/* macros to determine if a type is a local type */\n#define ADDRTYPE_IS_LOCAL(addrtype) (addrtype & 0x8000)\n\n/*\n * end \"hostaddr.h\"\n */\n\n\nstruct _krb5_context;\ntypedef struct _krb5_context * krb5_context;\n\nstruct _krb5_auth_context;\ntypedef struct _krb5_auth_context * krb5_auth_context;\n\nstruct _krb5_cryptosystem_entry;\n\n/*\n * begin \"encryption.h\"\n */\n\ntypedef struct _krb5_keyblock {\n    krb5_magic magic;\n    krb5_enctype enctype;\n    unsigned int length;\n    krb5_octet *contents;\n} krb5_keyblock;\n\n#ifdef KRB5_OLD_CRYPTO\ntypedef struct _krb5_encrypt_block {\n    krb5_magic magic;\n    krb5_enctype crypto_entry;        /* to call krb5_encrypt_size, you need\n                                       this.  it was a pointer, but it\n                                       doesn't have to be.  gross. */\n    krb5_keyblock *key;\n} krb5_encrypt_block;\n#endif\n\ntypedef struct _krb5_checksum {\n    krb5_magic magic;\n    krb5_cksumtype checksum_type;    /* checksum type */\n    unsigned int length;\n    krb5_octet *contents;\n} krb5_checksum;\n\ntypedef struct _krb5_enc_data {\n    krb5_magic magic;\n    krb5_enctype enctype;\n    krb5_kvno kvno;\n    krb5_data ciphertext;\n} krb5_enc_data;\n\n/* per Kerberos v5 protocol spec */\n#define    ENCTYPE_NULL        0x0000\n#define    ENCTYPE_DES_CBC_CRC    0x0001    /* DES cbc mode with CRC-32 */\n#define    ENCTYPE_DES_CBC_MD4    0x0002    /* DES cbc mode with RSA-MD4 */\n#define    ENCTYPE_DES_CBC_MD5    0x0003    /* DES cbc mode with RSA-MD5 */\n#define    ENCTYPE_DES_CBC_RAW    0x0004    /* DES cbc mode raw */\n/* XXX deprecated? */\n#define    ENCTYPE_DES3_CBC_SHA    0x0005    /* DES-3 cbc mode with NIST-SHA */\n#define    ENCTYPE_DES3_CBC_RAW    0x0006    /* DES-3 cbc mode raw */\n#define ENCTYPE_DES_HMAC_SHA1    0x0008\n/* PKINIT */\n#define ENCTYPE_DSA_SHA1_CMS    0x0009    /* DSA with SHA1, CMS signature */\n#define ENCTYPE_MD5_RSA_CMS    0x000a    /* MD5 with RSA, CMS signature */\n#define ENCTYPE_SHA1_RSA_CMS    0x000b    /* SHA1 with RSA, CMS signature */\n#define ENCTYPE_RC2_CBC_ENV    0x000c    /* RC2 cbc mode, CMS enveloped data */\n#define ENCTYPE_RSA_ENV        0x000d    /* RSA encryption, CMS enveloped data */\n#define ENCTYPE_RSA_ES_OAEP_ENV    0x000e    /* RSA w/OEAP encryption, CMS enveloped data */\n#define ENCTYPE_DES3_CBC_ENV    0x000f    /* DES-3 cbc mode, CMS enveloped data */\n\n#define ENCTYPE_DES3_CBC_SHA1    0x0010\n#define ENCTYPE_AES128_CTS_HMAC_SHA1_96    0x0011\n#define ENCTYPE_AES256_CTS_HMAC_SHA1_96    0x0012\n#define ENCTYPE_ARCFOUR_HMAC    0x0017\n#define ENCTYPE_ARCFOUR_HMAC_EXP 0x0018\n#define ENCTYPE_UNKNOWN        0x01ff\n\n#define    CKSUMTYPE_CRC32        0x0001\n#define    CKSUMTYPE_RSA_MD4    0x0002\n#define    CKSUMTYPE_RSA_MD4_DES    0x0003\n#define    CKSUMTYPE_DESCBC    0x0004\n/* des-mac-k */\n/* rsa-md4-des-k */\n#define    CKSUMTYPE_RSA_MD5    0x0007\n#define    CKSUMTYPE_RSA_MD5_DES    0x0008\n#define CKSUMTYPE_NIST_SHA    0x0009\n#define CKSUMTYPE_HMAC_SHA1_DES3    0x000c\n#define CKSUMTYPE_HMAC_SHA1_96_AES128    0x000f\n#define CKSUMTYPE_HMAC_SHA1_96_AES256    0x0010\n#define CKSUMTYPE_HMAC_MD5_ARCFOUR -138 /*Microsoft md5 hmac cksumtype*/\n\n/* The following are entropy source designations. Whenever\n * krb5_C_random_add_entropy is called, one of these source  ids is passed\n * in.  This  allows the library  to better estimate bits of\n * entropy in the sample and to keep track of what sources of entropy have\n * contributed enough entropy.  Sources marked internal MUST NOT be\n * used by applications outside the Kerberos library\n */\n\nenum {\n    KRB5_C_RANDSOURCE_OLDAPI = 0, /*calls to krb5_C_RANDOM_SEED (INTERNAL)*/\n    KRB5_C_RANDSOURCE_OSRAND = 1, /* /dev/random or equivalent (internal)*/\n    KRB5_C_RANDSOURCE_TRUSTEDPARTY = 2, /* From KDC or other trusted party*/\n    /*This source should be used carefully; data in this category\n     * should be from a third party trusted to give random bits\n     * For example keys issued by the KDC in the application server.\n     */\n    KRB5_C_RANDSOURCE_TIMING = 3, /* Timing of operations*/\n    KRB5_C_RANDSOURCE_EXTERNAL_PROTOCOL = 4, /*Protocol data possibly from attacker*/\n    KRB5_C_RANDSOURCE_MAX = 5 /*Do not use; maximum source ID*/\n};\n\n#ifndef krb5_roundup\n/* round x up to nearest multiple of y */\n#define krb5_roundup(x, y) ((((x) + (y) - 1)/(y))*(y))\n#endif /* roundup */\n\n/* macro function definitions to help clean up code */\n\n#if 1\n#define krb5_x(ptr,args) ((ptr)?((*(ptr)) args):(abort(),1))\n#define krb5_xc(ptr,args) ((ptr)?((*(ptr)) args):(abort(),(char*)0))\n#else\n#define krb5_x(ptr,args) ((*(ptr)) args)\n#define krb5_xc(ptr,args) ((*(ptr)) args)\n#endif\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_encrypt\n(krb5_context context, const krb5_keyblock *key,\n krb5_keyusage usage, const krb5_data *cipher_state,\n const krb5_data *input, krb5_enc_data *output) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_decrypt\n(krb5_context context, const krb5_keyblock *key,\n krb5_keyusage usage, const krb5_data *cipher_state,\n const krb5_enc_data *input, krb5_data *output) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_encrypt_length\n(krb5_context context, krb5_enctype enctype,\n size_t inputlen, size_t *length) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_block_size\n(krb5_context context, krb5_enctype enctype,\n size_t *blocksize) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_keylengths\n(krb5_context context, krb5_enctype enctype,\n size_t *keybytes, size_t *keylength) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_init_state\n(krb5_context context,\n const krb5_keyblock *key, krb5_keyusage usage,\n krb5_data *new_state) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_free_state\n(krb5_context context, const krb5_keyblock *key, krb5_data *state) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_prf (krb5_context, const krb5_keyblock *,\n            krb5_data *in, krb5_data *out) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_prf_length (krb5_context, krb5_enctype, size_t *outlen) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_make_random_key\n(krb5_context context, krb5_enctype enctype,\n krb5_keyblock *k5_random_key) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_random_to_key\n(krb5_context context, krb5_enctype enctype,\n krb5_data *random_data, krb5_keyblock *k5_random_key) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* Register a new entropy sample  with the PRNG. may cause\n * the PRNG to be reseeded, although this is not guaranteed.  See previous randsource definitions\n * for information on how each source should be used.\n */\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_random_add_entropy\n(krb5_context context, unsigned int  randsource_id, const krb5_data *data) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_random_make_octets\n(krb5_context context, krb5_data *data) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * Collect entropy from the OS if possible. strong requests that as strong\n * of a source of entropy  as available be used.  Setting strong may\n * increase the probability of blocking and should not  be used for normal\n * applications.  Good uses include seeding the PRNG for kadmind\n * and realm setup.\n * If successful is non-null, then successful is set to 1 if the OS provided\n * entropy else zero.\n */\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_random_os_entropy\n(krb5_context context, int strong, int *success) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*deprecated*/ krb5_error_code KRB5_CALLCONV\nkrb5_c_random_seed\n(krb5_context context, krb5_data *data) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_string_to_key\n(krb5_context context, krb5_enctype enctype,\n const krb5_data *string, const krb5_data *salt,\n krb5_keyblock *key) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_string_to_key_with_params(krb5_context context,\n                                 krb5_enctype enctype,\n                                 const krb5_data *string,\n                                 const krb5_data *salt,\n                                 const krb5_data *params,\n                                 krb5_keyblock *key) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_enctype_compare\n(krb5_context context, krb5_enctype e1, krb5_enctype e2,\n krb5_boolean *similar) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_make_checksum\n(krb5_context context, krb5_cksumtype cksumtype,\n const krb5_keyblock *key, krb5_keyusage usage,\n const krb5_data *input, krb5_checksum *cksum) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_verify_checksum\n(krb5_context context,\n const krb5_keyblock *key, krb5_keyusage usage,\n const krb5_data *data,\n const krb5_checksum *cksum,\n krb5_boolean *valid) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_checksum_length\n(krb5_context context, krb5_cksumtype cksumtype,\n size_t *length) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_c_keyed_checksum_types\n(krb5_context context, krb5_enctype enctype,\n unsigned int *count, krb5_cksumtype **cksumtypes) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#define KRB5_KEYUSAGE_AS_REQ_PA_ENC_TS        1\n#define KRB5_KEYUSAGE_KDC_REP_TICKET        2\n#define KRB5_KEYUSAGE_AS_REP_ENCPART        3\n#define KRB5_KEYUSAGE_TGS_REQ_AD_SESSKEY    4\n#define KRB5_KEYUSAGE_TGS_REQ_AD_SUBKEY        5\n#define KRB5_KEYUSAGE_TGS_REQ_AUTH_CKSUM    6\n#define KRB5_KEYUSAGE_TGS_REQ_AUTH        7\n#define KRB5_KEYUSAGE_TGS_REP_ENCPART_SESSKEY    8\n#define KRB5_KEYUSAGE_TGS_REP_ENCPART_SUBKEY    9\n#define KRB5_KEYUSAGE_AP_REQ_AUTH_CKSUM        10\n#define KRB5_KEYUSAGE_AP_REQ_AUTH        11\n#define KRB5_KEYUSAGE_AP_REP_ENCPART        12\n#define KRB5_KEYUSAGE_KRB_PRIV_ENCPART        13\n#define KRB5_KEYUSAGE_KRB_CRED_ENCPART        14\n#define KRB5_KEYUSAGE_KRB_SAFE_CKSUM        15\n#define KRB5_KEYUSAGE_APP_DATA_ENCRYPT        16\n#define KRB5_KEYUSAGE_APP_DATA_CKSUM        17\n#define KRB5_KEYUSAGE_KRB_ERROR_CKSUM        18\n#define KRB5_KEYUSAGE_AD_KDCISSUED_CKSUM    19\n#define KRB5_KEYUSAGE_AD_MTE            20\n#define KRB5_KEYUSAGE_AD_ITE            21\n\n/* XXX need to register these */\n\n#define KRB5_KEYUSAGE_GSS_TOK_MIC        22\n#define KRB5_KEYUSAGE_GSS_TOK_WRAP_INTEG    23\n#define KRB5_KEYUSAGE_GSS_TOK_WRAP_PRIV        24\n\n/* Defined in hardware preauth draft */\n\n#define KRB5_KEYUSAGE_PA_SAM_CHALLENGE_CKSUM    25\n#define KRB5_KEYUSAGE_PA_SAM_CHALLENGE_TRACKID    26\n#define KRB5_KEYUSAGE_PA_SAM_RESPONSE        27\n\n/* Defined in KDC referrals draft */\n#define KRB5_KEYUSAGE_PA_REFERRAL        26 /* XXX note conflict with above */\n\nkrb5_boolean KRB5_CALLCONV krb5_c_valid_enctype\n(krb5_enctype ktype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_c_valid_cksumtype\n(krb5_cksumtype ctype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_c_is_coll_proof_cksum\n(krb5_cksumtype ctype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_c_is_keyed_cksum\n(krb5_cksumtype ctype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#ifdef KRB5_OLD_CRYPTO\n/*\n * old cryptosystem routine prototypes.  These are now layered\n * on top of the functions above.\n */\nkrb5_error_code KRB5_CALLCONV krb5_encrypt\n(krb5_context context,\n krb5_const_pointer inptr,\n krb5_pointer outptr,\n size_t size,\n krb5_encrypt_block * eblock,\n krb5_pointer ivec) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_decrypt\n(krb5_context context,\n krb5_const_pointer inptr,\n krb5_pointer outptr,\n size_t size,\n krb5_encrypt_block * eblock,\n krb5_pointer ivec) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_process_key\n(krb5_context context,\n krb5_encrypt_block * eblock,\n const krb5_keyblock * key) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_finish_key\n(krb5_context context,\n krb5_encrypt_block * eblock) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_string_to_key\n(krb5_context context,\n const krb5_encrypt_block * eblock,\n krb5_keyblock * keyblock,\n const krb5_data * data,\n const krb5_data * salt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_init_random_key\n(krb5_context context,\n const krb5_encrypt_block * eblock,\n const krb5_keyblock * keyblock,\n krb5_pointer * ptr) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_finish_random_key\n(krb5_context context,\n const krb5_encrypt_block * eblock,\n krb5_pointer * ptr) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_random_key\n(krb5_context context,\n const krb5_encrypt_block * eblock,\n krb5_pointer ptr,\n krb5_keyblock ** keyblock) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_enctype KRB5_CALLCONV krb5_eblock_enctype\n(krb5_context context,\n const krb5_encrypt_block * eblock) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_use_enctype\n(krb5_context context,\n krb5_encrypt_block * eblock,\n krb5_enctype enctype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nsize_t KRB5_CALLCONV krb5_encrypt_size\n(size_t length,\n krb5_enctype crypto) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nsize_t KRB5_CALLCONV krb5_checksum_size\n(krb5_context context,\n krb5_cksumtype ctype) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_calculate_checksum\n(krb5_context context,\n krb5_cksumtype ctype,\n krb5_const_pointer in, size_t in_length,\n krb5_const_pointer seed, size_t seed_length,\n krb5_checksum * outcksum) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_verify_checksum\n(krb5_context context,\n krb5_cksumtype ctype,\n const krb5_checksum * cksum,\n krb5_const_pointer in, size_t in_length,\n krb5_const_pointer seed, size_t seed_length) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#endif /* KRB5_OLD_CRYPTO */\n\n/*\n * end \"encryption.h\"\n */\n\n/*\n * begin \"fieldbits.h\"\n */\n\n/* kdc_options for kdc_request */\n/* options is 32 bits; each host is responsible to put the 4 bytes\n representing these bits into net order before transmission */\n/* #define    KDC_OPT_RESERVED    0x80000000 */\n#define    KDC_OPT_FORWARDABLE        0x40000000\n#define    KDC_OPT_FORWARDED        0x20000000\n#define    KDC_OPT_PROXIABLE        0x10000000\n#define    KDC_OPT_PROXY            0x08000000\n#define    KDC_OPT_ALLOW_POSTDATE        0x04000000\n#define    KDC_OPT_POSTDATED        0x02000000\n/* #define    KDC_OPT_UNUSED        0x01000000 */\n#define    KDC_OPT_RENEWABLE        0x00800000\n/* #define    KDC_OPT_UNUSED        0x00400000 */\n/* #define    KDC_OPT_RESERVED    0x00200000 */\n/* #define    KDC_OPT_RESERVED    0x00100000 */\n/* #define    KDC_OPT_RESERVED    0x00080000 */\n/* #define    KDC_OPT_RESERVED    0x00040000 */\n#define    KDC_OPT_REQUEST_ANONYMOUS    0x00020000\n#define    KDC_OPT_CANONICALIZE        0x00010000\n/* #define    KDC_OPT_RESERVED    0x00008000 */\n/* #define    KDC_OPT_RESERVED    0x00004000 */\n/* #define    KDC_OPT_RESERVED    0x00002000 */\n/* #define    KDC_OPT_RESERVED    0x00001000 */\n/* #define    KDC_OPT_RESERVED    0x00000800 */\n/* #define    KDC_OPT_RESERVED    0x00000400 */\n/* #define    KDC_OPT_RESERVED    0x00000200 */\n/* #define    KDC_OPT_RESERVED    0x00000100 */\n/* #define    KDC_OPT_RESERVED    0x00000080 */\n/* #define    KDC_OPT_RESERVED    0x00000040 */\n#define    KDC_OPT_DISABLE_TRANSITED_CHECK    0x00000020\n#define    KDC_OPT_RENEWABLE_OK        0x00000010\n#define    KDC_OPT_ENC_TKT_IN_SKEY        0x00000008\n/* #define    KDC_OPT_UNUSED        0x00000004 */\n#define    KDC_OPT_RENEW            0x00000002\n#define    KDC_OPT_VALIDATE        0x00000001\n\n/*\n * Mask of ticket flags in the TGT which should be converted into KDC\n * options when using the TGT to get derivitive tickets.\n *\n *  New mask = KDC_OPT_FORWARDABLE | KDC_OPT_PROXIABLE |\n *           KDC_OPT_ALLOW_POSTDATE | KDC_OPT_RENEWABLE\n */\n#define KDC_TKT_COMMON_MASK        0x54800000\n\n/* definitions for ap_options fields */\n/* ap_options are 32 bits; each host is responsible to put the 4 bytes\n representing these bits into net order before transmission */\n#define    AP_OPTS_RESERVED        0x80000000\n#define    AP_OPTS_USE_SESSION_KEY        0x40000000\n#define    AP_OPTS_MUTUAL_REQUIRED        0x20000000\n/* #define    AP_OPTS_RESERVED    0x10000000 */\n/* #define    AP_OPTS_RESERVED    0x08000000 */\n/* #define    AP_OPTS_RESERVED    0x04000000 */\n/* #define    AP_OPTS_RESERVED    0x02000000 */\n/* #define    AP_OPTS_RESERVED    0x01000000 */\n/* #define    AP_OPTS_RESERVED    0x00800000 */\n/* #define    AP_OPTS_RESERVED    0x00400000 */\n/* #define    AP_OPTS_RESERVED    0x00200000 */\n/* #define    AP_OPTS_RESERVED    0x00100000 */\n/* #define    AP_OPTS_RESERVED    0x00080000 */\n/* #define    AP_OPTS_RESERVED    0x00040000 */\n/* #define    AP_OPTS_RESERVED    0x00020000 */\n/* #define    AP_OPTS_RESERVED    0x00010000 */\n/* #define    AP_OPTS_RESERVED    0x00008000 */\n/* #define    AP_OPTS_RESERVED    0x00004000 */\n/* #define    AP_OPTS_RESERVED    0x00002000 */\n/* #define    AP_OPTS_RESERVED    0x00001000 */\n/* #define    AP_OPTS_RESERVED    0x00000800 */\n/* #define    AP_OPTS_RESERVED    0x00000400 */\n/* #define    AP_OPTS_RESERVED    0x00000200 */\n/* #define    AP_OPTS_RESERVED    0x00000100 */\n/* #define    AP_OPTS_RESERVED    0x00000080 */\n/* #define    AP_OPTS_RESERVED    0x00000040 */\n/* #define    AP_OPTS_RESERVED    0x00000020 */\n/* #define    AP_OPTS_RESERVED    0x00000010 */\n/* #define    AP_OPTS_RESERVED    0x00000008 */\n/* #define    AP_OPTS_RESERVED    0x00000004 */\n/* #define    AP_OPTS_RESERVED    0x00000002 */\n#define AP_OPTS_USE_SUBKEY    0x00000001\n\n#define AP_OPTS_WIRE_MASK    0xfffffff0\n\n/* definitions for ad_type fields. */\n#define    AD_TYPE_RESERVED    0x8000\n#define    AD_TYPE_EXTERNAL    0x4000\n#define    AD_TYPE_REGISTERED    0x2000\n\n#define AD_TYPE_FIELD_TYPE_MASK    0x1fff\n\n/* Ticket flags */\n/* flags are 32 bits; each host is responsible to put the 4 bytes\n representing these bits into net order before transmission */\n/* #define    TKT_FLG_RESERVED    0x80000000 */\n#define    TKT_FLG_FORWARDABLE        0x40000000\n#define    TKT_FLG_FORWARDED        0x20000000\n#define    TKT_FLG_PROXIABLE        0x10000000\n#define    TKT_FLG_PROXY            0x08000000\n#define    TKT_FLG_MAY_POSTDATE        0x04000000\n#define    TKT_FLG_POSTDATED        0x02000000\n#define    TKT_FLG_INVALID            0x01000000\n#define    TKT_FLG_RENEWABLE        0x00800000\n#define    TKT_FLG_INITIAL            0x00400000\n#define    TKT_FLG_PRE_AUTH        0x00200000\n#define    TKT_FLG_HW_AUTH            0x00100000\n#define    TKT_FLG_TRANSIT_POLICY_CHECKED    0x00080000\n#define    TKT_FLG_OK_AS_DELEGATE        0x00040000\n#define    TKT_FLG_ANONYMOUS        0x00020000\n/* #define    TKT_FLG_RESERVED    0x00010000 */\n/* #define    TKT_FLG_RESERVED    0x00008000 */\n/* #define    TKT_FLG_RESERVED    0x00004000 */\n/* #define    TKT_FLG_RESERVED    0x00002000 */\n/* #define    TKT_FLG_RESERVED    0x00001000 */\n/* #define    TKT_FLG_RESERVED    0x00000800 */\n/* #define    TKT_FLG_RESERVED    0x00000400 */\n/* #define    TKT_FLG_RESERVED    0x00000200 */\n/* #define    TKT_FLG_RESERVED    0x00000100 */\n/* #define    TKT_FLG_RESERVED    0x00000080 */\n/* #define    TKT_FLG_RESERVED    0x00000040 */\n/* #define    TKT_FLG_RESERVED    0x00000020 */\n/* #define    TKT_FLG_RESERVED    0x00000010 */\n/* #define    TKT_FLG_RESERVED    0x00000008 */\n/* #define    TKT_FLG_RESERVED    0x00000004 */\n/* #define    TKT_FLG_RESERVED    0x00000002 */\n/* #define    TKT_FLG_RESERVED    0x00000001 */\n\n/* definitions for lr_type fields. */\n#define    LR_TYPE_THIS_SERVER_ONLY    0x8000\n\n#define LR_TYPE_INTERPRETATION_MASK    0x7fff\n\n/* definitions for ad_type fields. */\n#define    AD_TYPE_EXTERNAL    0x4000\n#define    AD_TYPE_REGISTERED    0x2000\n\n#define AD_TYPE_FIELD_TYPE_MASK    0x1fff\n#define AD_TYPE_INTERNAL_MASK    0x3fff\n\n/* definitions for msec direction bit for KRB_SAFE, KRB_PRIV */\n#define    MSEC_DIRBIT        0x8000\n#define    MSEC_VAL_MASK        0x7fff\n\n/*\n * end \"fieldbits.h\"\n */\n\n/*\n * begin \"proto.h\"\n */\n\n/* Protocol version number */\n#define    KRB5_PVNO    5\n\n/* Message types */\n\n#define    KRB5_AS_REQ    ((krb5_msgtype)10) /* Req for initial authentication */\n#define    KRB5_AS_REP    ((krb5_msgtype)11) /* Response to KRB_AS_REQ request */\n#define    KRB5_TGS_REQ    ((krb5_msgtype)12) /* TGS request to server */\n#define    KRB5_TGS_REP    ((krb5_msgtype)13) /* Response to KRB_TGS_REQ req */\n#define    KRB5_AP_REQ    ((krb5_msgtype)14) /* application request to server */\n#define    KRB5_AP_REP    ((krb5_msgtype)15) /* Response to KRB_AP_REQ_MUTUAL */\n#define    KRB5_SAFE    ((krb5_msgtype)20) /* Safe application message */\n#define    KRB5_PRIV    ((krb5_msgtype)21) /* Private application message */\n#define    KRB5_CRED    ((krb5_msgtype)22) /* Credential forwarding message */\n#define    KRB5_ERROR    ((krb5_msgtype)30) /* Error response */\n\n/* LastReq types */\n#define KRB5_LRQ_NONE            0\n#define KRB5_LRQ_ALL_LAST_TGT        1\n#define KRB5_LRQ_ONE_LAST_TGT        (-1)\n#define KRB5_LRQ_ALL_LAST_INITIAL    2\n#define KRB5_LRQ_ONE_LAST_INITIAL    (-2)\n#define KRB5_LRQ_ALL_LAST_TGT_ISSUED    3\n#define KRB5_LRQ_ONE_LAST_TGT_ISSUED    (-3)\n#define KRB5_LRQ_ALL_LAST_RENEWAL    4\n#define KRB5_LRQ_ONE_LAST_RENEWAL    (-4)\n#define KRB5_LRQ_ALL_LAST_REQ        5\n#define KRB5_LRQ_ONE_LAST_REQ        (-5)\n#define KRB5_LRQ_ALL_PW_EXPTIME        6\n#define KRB5_LRQ_ONE_PW_EXPTIME        (-6)\n\n/* PADATA types */\n#define KRB5_PADATA_NONE        0\n#define    KRB5_PADATA_AP_REQ        1\n#define    KRB5_PADATA_TGS_REQ        KRB5_PADATA_AP_REQ\n#define KRB5_PADATA_ENC_TIMESTAMP    2\n#define    KRB5_PADATA_PW_SALT        3\n#if 0                /* Not used */\n#define KRB5_PADATA_ENC_ENCKEY        4  /* Key encrypted within itself */\n#endif\n#define KRB5_PADATA_ENC_UNIX_TIME    5  /* timestamp encrypted in key */\n#define KRB5_PADATA_ENC_SANDIA_SECURID    6  /* SecurId passcode */\n#define KRB5_PADATA_SESAME        7  /* Sesame project */\n#define KRB5_PADATA_OSF_DCE        8  /* OSF DCE */\n#define KRB5_CYBERSAFE_SECUREID        9  /* Cybersafe */\n#define    KRB5_PADATA_AFS3_SALT        10 /* Cygnus */\n#define KRB5_PADATA_ETYPE_INFO        11 /* Etype info for preauth */\n#define KRB5_PADATA_SAM_CHALLENGE    12 /* draft challenge system */\n#define KRB5_PADATA_SAM_RESPONSE    13 /* draft challenge system response */\n#define KRB5_PADATA_PK_AS_REQ_OLD    14 /* PKINIT */\n#define KRB5_PADATA_PK_AS_REP_OLD    15 /* PKINIT */\n#define KRB5_PADATA_PK_AS_REQ        16 /* PKINIT */\n#define KRB5_PADATA_PK_AS_REP        17 /* PKINIT */\n#define KRB5_PADATA_ETYPE_INFO2        19\n#define KRB5_PADATA_USE_SPECIFIED_KVNO    20\n#define KRB5_PADATA_SAM_REDIRECT    21\n#define KRB5_PADATA_GET_FROM_TYPED_DATA    22\n#define KRB5_PADATA_REFERRAL        25 /* draft referral system */\n#define KRB5_PADATA_SAM_CHALLENGE_2    30 /* draft challenge system, updated */\n#define KRB5_PADATA_SAM_RESPONSE_2    31 /* draft challenge system, updated */\n#define KRB5_PADATA_PK_AS_09_BINDING    132\n\n#define    KRB5_SAM_USE_SAD_AS_KEY        0x80000000\n#define    KRB5_SAM_SEND_ENCRYPTED_SAD    0x40000000\n#define    KRB5_SAM_MUST_PK_ENCRYPT_SAD    0x20000000 /* currently must be zero */\n\n/* Reserved for SPX pre-authentication. */\n#define KRB5_PADATA_DASS        16\n\n/* Transited encoding types */\n#define    KRB5_DOMAIN_X500_COMPRESS    1\n\n/* alternate authentication types */\n#define    KRB5_ALTAUTH_ATT_CHALLENGE_RESPONSE    64\n\n/* authorization data types */\n#define KRB5_AUTHDATA_IF_RELEVANT   1\n#define KRB5_AUTHDATA_KDC_ISSUED    4\n#define KRB5_AUTHDATA_AND_OR        5\n#define KRB5_AUTHDATA_MANDATORY_FOR_KDC    8\n#define KRB5_AUTHDATA_INITIAL_VERIFIED_CAS    9\n#define    KRB5_AUTHDATA_OSF_DCE    64\n#define KRB5_AUTHDATA_SESAME    65\n\n/* password change constants */\n\n#define KRB5_KPASSWD_SUCCESS        0\n#define KRB5_KPASSWD_MALFORMED        1\n#define KRB5_KPASSWD_HARDERROR        2\n#define KRB5_KPASSWD_AUTHERROR        3\n#define KRB5_KPASSWD_SOFTERROR        4\n/* These are Microsoft's extensions in RFC 3244, and it looks like\n they'll become standardized, possibly with other additions.  */\n#define KRB5_KPASSWD_ACCESSDENIED    5    /* unused */\n#define KRB5_KPASSWD_BAD_VERSION    6\n#define KRB5_KPASSWD_INITIAL_FLAG_NEEDED 7    /* unused */\n\n/*\n * end \"proto.h\"\n */\n\n/* Time set */\ntypedef struct _krb5_ticket_times {\n    krb5_timestamp authtime; /* XXX ? should ktime in KDC_REP == authtime\n                              in ticket? otherwise client can't get this */\n    krb5_timestamp starttime;        /* optional in ticket, if not present,\n                                      use authtime */\n    krb5_timestamp endtime;\n    krb5_timestamp renew_till;\n} krb5_ticket_times;\n\n/* structure for auth data */\ntypedef struct _krb5_authdata {\n    krb5_magic magic;\n    krb5_authdatatype ad_type;\n    unsigned int length;\n    krb5_octet *contents;\n} krb5_authdata;\n\n/* structure for transited encoding */\ntypedef struct _krb5_transited {\n    krb5_magic magic;\n    krb5_octet tr_type;\n    krb5_data tr_contents;\n} krb5_transited;\n\ntypedef struct _krb5_enc_tkt_part {\n    krb5_magic magic;\n    /* to-be-encrypted portion */\n    krb5_flags flags;            /* flags */\n    krb5_keyblock *session;        /* session key: includes enctype */\n    krb5_principal client;        /* client name/realm */\n    krb5_transited transited;        /* list of transited realms */\n    krb5_ticket_times times;        /* auth, start, end, renew_till */\n    krb5_address **caddrs;    /* array of ptrs to addresses */\n    krb5_authdata **authorization_data; /* auth data */\n} krb5_enc_tkt_part;\n\ntypedef struct _krb5_ticket {\n    krb5_magic magic;\n    /* cleartext portion */\n    krb5_principal server;        /* server name/realm */\n    krb5_enc_data enc_part;        /* encryption type, kvno, encrypted\n                                    encoding */\n    krb5_enc_tkt_part *enc_part2;    /* ptr to decrypted version, if\n                                      available */\n} krb5_ticket;\n\n/* the unencrypted version */\ntypedef struct _krb5_authenticator {\n    krb5_magic magic;\n    krb5_principal client;        /* client name/realm */\n    krb5_checksum *checksum;    /* checksum, includes type, optional */\n    krb5_int32 cusec;            /* client usec portion */\n    krb5_timestamp ctime;        /* client sec portion */\n    krb5_keyblock *subkey;        /* true session key, optional */\n    krb5_ui_4 seq_number;        /* sequence #, optional */\n    krb5_authdata **authorization_data; /* New add by Ari, auth data */\n} krb5_authenticator;\n\ntypedef struct _krb5_tkt_authent {\n    krb5_magic magic;\n    krb5_ticket *ticket;\n    krb5_authenticator *authenticator;\n    krb5_flags ap_options;\n} krb5_tkt_authent;\n\n/* credentials:     Ticket, session key, etc. */\ntypedef struct _krb5_creds {\n    krb5_magic magic;\n    krb5_principal client;        /* client's principal identifier */\n    krb5_principal server;        /* server's principal identifier */\n    krb5_keyblock keyblock;        /* session encryption key info */\n    krb5_ticket_times times;        /* lifetime info */\n    krb5_boolean is_skey;        /* true if ticket is encrypted in\n                                  another ticket's skey */\n    krb5_flags ticket_flags;        /* flags in ticket */\n    krb5_address **addresses;    /* addrs in ticket */\n    krb5_data ticket;            /* ticket string itself */\n    krb5_data second_ticket;        /* second ticket, if related to\n                                     ticket (via DUPLICATE-SKEY or\n                                     ENC-TKT-IN-SKEY) */\n    krb5_authdata **authdata;    /* authorization data */\n} krb5_creds;\n\n/* Last request fields */\ntypedef struct _krb5_last_req_entry {\n    krb5_magic magic;\n    krb5_int32 lr_type;\n    krb5_timestamp value;\n} krb5_last_req_entry;\n\n/* pre-authentication data */\ntypedef struct _krb5_pa_data {\n    krb5_magic magic;\n    krb5_preauthtype  pa_type;\n    unsigned int length;\n    krb5_octet *contents;\n} krb5_pa_data;\n\ntypedef struct _krb5_kdc_req {\n    krb5_magic magic;\n    krb5_msgtype msg_type;        /* AS_REQ or TGS_REQ? */\n    krb5_pa_data **padata;    /* e.g. encoded AP_REQ */\n    /* real body */\n    krb5_flags kdc_options;        /* requested options */\n    krb5_principal client;        /* includes realm; optional */\n    krb5_principal server;        /* includes realm (only used if no\n                                   client) */\n    krb5_timestamp from;        /* requested starttime */\n    krb5_timestamp till;        /* requested endtime */\n    krb5_timestamp rtime;        /* (optional) requested renew_till */\n    krb5_int32 nonce;            /* nonce to match request/response */\n    int nktypes;            /* # of ktypes, must be positive */\n    krb5_enctype *ktype;        /* requested enctype(s) */\n    krb5_address **addresses;    /* requested addresses, optional */\n    krb5_enc_data authorization_data;    /* encrypted auth data; OPTIONAL */\n    krb5_authdata **unenc_authdata; /* unencrypted auth data,\n                                     if available */\n    krb5_ticket **second_ticket;/* second ticket array; OPTIONAL */\n} krb5_kdc_req;\n\ntypedef struct _krb5_enc_kdc_rep_part {\n    krb5_magic magic;\n    /* encrypted part: */\n    krb5_msgtype msg_type;        /* krb5 message type */\n    krb5_keyblock *session;        /* session key */\n    krb5_last_req_entry **last_req; /* array of ptrs to entries */\n    krb5_int32 nonce;            /* nonce from request */\n    krb5_timestamp key_exp;        /* expiration date */\n    krb5_flags flags;            /* ticket flags */\n    krb5_ticket_times times;        /* lifetime info */\n    krb5_principal server;        /* server's principal identifier */\n    krb5_address **caddrs;    /* array of ptrs to addresses,\n                               optional */\n} krb5_enc_kdc_rep_part;\n\ntypedef struct _krb5_kdc_rep {\n    krb5_magic magic;\n    /* cleartext part: */\n    krb5_msgtype msg_type;        /* AS_REP or KDC_REP? */\n    krb5_pa_data **padata;    /* preauthentication data from KDC */\n    krb5_principal client;        /* client's principal identifier */\n    krb5_ticket *ticket;        /* ticket */\n    krb5_enc_data enc_part;        /* encryption type, kvno, encrypted\n                                    encoding */\n    krb5_enc_kdc_rep_part *enc_part2;/* unencrypted version, if available */\n} krb5_kdc_rep;\n\n/* error message structure */\ntypedef struct _krb5_error {\n    krb5_magic magic;\n    /* some of these may be meaningless in certain contexts */\n    krb5_timestamp ctime;        /* client sec portion; optional */\n    krb5_int32 cusec;            /* client usec portion; optional */\n    krb5_int32 susec;            /* server usec portion */\n    krb5_timestamp stime;        /* server sec portion */\n    krb5_ui_4 error;            /* error code (protocol error #'s) */\n    krb5_principal client;        /* client's principal identifier;\n                                   optional */\n    krb5_principal server;        /* server's principal identifier */\n    krb5_data text;            /* descriptive text */\n    krb5_data e_data;            /* additional error-describing data */\n} krb5_error;\n\ntypedef struct _krb5_ap_req {\n    krb5_magic magic;\n    krb5_flags ap_options;        /* requested options */\n    krb5_ticket *ticket;        /* ticket */\n    krb5_enc_data authenticator;    /* authenticator (already encrypted) */\n} krb5_ap_req;\n\ntypedef struct _krb5_ap_rep {\n    krb5_magic magic;\n    krb5_enc_data enc_part;\n} krb5_ap_rep;\n\ntypedef struct _krb5_ap_rep_enc_part {\n    krb5_magic magic;\n    krb5_timestamp ctime;        /* client time, seconds portion */\n    krb5_int32 cusec;            /* client time, microseconds portion */\n    krb5_keyblock *subkey;        /* true session key, optional */\n    krb5_ui_4 seq_number;        /* sequence #, optional */\n} krb5_ap_rep_enc_part;\n\ntypedef struct _krb5_response {\n    krb5_magic magic;\n    krb5_octet message_type;\n    krb5_data response;\n    krb5_int32 expected_nonce;    /* The expected nonce for KDC_REP messages */\n    krb5_timestamp request_time;   /* When we made the request */\n} krb5_response;\n\ntypedef struct _krb5_cred_info {\n    krb5_magic magic;\n    krb5_keyblock *session;        /* session key used to encrypt */\n    /* ticket */\n    krb5_principal client;        /* client name/realm, optional */\n    krb5_principal server;        /* server name/realm, optional */\n    krb5_flags flags;            /* ticket flags, optional */\n    krb5_ticket_times times;        /* auth, start, end, renew_till, */\n    /* optional */\n    krb5_address **caddrs;    /* array of ptrs to addresses */\n} krb5_cred_info;\n\ntypedef struct _krb5_cred_enc_part {\n    krb5_magic magic;\n    krb5_int32 nonce;            /* nonce, optional */\n    krb5_timestamp timestamp;        /* client time */\n    krb5_int32 usec;            /* microsecond portion of time */\n    krb5_address *s_address;    /* sender address, optional */\n    krb5_address *r_address;    /* recipient address, optional */\n    krb5_cred_info **ticket_info;\n} krb5_cred_enc_part;\n\ntypedef struct _krb5_cred {\n    krb5_magic magic;\n    krb5_ticket **tickets;    /* tickets */\n    krb5_enc_data enc_part;        /* encrypted part */\n    krb5_cred_enc_part *enc_part2;    /* unencrypted version, if available*/\n} krb5_cred;\n\n/* Sandia password generation structures */\ntypedef struct _passwd_phrase_element {\n    krb5_magic magic;\n    krb5_data *passwd;\n    krb5_data *phrase;\n} passwd_phrase_element;\n\ntypedef struct _krb5_pwd_data {\n    krb5_magic magic;\n    int sequence_count;\n    passwd_phrase_element **element;\n} krb5_pwd_data;\n\n/* these need to be here so the typedefs are available for the prototypes */\n\n/*\n * begin \"safepriv.h\"\n */\n\n#define KRB5_AUTH_CONTEXT_DO_TIME    0x00000001\n#define KRB5_AUTH_CONTEXT_RET_TIME    0x00000002\n#define KRB5_AUTH_CONTEXT_DO_SEQUENCE    0x00000004\n#define KRB5_AUTH_CONTEXT_RET_SEQUENCE    0x00000008\n#define KRB5_AUTH_CONTEXT_PERMIT_ALL    0x00000010\n#define KRB5_AUTH_CONTEXT_USE_SUBKEY    0x00000020\n\ntypedef struct krb5_replay_data {\n    krb5_timestamp    timestamp;\n    krb5_int32        usec;\n    krb5_ui_4        seq;\n} krb5_replay_data;\n\n/* flags for krb5_auth_con_genaddrs() */\n#define KRB5_AUTH_CONTEXT_GENERATE_LOCAL_ADDR        0x00000001\n#define KRB5_AUTH_CONTEXT_GENERATE_REMOTE_ADDR        0x00000002\n#define KRB5_AUTH_CONTEXT_GENERATE_LOCAL_FULL_ADDR    0x00000004\n#define KRB5_AUTH_CONTEXT_GENERATE_REMOTE_FULL_ADDR    0x00000008\n\n/* type of function used as a callback to generate checksum data for\n * mk_req */\n\ntypedef krb5_error_code\n(KRB5_CALLCONV * krb5_mk_req_checksum_func) (krb5_context, krb5_auth_context , void *,\n                                             krb5_data **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * end \"safepriv.h\"\n */\n\n\n/*\n * begin \"ccache.h\"\n */\n\ntypedef    krb5_pointer    krb5_cc_cursor;    /* cursor for sequential lookup */\n\nstruct _krb5_ccache;\ntypedef struct _krb5_ccache *krb5_ccache;\nstruct _krb5_cc_ops;\ntypedef struct _krb5_cc_ops krb5_cc_ops;\n\n/*\n * Cursor for iterating over all ccaches\n */\nstruct _krb5_cccol_cursor;\ntypedef struct _krb5_cccol_cursor *krb5_cccol_cursor;\n\n/* for retrieve_cred */\n#define    KRB5_TC_MATCH_TIMES        0x00000001\n#define    KRB5_TC_MATCH_IS_SKEY        0x00000002\n#define    KRB5_TC_MATCH_FLAGS        0x00000004\n#define    KRB5_TC_MATCH_TIMES_EXACT    0x00000008\n#define    KRB5_TC_MATCH_FLAGS_EXACT    0x00000010\n#define    KRB5_TC_MATCH_AUTHDATA        0x00000020\n#define    KRB5_TC_MATCH_SRV_NAMEONLY    0x00000040\n#define    KRB5_TC_MATCH_2ND_TKT        0x00000080\n#define    KRB5_TC_MATCH_KTYPE        0x00000100\n#define KRB5_TC_SUPPORTED_KTYPES    0x00000200\n\n/* for set_flags and other functions */\n#define KRB5_TC_OPENCLOSE        0x00000001\n#define KRB5_TC_NOTICKET                0x00000002\n\nconst char * KRB5_CALLCONV\nkrb5_cc_get_name (krb5_context context, krb5_ccache cache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_gen_new (krb5_context context, krb5_ccache *cache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_initialize(krb5_context context, krb5_ccache cache,\n                   krb5_principal principal) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_destroy (krb5_context context, krb5_ccache cache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_close (krb5_context context, krb5_ccache cache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_store_cred (krb5_context context, krb5_ccache cache,\n                    krb5_creds *creds) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_retrieve_cred (krb5_context context, krb5_ccache cache,\n                       krb5_flags flags, krb5_creds *mcreds,\n                       krb5_creds *creds) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_get_principal (krb5_context context, krb5_ccache cache,\n                       krb5_principal *principal) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_start_seq_get (krb5_context context, krb5_ccache cache,\n                       krb5_cc_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_next_cred (krb5_context context, krb5_ccache cache,\n                   krb5_cc_cursor *cursor, krb5_creds *creds) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_end_seq_get (krb5_context context, krb5_ccache cache,\n                     krb5_cc_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_remove_cred (krb5_context context, krb5_ccache cache, krb5_flags flags,\n                     krb5_creds *creds) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_set_flags (krb5_context context, krb5_ccache cache, krb5_flags flags) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_get_flags (krb5_context context, krb5_ccache cache, krb5_flags *flags) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nconst char * KRB5_CALLCONV\nkrb5_cc_get_type (krb5_context context, krb5_ccache cache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_move (krb5_context context, krb5_ccache src, krb5_ccache dst) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_last_change_time (\n                          krb5_context context,\n                          krb5_ccache ccache,\n                          krb5_timestamp *change_time) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_lock (krb5_context context, krb5_ccache ccache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_unlock (krb5_context context, krb5_ccache ccache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_cache_match (krb5_context context,\n                     krb5_principal client,\n                     krb5_ccache *id) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_cursor_new(krb5_context context, krb5_cccol_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_cursor_next(\n                       krb5_context context,\n                       krb5_cccol_cursor cursor,\n                       krb5_ccache *ccache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_cursor_free(krb5_context context, krb5_cccol_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_last_change_time(krb5_context context, krb5_timestamp *change_time) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_lock(krb5_context context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cccol_unlock(krb5_context context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_new_unique(\n                   krb5_context context,\n                   const char *type,\n                   const char *hint,\n                   krb5_ccache *id) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * end \"ccache.h\"\n */\n\n/*\n * begin \"rcache.h\"\n */\n\nstruct krb5_rc_st;\ntypedef struct krb5_rc_st *krb5_rcache;\n\n/*\n * end \"rcache.h\"\n */\n\n/*\n * begin \"keytab.h\"\n */\n\n\n/* XXX */\n#define MAX_KEYTAB_NAME_LEN 1100 /* Long enough for MAXPATHLEN + some extra */\n\ntypedef krb5_pointer krb5_kt_cursor;    /* XXX */\n\ntypedef struct krb5_keytab_entry_st {\n    krb5_magic magic;\n    krb5_principal principal;    /* principal of this key */\n    krb5_timestamp timestamp;    /* time entry written to keytable */\n    krb5_kvno vno;        /* key version number */\n    krb5_keyblock key;        /* the secret key */\n} krb5_keytab_entry;\n\nstruct _krb5_kt;\ntypedef struct _krb5_kt *krb5_keytab;\n\nconst char * KRB5_CALLCONV\nkrb5_kt_get_type (krb5_context, krb5_keytab keytab) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_get_name(krb5_context context, krb5_keytab keytab, char *name,\n                 unsigned int namelen) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_close(krb5_context context, krb5_keytab keytab) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_get_entry(krb5_context context, krb5_keytab keytab,\n                  krb5_const_principal principal, krb5_kvno vno,\n                  krb5_enctype enctype, krb5_keytab_entry *entry) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_start_seq_get(krb5_context context, krb5_keytab keytab,\n                      krb5_kt_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_next_entry(krb5_context context, krb5_keytab keytab,\n                   krb5_keytab_entry *entry, krb5_kt_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_kt_end_seq_get(krb5_context context, krb5_keytab keytab,\n                    krb5_kt_cursor *cursor) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * end \"keytab.h\"\n */\n\n/*\n * begin \"func-proto.h\"\n */\n\nkrb5_error_code KRB5_CALLCONV krb5_init_context\n(krb5_context *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_init_secure_context\n(krb5_context *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_context\n(krb5_context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_context\n(krb5_context, krb5_context *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_set_default_tgs_enctypes\n(krb5_context,\n const krb5_enctype *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_get_permitted_enctypes\n(krb5_context, krb5_enctype **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_boolean KRB5_CALLCONV krb5_is_thread_safe(void) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* libkrb.spec */\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_server_decrypt_ticket_keytab\n(krb5_context context,\n const krb5_keytab kt,\n krb5_ticket  *ticket) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV krb5_free_tgt_creds\n(krb5_context,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\"); /* XXX too hard to do with const */\n\n#define    KRB5_GC_USER_USER    1    /* want user-user ticket */\n#define    KRB5_GC_CACHED        2    /* want cached ticket only */\n\nkrb5_error_code KRB5_CALLCONV krb5_get_credentials\n(krb5_context,\n krb5_flags,\n krb5_ccache,\n krb5_creds *,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_credentials_validate\n(krb5_context,\n krb5_flags,\n krb5_ccache,\n krb5_creds *,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_credentials_renew\n(krb5_context,\n krb5_flags,\n krb5_ccache,\n krb5_creds *,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_req\n(krb5_context,\n krb5_auth_context *,\n krb5_flags,\n char *,\n char *,\n krb5_data *,\n krb5_ccache,\n krb5_data * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_req_extended\n(krb5_context,\n krb5_auth_context *,\n krb5_flags,\n krb5_data *,\n krb5_creds *,\n krb5_data * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_rep\n(krb5_context,\n krb5_auth_context,\n krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_rd_rep\n(krb5_context,\n krb5_auth_context,\n const krb5_data *,\n krb5_ap_rep_enc_part **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_error\n(krb5_context,\n const krb5_error *,\n krb5_data * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_rd_error\n(krb5_context,\n const krb5_data *,\n krb5_error ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_rd_safe\n(krb5_context,\n krb5_auth_context,\n const krb5_data *,\n krb5_data *,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_rd_priv\n(krb5_context,\n krb5_auth_context,\n const krb5_data *,\n krb5_data *,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_parse_name\n(krb5_context,\n const char *,\n krb5_principal * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#define KRB5_PRINCIPAL_PARSE_NO_REALM        0x1\n#define KRB5_PRINCIPAL_PARSE_REQUIRE_REALM    0x2\n#define KRB5_PRINCIPAL_PARSE_ENTERPRISE        0x4\nkrb5_error_code KRB5_CALLCONV krb5_parse_name_flags\n(krb5_context,\n const char *,\n int,\n krb5_principal * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_unparse_name\n(krb5_context,\n krb5_const_principal,\n char ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_unparse_name_ext\n(krb5_context,\n krb5_const_principal,\n char **,\n unsigned int *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#define KRB5_PRINCIPAL_UNPARSE_SHORT        0x1\n#define KRB5_PRINCIPAL_UNPARSE_NO_REALM        0x2\n#define KRB5_PRINCIPAL_UNPARSE_DISPLAY        0x4\nkrb5_error_code KRB5_CALLCONV krb5_unparse_name_flags\n(krb5_context,\n krb5_const_principal,\n int,\n char **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_unparse_name_flags_ext\n(krb5_context,\n krb5_const_principal,\n int,\n char **,\n unsigned int *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_set_principal_realm\n(krb5_context, krb5_principal, const char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_boolean KRB5_CALLCONV_WRONG krb5_address_search\n(krb5_context,\n const krb5_address *,\n krb5_address * const *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_address_compare\n(krb5_context,\n const krb5_address *,\n const krb5_address *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nint KRB5_CALLCONV krb5_address_order\n(krb5_context,\n const krb5_address *,\n const krb5_address *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_realm_compare\n(krb5_context,\n krb5_const_principal,\n krb5_const_principal) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_principal_compare\n(krb5_context,\n krb5_const_principal,\n krb5_const_principal) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV  krb5_init_keyblock\n(krb5_context, krb5_enctype enctype,\n size_t length, krb5_keyblock **out) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n/* Initialize a new keyblock and allocate storage\n * for the contents of the key, which will be freed along\n * with the keyblock when krb5_free_keyblock is called.\n * It is legal to pass in a length of 0, in which\n * case contents are left unallocated.\n */\nkrb5_error_code KRB5_CALLCONV krb5_copy_keyblock\n(krb5_context,\n const krb5_keyblock *,\n krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_keyblock_contents\n(krb5_context,\n const krb5_keyblock *,\n krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_creds\n(krb5_context,\n const krb5_creds *,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_data\n(krb5_context,\n const krb5_data *,\n krb5_data **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_principal\n(krb5_context,\n krb5_const_principal,\n krb5_principal *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_addresses\n(krb5_context,\n krb5_address * const *,\n krb5_address ***) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_ticket\n(krb5_context,\n const krb5_ticket *,\n krb5_ticket **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_authdata\n(krb5_context,\n krb5_authdata * const *,\n krb5_authdata ***) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_authenticator\n(krb5_context,\n const krb5_authenticator *,\n krb5_authenticator **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_copy_checksum\n(krb5_context,\n const krb5_checksum *,\n krb5_checksum **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_server_rcache\n(krb5_context,\n const krb5_data *, krb5_rcache *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV_C krb5_build_principal_ext\n(krb5_context, krb5_principal *, unsigned int, const char *, ...) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV_C krb5_build_principal\n(krb5_context, krb5_principal *, unsigned int, const char *, ...)\n#if __GNUC__ >= 4\n__attribute__ ((sentinel))\n#endif\n;\n#if KRB5_DEPRECATED\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_build_principal_va\n(krb5_context,\n krb5_principal, unsigned int, const char *, va_list) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#endif\n\n/* Version of krb5_build_principal_va which allocates krb5_principal_data */\nkrb5_error_code KRB5_CALLCONV krb5_build_principal_alloc_va\n(krb5_context, krb5_principal *, unsigned int, const char *, va_list) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_425_conv_principal\n(krb5_context,\n const char *name,\n const char *instance, const char *realm,\n krb5_principal *princ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_524_conv_principal\n(krb5_context context, krb5_const_principal princ,\n char *name, char *inst, char *realm) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nstruct credentials;\nint KRB5_CALLCONV krb5_524_convert_creds\n(krb5_context context, krb5_creds *v5creds,\n struct credentials *v4creds) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#if KRB5_DEPRECATED\n#define krb524_convert_creds_kdc krb5_524_convert_creds\n#define krb524_init_ets(x) (0)\n#endif\n\n/* libkt.spec */\nkrb5_error_code KRB5_CALLCONV krb5_kt_resolve\n(krb5_context,\n const char *,\n krb5_keytab * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_kt_default_name\n(krb5_context,\n char *,\n int ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_kt_default\n(krb5_context,\n krb5_keytab * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_free_keytab_entry_contents\n(krb5_context,\n krb5_keytab_entry * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n/* remove and add are functions, so that they can return NOWRITE\n if not a writable keytab */\nkrb5_error_code KRB5_CALLCONV krb5_kt_remove_entry\n(krb5_context,\n krb5_keytab,\n krb5_keytab_entry * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_kt_add_entry\n(krb5_context,\n krb5_keytab,\n krb5_keytab_entry * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV_WRONG krb5_principal2salt\n(krb5_context,\n krb5_const_principal, krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n/* librc.spec--see rcache.h */\n\n/* libcc.spec */\nkrb5_error_code KRB5_CALLCONV krb5_cc_resolve\n(krb5_context,\n const char *,\n krb5_ccache * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nconst char * KRB5_CALLCONV krb5_cc_default_name\n(krb5_context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_cc_set_default_name\n(krb5_context, const char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_cc_default\n(krb5_context,\n krb5_ccache *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_cc_copy_creds\n(krb5_context context,\n krb5_ccache incc,\n krb5_ccache outcc) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_get_config(krb5_context, krb5_ccache,\n                   krb5_const_principal,\n                   const char *, krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_cc_set_config(krb5_context, krb5_ccache,\n                   krb5_const_principal,\n                   const char *, krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_boolean KRB5_CALLCONV\nkrb5_is_config_principal(krb5_context,\n                         krb5_const_principal) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* krb5_free.c */\nvoid KRB5_CALLCONV krb5_free_principal\n(krb5_context, krb5_principal ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_authenticator\n(krb5_context, krb5_authenticator * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_addresses\n(krb5_context, krb5_address ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_authdata\n(krb5_context, krb5_authdata ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_ticket\n(krb5_context, krb5_ticket * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_error\n(krb5_context, krb5_error * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_creds\n(krb5_context, krb5_creds *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_cred_contents\n(krb5_context, krb5_creds *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_checksum\n(krb5_context, krb5_checksum *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_checksum_contents\n(krb5_context, krb5_checksum *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_keyblock\n(krb5_context, krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_keyblock_contents\n(krb5_context, krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_ap_rep_enc_part\n(krb5_context, krb5_ap_rep_enc_part *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_data\n(krb5_context, krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_data_contents\n(krb5_context, krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_unparsed_name\n(krb5_context, char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_cksumtypes\n(krb5_context, krb5_cksumtype *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* From krb5/os but needed but by the outside world */\nkrb5_error_code KRB5_CALLCONV krb5_us_timeofday\n(krb5_context,\n krb5_timestamp *,\n krb5_int32 * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_timeofday\n(krb5_context,\n krb5_timestamp * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n/* get all the addresses of this host */\nkrb5_error_code KRB5_CALLCONV krb5_os_localaddr\n(krb5_context,\n krb5_address ***) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_default_realm\n(krb5_context,\n char ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_set_default_realm\n(krb5_context,\n const char * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV krb5_free_default_realm\n(krb5_context,\n char * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_sname_to_principal\n(krb5_context,\n const char *,\n const char *,\n krb5_int32,\n krb5_principal *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_change_password\n(krb5_context context, krb5_creds *creds, char *newpw,\n int *result_code, krb5_data *result_code_string,\n krb5_data *result_string) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_set_password\n(krb5_context context, krb5_creds *creds, char *newpw, krb5_principal change_password_for,\n int *result_code, krb5_data *result_code_string, krb5_data *result_string) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV\nkrb5_set_password_using_ccache\n(krb5_context context, krb5_ccache ccache, char *newpw, krb5_principal change_password_for,\n int *result_code, krb5_data *result_code_string, krb5_data *result_string) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_profile\n(krb5_context, struct _profile_t * /* profile_t */ *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#if KRB5_DEPRECATED\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_get_in_tkt\n(krb5_context,\n krb5_flags,\n krb5_address * const *,\n krb5_enctype *,\n krb5_preauthtype *,\n krb5_error_code ( * )(krb5_context,\n                       krb5_enctype,\n                       krb5_data *,\n                       krb5_const_pointer,\n                       krb5_keyblock **),\n krb5_const_pointer,\n krb5_error_code ( * )(krb5_context,\n                       const krb5_keyblock *,\n                       krb5_const_pointer,\n                       krb5_kdc_rep * ),\n krb5_const_pointer,\n krb5_creds *,\n krb5_ccache,\n krb5_kdc_rep ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_get_in_tkt_with_password\n(krb5_context,\n krb5_flags,\n krb5_address * const *,\n krb5_enctype *,\n krb5_preauthtype *,\n const char *,\n krb5_ccache,\n krb5_creds *,\n krb5_kdc_rep ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_get_in_tkt_with_skey\n(krb5_context,\n krb5_flags,\n krb5_address * const *,\n krb5_enctype *,\n krb5_preauthtype *,\n const krb5_keyblock *,\n krb5_ccache,\n krb5_creds *,\n krb5_kdc_rep ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_get_in_tkt_with_keytab\n(krb5_context,\n krb5_flags,\n krb5_address * const *,\n krb5_enctype *,\n krb5_preauthtype *,\n krb5_keytab,\n krb5_ccache,\n krb5_creds *,\n krb5_kdc_rep ** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#endif /* KRB5_DEPRECATED */\n\nkrb5_error_code KRB5_CALLCONV krb5_rd_req\n(krb5_context,\n krb5_auth_context *,\n const krb5_data *,\n krb5_const_principal,\n krb5_keytab,\n krb5_flags *,\n krb5_ticket **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_kt_read_service_key\n(krb5_context,\n krb5_pointer,\n krb5_principal,\n krb5_kvno,\n krb5_enctype,\n krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_safe\n(krb5_context,\n krb5_auth_context,\n const krb5_data *,\n krb5_data *,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_mk_priv\n(krb5_context,\n krb5_auth_context,\n const krb5_data *,\n krb5_data *,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_sendauth\n(krb5_context,\n krb5_auth_context *,\n krb5_pointer,\n char *,\n krb5_principal,\n krb5_principal,\n krb5_flags,\n krb5_data *,\n krb5_creds *,\n krb5_ccache,\n krb5_error **,\n krb5_ap_rep_enc_part **,\n krb5_creds **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_recvauth\n(krb5_context,\n krb5_auth_context *,\n krb5_pointer,\n char *,\n krb5_principal,\n krb5_int32,\n krb5_keytab,\n krb5_ticket **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_recvauth_version\n(krb5_context,\n krb5_auth_context *,\n krb5_pointer,\n krb5_principal,\n krb5_int32,\n krb5_keytab,\n krb5_ticket **,\n krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_mk_ncred\n(krb5_context,\n krb5_auth_context,\n krb5_creds **,\n krb5_data **,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_mk_1cred\n(krb5_context,\n krb5_auth_context,\n krb5_creds *,\n krb5_data **,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_rd_cred\n(krb5_context,\n krb5_auth_context,\n krb5_data *,\n krb5_creds ***,\n krb5_replay_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_fwd_tgt_creds\n(krb5_context,\n krb5_auth_context,\n char *,\n krb5_principal,\n krb5_principal,\n krb5_ccache,\n int forwardable,\n krb5_data *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_init\n(krb5_context,\n krb5_auth_context *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_free\n(krb5_context,\n krb5_auth_context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setflags\n(krb5_context,\n krb5_auth_context,\n krb5_int32) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getflags\n(krb5_context,\n krb5_auth_context,\n krb5_int32 *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_auth_con_set_checksum_func (krb5_context, krb5_auth_context,\n                                 krb5_mk_req_checksum_func, void *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_auth_con_get_checksum_func( krb5_context, krb5_auth_context,\n                                krb5_mk_req_checksum_func *, void **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV_WRONG krb5_auth_con_setaddrs\n(krb5_context,\n krb5_auth_context,\n krb5_address *,\n krb5_address *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getaddrs\n(krb5_context,\n krb5_auth_context,\n krb5_address **,\n krb5_address **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setports\n(krb5_context,\n krb5_auth_context,\n krb5_address *,\n krb5_address *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setuseruserkey\n(krb5_context,\n krb5_auth_context,\n krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getkey\n(krb5_context,\n krb5_auth_context,\n krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getsendsubkey(\n                                                          krb5_context, krb5_auth_context, krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getrecvsubkey(\n                                                          krb5_context, krb5_auth_context, krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setsendsubkey(\n                                                          krb5_context, krb5_auth_context, krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setrecvsubkey(\n                                                          krb5_context, krb5_auth_context, krb5_keyblock *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#if KRB5_DEPRECATED\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_auth_con_getlocalsubkey\n(krb5_context,\n krb5_auth_context,\n krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_auth_con_getremotesubkey\n(krb5_context,\n krb5_auth_context,\n krb5_keyblock **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#endif\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getlocalseqnumber\n(krb5_context,\n krb5_auth_context,\n krb5_int32 *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getremoteseqnumber\n(krb5_context,\n krb5_auth_context,\n krb5_int32 *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#if KRB5_DEPRECATED\nKRB5_ATTR_DEPRECATED krb5_error_code KRB5_CALLCONV krb5_auth_con_initivector\n(krb5_context,\n krb5_auth_context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n#endif\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_setrcache\n(krb5_context,\n krb5_auth_context,\n krb5_rcache) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV_WRONG krb5_auth_con_getrcache\n(krb5_context,\n krb5_auth_context,\n krb5_rcache *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_getauthenticator\n(krb5_context,\n krb5_auth_context,\n krb5_authenticator **) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n#define KRB5_REALM_BRANCH_CHAR '.'\n\n/*\n * end \"func-proto.h\"\n */\n\n/*\n * begin stuff from libos.h\n */\n\nkrb5_error_code KRB5_CALLCONV krb5_read_password\n(krb5_context,\n const char *,\n const char *,\n char *,\n unsigned int * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_aname_to_localname\n(krb5_context,\n krb5_const_principal,\n int,\n char * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_host_realm\n(krb5_context,\n const char *,\n char *** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_get_fallback_host_realm\n(krb5_context,\n krb5_data *,\n char *** ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_free_host_realm\n(krb5_context,\n char * const * ) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_boolean KRB5_CALLCONV krb5_kuserok\n(krb5_context,\n krb5_principal, const char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_auth_con_genaddrs\n(krb5_context,\n krb5_auth_context,\n int, int) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_set_real_time\n(krb5_context, krb5_timestamp, krb5_int32) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV krb5_get_time_offsets\n(krb5_context, krb5_timestamp *, krb5_int32 *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* str_conv.c */\nkrb5_error_code KRB5_CALLCONV krb5_string_to_enctype\n(char *, krb5_enctype *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_string_to_salttype\n(char *, krb5_int32 *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_string_to_cksumtype\n(char *, krb5_cksumtype *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_string_to_timestamp\n(char *, krb5_timestamp *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_string_to_deltat\n(char *, krb5_deltat *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_enctype_to_string\n(krb5_enctype, char *, size_t) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_salttype_to_string\n(krb5_int32, char *, size_t) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_cksumtype_to_string\n(krb5_cksumtype, char *, size_t) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_timestamp_to_string\n(krb5_timestamp, char *, size_t) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_timestamp_to_sfstring\n(krb5_timestamp, char *, size_t, char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nkrb5_error_code KRB5_CALLCONV krb5_deltat_to_string\n(krb5_deltat, char *, size_t) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n\n\n/* The name of the Kerberos ticket granting service... and its size */\n#define    KRB5_TGS_NAME        \"krbtgt\"\n#define KRB5_TGS_NAME_SIZE    6\n\n/* flags for recvauth */\n#define KRB5_RECVAUTH_SKIP_VERSION    0x0001\n#define KRB5_RECVAUTH_BADAUTHVERS    0x0002\n/* initial ticket api functions */\n\ntypedef struct _krb5_prompt {\n    char *prompt;\n    int hidden;\n    krb5_data *reply;\n} krb5_prompt;\n\ntypedef krb5_error_code (KRB5_CALLCONV *krb5_prompter_fct)(krb5_context context,\n                                                           void *data,\n                                                           const char *name,\n                                                           const char *banner,\n                                                           int num_prompts,\n                                                           krb5_prompt prompts[]) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_prompter_posix (krb5_context context,\n                     void *data,\n                     const char *name,\n                     const char *banner,\n                     int num_prompts,\n                     krb5_prompt prompts[]) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\ntypedef struct _krb5_get_init_creds_opt {\n    krb5_flags flags;\n    krb5_deltat tkt_life;\n    krb5_deltat renew_life;\n    int forwardable;\n    int proxiable;\n    krb5_enctype *etype_list;\n    int etype_list_length;\n    krb5_address **address_list;\n    krb5_preauthtype *preauth_list;\n    int preauth_list_length;\n    krb5_data *salt;\n} krb5_get_init_creds_opt;\n\n#define KRB5_GET_INIT_CREDS_OPT_TKT_LIFE    0x0001\n#define KRB5_GET_INIT_CREDS_OPT_RENEW_LIFE    0x0002\n#define KRB5_GET_INIT_CREDS_OPT_FORWARDABLE    0x0004\n#define KRB5_GET_INIT_CREDS_OPT_PROXIABLE    0x0008\n#define KRB5_GET_INIT_CREDS_OPT_ETYPE_LIST    0x0010\n#define KRB5_GET_INIT_CREDS_OPT_ADDRESS_LIST    0x0020\n#define KRB5_GET_INIT_CREDS_OPT_PREAUTH_LIST    0x0040\n#define KRB5_GET_INIT_CREDS_OPT_SALT        0x0080\n#define KRB5_GET_INIT_CREDS_OPT_CHG_PWD_PRMPT    0x0100\n#define KRB5_GET_INIT_CREDS_OPT_CANONICALIZE    0x0200\n\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_init_creds_opt_alloc\n(krb5_context context,\n krb5_get_init_creds_opt **opt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_free\n(krb5_context context,\n krb5_get_init_creds_opt *opt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_init\n(krb5_get_init_creds_opt *opt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_tkt_life\n(krb5_get_init_creds_opt *opt,\n krb5_deltat tkt_life) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_renew_life\n(krb5_get_init_creds_opt *opt,\n krb5_deltat renew_life) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_forwardable\n(krb5_get_init_creds_opt *opt,\n int forwardable) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_proxiable\n(krb5_get_init_creds_opt *opt,\n int proxiable) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_canonicalize\n(krb5_get_init_creds_opt *opt,\n int canonicalize) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_etype_list\n(krb5_get_init_creds_opt *opt,\n krb5_enctype *etype_list,\n int etype_list_length) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_address_list\n(krb5_get_init_creds_opt *opt,\n krb5_address **addresses) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_preauth_list\n(krb5_get_init_creds_opt *opt,\n krb5_preauthtype *preauth_list,\n int preauth_list_length) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_salt\n(krb5_get_init_creds_opt *opt,\n krb5_data *salt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_change_password_prompt\n(krb5_get_init_creds_opt *opt,\n int prompt) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* Generic preauth option attribute/value pairs */\ntypedef struct _krb5_gic_opt_pa_data {\n    char *attr;\n    char *value;\n} krb5_gic_opt_pa_data;\n\n/*\n * This function allows the caller to supply options to preauth\n * plugins.  Preauth plugin modules are given a chance to look\n * at each option at the time this function is called in ordre\n * to check the validity of the option.\n * The 'opt' pointer supplied to this function must have been\n * obtained using krb5_get_init_creds_opt_alloc()\n */\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_pa\n(krb5_context context,\n krb5_get_init_creds_opt *opt,\n const char *attr,\n const char *value) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\ntypedef krb5_error_code\n(*krb5_gic_process_last_req)(krb5_context, krb5_last_req_entry **, void *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_init_creds_opt_set_process_last_req(krb5_context,\n                                             krb5_get_init_creds_opt *,\n                                             krb5_gic_process_last_req,\n                                             void *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_init_creds_password\n(krb5_context context,\n krb5_creds *creds,\n krb5_principal client,\n char *password,\n krb5_prompter_fct prompter,\n void *data,\n krb5_deltat start_time,\n char *in_tkt_service,\n krb5_get_init_creds_opt *k5_gic_options) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_init_creds_keytab\n(krb5_context context,\n krb5_creds *creds,\n krb5_principal client,\n krb5_keytab arg_keytab,\n krb5_deltat start_time,\n char *in_tkt_service,\n krb5_get_init_creds_opt *k5_gic_options) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\ntypedef struct _krb5_verify_init_creds_opt {\n    krb5_flags flags;\n    int ap_req_nofail;\n} krb5_verify_init_creds_opt;\n\n#define KRB5_VERIFY_INIT_CREDS_OPT_AP_REQ_NOFAIL    0x0001\n\nvoid KRB5_CALLCONV\nkrb5_verify_init_creds_opt_init\n(krb5_verify_init_creds_opt *k5_vic_options) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV\nkrb5_verify_init_creds_opt_set_ap_req_nofail\n(krb5_verify_init_creds_opt *k5_vic_options,\n int ap_req_nofail) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_verify_init_creds\n(krb5_context context,\n krb5_creds *creds,\n krb5_principal ap_req_server,\n krb5_keytab ap_req_keytab,\n krb5_ccache *ccache,\n krb5_verify_init_creds_opt *k5_vic_options) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_validated_creds\n(krb5_context context,\n krb5_creds *creds,\n krb5_principal client,\n krb5_ccache ccache,\n char *in_tkt_service) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_get_renewed_creds\n(krb5_context context,\n krb5_creds *creds,\n krb5_principal client,\n krb5_ccache ccache,\n char *in_tkt_service) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nkrb5_error_code KRB5_CALLCONV\nkrb5_decode_ticket\n(const krb5_data *code,\n krb5_ticket **rep) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_appdefault_string\n(krb5_context context,\n const char *appname,\n const krb5_data *realm,\n const char *option,\n const char *default_value,\n char ** ret_value) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\nvoid KRB5_CALLCONV\nkrb5_appdefault_boolean\n(krb5_context context,\n const char *appname,\n const krb5_data *realm,\n const char *option,\n int default_value,\n int *ret_value) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/*\n * Prompter enhancements\n */\n\n#define KRB5_PROMPT_TYPE_PASSWORD            0x1\n#define KRB5_PROMPT_TYPE_NEW_PASSWORD        0x2\n#define KRB5_PROMPT_TYPE_NEW_PASSWORD_AGAIN  0x3\n#define KRB5_PROMPT_TYPE_PREAUTH             0x4\n\ntypedef krb5_int32 krb5_prompt_type;\n\nkrb5_prompt_type* KRB5_CALLCONV krb5_get_prompt_types\n(krb5_context context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n/* Error reporting */\nvoid KRB5_CALLCONV_C\nkrb5_set_error_message (krb5_context, krb5_error_code, const char *, ...)\n#if !defined(__cplusplus) && (__GNUC__ > 2)\n__attribute__((__format__(__printf__, 3, 4)))\n#endif\n;\nvoid KRB5_CALLCONV\nkrb5_vset_error_message (krb5_context, krb5_error_code, const char *, va_list)\n#if !defined(__cplusplus) && (__GNUC__ > 2)\n__attribute__((__format__(__printf__, 3, 0)))\n#endif\n;\n/*\n * The behavior of krb5_get_error_message is only defined the first\n * time it is called after a failed call to a krb5 function using the\n * same context, and only when the error code passed in is the same as\n * that returned by the krb5 function.  Future versions may return the\n * same string for the second and following calls.\n *\n * The string returned by this function must be freed using\n * krb5_free_error_message.\n */\nconst char * KRB5_CALLCONV\nkrb5_get_error_message (krb5_context, krb5_error_code) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV\nkrb5_free_error_message (krb5_context, const char *) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\nvoid KRB5_CALLCONV\nkrb5_clear_error_message (krb5_context) KERBEROS_APPLE_DEPRECATED(\"use GSS.framework\");\n\n\n#if TARGET_OS_MAC\n#    pragma pack(pop)\n#endif\n\nKRB5INT_END_DECLS\n\n/* Don't use this!  We're going to phase it out.  It's just here to keep\n applications from breaking right away.  */\n#define krb5_const const\n\n#undef KRB5_ATTR_DEPRECATED\n\n#endif /* KRB5_GENERAL__ */\n/*\n * et-h-krb5_err.h:\n * This file is automatically generated; please do not edit it.\n */\n\n#define KRB5KDC_ERR_NONE                         (-1765328384L)\n#define KRB5KDC_ERR_NAME_EXP                     (-1765328383L)\n#define KRB5KDC_ERR_SERVICE_EXP                  (-1765328382L)\n#define KRB5KDC_ERR_BAD_PVNO                     (-1765328381L)\n#define KRB5KDC_ERR_C_OLD_MAST_KVNO              (-1765328380L)\n#define KRB5KDC_ERR_S_OLD_MAST_KVNO              (-1765328379L)\n#define KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN          (-1765328378L)\n#define KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN          (-1765328377L)\n#define KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE         (-1765328376L)\n#define KRB5KDC_ERR_NULL_KEY                     (-1765328375L)\n#define KRB5KDC_ERR_CANNOT_POSTDATE              (-1765328374L)\n#define KRB5KDC_ERR_NEVER_VALID                  (-1765328373L)\n#define KRB5KDC_ERR_POLICY                       (-1765328372L)\n#define KRB5KDC_ERR_BADOPTION                    (-1765328371L)\n#define KRB5KDC_ERR_ETYPE_NOSUPP                 (-1765328370L)\n#define KRB5KDC_ERR_SUMTYPE_NOSUPP               (-1765328369L)\n#define KRB5KDC_ERR_PADATA_TYPE_NOSUPP           (-1765328368L)\n#define KRB5KDC_ERR_TRTYPE_NOSUPP                (-1765328367L)\n#define KRB5KDC_ERR_CLIENT_REVOKED               (-1765328366L)\n#define KRB5KDC_ERR_SERVICE_REVOKED              (-1765328365L)\n#define KRB5KDC_ERR_TGT_REVOKED                  (-1765328364L)\n#define KRB5KDC_ERR_CLIENT_NOTYET                (-1765328363L)\n#define KRB5KDC_ERR_SERVICE_NOTYET               (-1765328362L)\n#define KRB5KDC_ERR_KEY_EXP                      (-1765328361L)\n#define KRB5KDC_ERR_PREAUTH_FAILED               (-1765328360L)\n#define KRB5KDC_ERR_PREAUTH_REQUIRED             (-1765328359L)\n#define KRB5KDC_ERR_SERVER_NOMATCH               (-1765328358L)\n#define KRB5KDC_ERR_MUST_USE_USER2USER           (-1765328357L)\n#define KRB5KDC_ERR_PATH_NOT_ACCEPTED            (-1765328356L)\n#define KRB5KDC_ERR_SVC_UNAVAILABLE              (-1765328355L)\n#define KRB5PLACEHOLD_30                         (-1765328354L)\n#define KRB5KRB_AP_ERR_BAD_INTEGRITY             (-1765328353L)\n#define KRB5KRB_AP_ERR_TKT_EXPIRED               (-1765328352L)\n#define KRB5KRB_AP_ERR_TKT_NYV                   (-1765328351L)\n#define KRB5KRB_AP_ERR_REPEAT                    (-1765328350L)\n#define KRB5KRB_AP_ERR_NOT_US                    (-1765328349L)\n#define KRB5KRB_AP_ERR_BADMATCH                  (-1765328348L)\n#define KRB5KRB_AP_ERR_SKEW                      (-1765328347L)\n#define KRB5KRB_AP_ERR_BADADDR                   (-1765328346L)\n#define KRB5KRB_AP_ERR_BADVERSION                (-1765328345L)\n#define KRB5KRB_AP_ERR_MSG_TYPE                  (-1765328344L)\n#define KRB5KRB_AP_ERR_MODIFIED                  (-1765328343L)\n#define KRB5KRB_AP_ERR_BADORDER                  (-1765328342L)\n#define KRB5KRB_AP_ERR_ILL_CR_TKT                (-1765328341L)\n#define KRB5KRB_AP_ERR_BADKEYVER                 (-1765328340L)\n#define KRB5KRB_AP_ERR_NOKEY                     (-1765328339L)\n#define KRB5KRB_AP_ERR_MUT_FAIL                  (-1765328338L)\n#define KRB5KRB_AP_ERR_BADDIRECTION              (-1765328337L)\n#define KRB5KRB_AP_ERR_METHOD                    (-1765328336L)\n#define KRB5KRB_AP_ERR_BADSEQ                    (-1765328335L)\n#define KRB5KRB_AP_ERR_INAPP_CKSUM               (-1765328334L)\n#define KRB5KRB_AP_PATH_NOT_ACCEPTED             (-1765328333L)\n#define KRB5KRB_ERR_RESPONSE_TOO_BIG             (-1765328332L)\n#define KRB5PLACEHOLD_53                         (-1765328331L)\n#define KRB5PLACEHOLD_54                         (-1765328330L)\n#define KRB5PLACEHOLD_55                         (-1765328329L)\n#define KRB5PLACEHOLD_56                         (-1765328328L)\n#define KRB5PLACEHOLD_57                         (-1765328327L)\n#define KRB5PLACEHOLD_58                         (-1765328326L)\n#define KRB5PLACEHOLD_59                         (-1765328325L)\n#define KRB5KRB_ERR_GENERIC                      (-1765328324L)\n#define KRB5KRB_ERR_FIELD_TOOLONG                (-1765328323L)\n#define KRB5KDC_ERR_CLIENT_NOT_TRUSTED           (-1765328322L)\n#define KRB5KDC_ERR_KDC_NOT_TRUSTED              (-1765328321L)\n#define KRB5KDC_ERR_INVALID_SIG                  (-1765328320L)\n#define KRB5KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED (-1765328319L)\n#define KRB5KDC_ERR_CERTIFICATE_MISMATCH         (-1765328318L)\n#define KRB5KRB_AP_ERR_NO_TGT                    (-1765328317L)\n#define KRB5KDC_ERR_WRONG_REALM                  (-1765328316L)\n#define KRB5KRB_AP_ERR_USER_TO_USER_REQUIRED     (-1765328315L)\n#define KRB5KDC_ERR_CANT_VERIFY_CERTIFICATE      (-1765328314L)\n#define KRB5KDC_ERR_INVALID_CERTIFICATE          (-1765328313L)\n#define KRB5KDC_ERR_REVOKED_CERTIFICATE          (-1765328312L)\n#define KRB5KDC_ERR_REVOCATION_STATUS_UNKNOWN    (-1765328311L)\n#define KRB5KDC_ERR_REVOCATION_STATUS_UNAVAILABLE (-1765328310L)\n#define KRB5KDC_ERR_CLIENT_NAME_MISMATCH         (-1765328309L)\n#define KRB5KDC_ERR_KDC_NAME_MISMATCH            (-1765328308L)\n#define KRB5KDC_ERR_INCONSISTENT_KEY_PURPOSE     (-1765328307L)\n#define KRB5KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED  (-1765328306L)\n#define KRB5KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED (-1765328305L)\n#define KRB5KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED (-1765328304L)\n#define KRB5KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED (-1765328303L)\n#define KRB5PLACEHOLD_82                         (-1765328302L)\n#define KRB5PLACEHOLD_83                         (-1765328301L)\n#define KRB5PLACEHOLD_84                         (-1765328300L)\n#define KRB5PLACEHOLD_85                         (-1765328299L)\n#define KRB5PLACEHOLD_86                         (-1765328298L)\n#define KRB5PLACEHOLD_87                         (-1765328297L)\n#define KRB5PLACEHOLD_88                         (-1765328296L)\n#define KRB5PLACEHOLD_89                         (-1765328295L)\n#define KRB5PLACEHOLD_90                         (-1765328294L)\n#define KRB5PLACEHOLD_91                         (-1765328293L)\n#define KRB5PLACEHOLD_92                         (-1765328292L)\n#define KRB5PLACEHOLD_93                         (-1765328291L)\n#define KRB5PLACEHOLD_94                         (-1765328290L)\n#define KRB5PLACEHOLD_95                         (-1765328289L)\n#define KRB5PLACEHOLD_96                         (-1765328288L)\n#define KRB5PLACEHOLD_97                         (-1765328287L)\n#define KRB5PLACEHOLD_98                         (-1765328286L)\n#define KRB5PLACEHOLD_99                         (-1765328285L)\n#define KRB5PLACEHOLD_100                        (-1765328284L)\n#define KRB5PLACEHOLD_101                        (-1765328283L)\n#define KRB5PLACEHOLD_102                        (-1765328282L)\n#define KRB5PLACEHOLD_103                        (-1765328281L)\n#define KRB5PLACEHOLD_104                        (-1765328280L)\n#define KRB5PLACEHOLD_105                        (-1765328279L)\n#define KRB5PLACEHOLD_106                        (-1765328278L)\n#define KRB5PLACEHOLD_107                        (-1765328277L)\n#define KRB5PLACEHOLD_108                        (-1765328276L)\n#define KRB5PLACEHOLD_109                        (-1765328275L)\n#define KRB5PLACEHOLD_110                        (-1765328274L)\n#define KRB5PLACEHOLD_111                        (-1765328273L)\n#define KRB5PLACEHOLD_112                        (-1765328272L)\n#define KRB5PLACEHOLD_113                        (-1765328271L)\n#define KRB5PLACEHOLD_114                        (-1765328270L)\n#define KRB5PLACEHOLD_115                        (-1765328269L)\n#define KRB5PLACEHOLD_116                        (-1765328268L)\n#define KRB5PLACEHOLD_117                        (-1765328267L)\n#define KRB5PLACEHOLD_118                        (-1765328266L)\n#define KRB5PLACEHOLD_119                        (-1765328265L)\n#define KRB5PLACEHOLD_120                        (-1765328264L)\n#define KRB5PLACEHOLD_121                        (-1765328263L)\n#define KRB5PLACEHOLD_122                        (-1765328262L)\n#define KRB5PLACEHOLD_123                        (-1765328261L)\n#define KRB5PLACEHOLD_124                        (-1765328260L)\n#define KRB5PLACEHOLD_125                        (-1765328259L)\n#define KRB5PLACEHOLD_126                        (-1765328258L)\n#define KRB5PLACEHOLD_127                        (-1765328257L)\n#define KRB5_ERR_RCSID                           (-1765328256L)\n#define KRB5_LIBOS_BADLOCKFLAG                   (-1765328255L)\n#define KRB5_LIBOS_CANTREADPWD                   (-1765328254L)\n#define KRB5_LIBOS_BADPWDMATCH                   (-1765328253L)\n#define KRB5_LIBOS_PWDINTR                       (-1765328252L)\n#define KRB5_PARSE_ILLCHAR                       (-1765328251L)\n#define KRB5_PARSE_MALFORMED                     (-1765328250L)\n#define KRB5_CONFIG_CANTOPEN                     (-1765328249L)\n#define KRB5_CONFIG_BADFORMAT                    (-1765328248L)\n#define KRB5_CONFIG_NOTENUFSPACE                 (-1765328247L)\n#define KRB5_BADMSGTYPE                          (-1765328246L)\n#define KRB5_CC_BADNAME                          (-1765328245L)\n#define KRB5_CC_UNKNOWN_TYPE                     (-1765328244L)\n#define KRB5_CC_NOTFOUND                         (-1765328243L)\n#define KRB5_CC_END                              (-1765328242L)\n#define KRB5_NO_TKT_SUPPLIED                     (-1765328241L)\n#define KRB5KRB_AP_WRONG_PRINC                   (-1765328240L)\n#define KRB5KRB_AP_ERR_TKT_INVALID               (-1765328239L)\n#define KRB5_PRINC_NOMATCH                       (-1765328238L)\n#define KRB5_KDCREP_MODIFIED                     (-1765328237L)\n#define KRB5_KDCREP_SKEW                         (-1765328236L)\n#define KRB5_IN_TKT_REALM_MISMATCH               (-1765328235L)\n#define KRB5_PROG_ETYPE_NOSUPP                   (-1765328234L)\n#define KRB5_PROG_KEYTYPE_NOSUPP                 (-1765328233L)\n#define KRB5_WRONG_ETYPE                         (-1765328232L)\n#define KRB5_PROG_SUMTYPE_NOSUPP                 (-1765328231L)\n#define KRB5_REALM_UNKNOWN                       (-1765328230L)\n#define KRB5_SERVICE_UNKNOWN                     (-1765328229L)\n#define KRB5_KDC_UNREACH                         (-1765328228L)\n#define KRB5_NO_LOCALNAME                        (-1765328227L)\n#define KRB5_MUTUAL_FAILED                       (-1765328226L)\n#define KRB5_RC_TYPE_EXISTS                      (-1765328225L)\n#define KRB5_RC_MALLOC                           (-1765328224L)\n#define KRB5_RC_TYPE_NOTFOUND                    (-1765328223L)\n#define KRB5_RC_UNKNOWN                          (-1765328222L)\n#define KRB5_RC_REPLAY                           (-1765328221L)\n#define KRB5_RC_IO                               (-1765328220L)\n#define KRB5_RC_NOIO                             (-1765328219L)\n#define KRB5_RC_PARSE                            (-1765328218L)\n#define KRB5_RC_IO_EOF                           (-1765328217L)\n#define KRB5_RC_IO_MALLOC                        (-1765328216L)\n#define KRB5_RC_IO_PERM                          (-1765328215L)\n#define KRB5_RC_IO_IO                            (-1765328214L)\n#define KRB5_RC_IO_UNKNOWN                       (-1765328213L)\n#define KRB5_RC_IO_SPACE                         (-1765328212L)\n#define KRB5_TRANS_CANTOPEN                      (-1765328211L)\n#define KRB5_TRANS_BADFORMAT                     (-1765328210L)\n#define KRB5_LNAME_CANTOPEN                      (-1765328209L)\n#define KRB5_LNAME_NOTRANS                       (-1765328208L)\n#define KRB5_LNAME_BADFORMAT                     (-1765328207L)\n#define KRB5_CRYPTO_INTERNAL                     (-1765328206L)\n#define KRB5_KT_BADNAME                          (-1765328205L)\n#define KRB5_KT_UNKNOWN_TYPE                     (-1765328204L)\n#define KRB5_KT_NOTFOUND                         (-1765328203L)\n#define KRB5_KT_END                              (-1765328202L)\n#define KRB5_KT_NOWRITE                          (-1765328201L)\n#define KRB5_KT_IOERR                            (-1765328200L)\n#define KRB5_NO_TKT_IN_RLM                       (-1765328199L)\n#define KRB5DES_BAD_KEYPAR                       (-1765328198L)\n#define KRB5DES_WEAK_KEY                         (-1765328197L)\n#define KRB5_BAD_ENCTYPE                         (-1765328196L)\n#define KRB5_BAD_KEYSIZE                         (-1765328195L)\n#define KRB5_BAD_MSIZE                           (-1765328194L)\n#define KRB5_CC_TYPE_EXISTS                      (-1765328193L)\n#define KRB5_KT_TYPE_EXISTS                      (-1765328192L)\n#define KRB5_CC_IO                               (-1765328191L)\n#define KRB5_FCC_PERM                            (-1765328190L)\n#define KRB5_FCC_NOFILE                          (-1765328189L)\n#define KRB5_FCC_INTERNAL                        (-1765328188L)\n#define KRB5_CC_WRITE                            (-1765328187L)\n#define KRB5_CC_NOMEM                            (-1765328186L)\n#define KRB5_CC_FORMAT                           (-1765328185L)\n#define KRB5_CC_NOT_KTYPE                        (-1765328184L)\n#define KRB5_INVALID_FLAGS                       (-1765328183L)\n#define KRB5_NO_2ND_TKT                          (-1765328182L)\n#define KRB5_NOCREDS_SUPPLIED                    (-1765328181L)\n#define KRB5_SENDAUTH_BADAUTHVERS                (-1765328180L)\n#define KRB5_SENDAUTH_BADAPPLVERS                (-1765328179L)\n#define KRB5_SENDAUTH_BADRESPONSE                (-1765328178L)\n#define KRB5_SENDAUTH_REJECTED                   (-1765328177L)\n#define KRB5_PREAUTH_BAD_TYPE                    (-1765328176L)\n#define KRB5_PREAUTH_NO_KEY                      (-1765328175L)\n#define KRB5_PREAUTH_FAILED                      (-1765328174L)\n#define KRB5_RCACHE_BADVNO                       (-1765328173L)\n#define KRB5_CCACHE_BADVNO                       (-1765328172L)\n#define KRB5_KEYTAB_BADVNO                       (-1765328171L)\n#define KRB5_PROG_ATYPE_NOSUPP                   (-1765328170L)\n#define KRB5_RC_REQUIRED                         (-1765328169L)\n#define KRB5_ERR_BAD_HOSTNAME                    (-1765328168L)\n#define KRB5_ERR_HOST_REALM_UNKNOWN              (-1765328167L)\n#define KRB5_SNAME_UNSUPP_NAMETYPE               (-1765328166L)\n#define KRB5KRB_AP_ERR_V4_REPLY                  (-1765328165L)\n#define KRB5_REALM_CANT_RESOLVE                  (-1765328164L)\n#define KRB5_TKT_NOT_FORWARDABLE                 (-1765328163L)\n#define KRB5_FWD_BAD_PRINCIPAL                   (-1765328162L)\n#define KRB5_GET_IN_TKT_LOOP                     (-1765328161L)\n#define KRB5_CONFIG_NODEFREALM                   (-1765328160L)\n#define KRB5_SAM_UNSUPPORTED                     (-1765328159L)\n#define KRB5_SAM_INVALID_ETYPE                   (-1765328158L)\n#define KRB5_SAM_NO_CHECKSUM                     (-1765328157L)\n#define KRB5_SAM_BAD_CHECKSUM                    (-1765328156L)\n#define KRB5_KT_NAME_TOOLONG                     (-1765328155L)\n#define KRB5_KT_KVNONOTFOUND                     (-1765328154L)\n#define KRB5_APPL_EXPIRED                        (-1765328153L)\n#define KRB5_LIB_EXPIRED                         (-1765328152L)\n#define KRB5_CHPW_PWDNULL                        (-1765328151L)\n#define KRB5_CHPW_FAIL                           (-1765328150L)\n#define KRB5_KT_FORMAT                           (-1765328149L)\n#define KRB5_NOPERM_ETYPE                        (-1765328148L)\n#define KRB5_CONFIG_ETYPE_NOSUPP                 (-1765328147L)\n#define KRB5_OBSOLETE_FN                         (-1765328146L)\n#define KRB5_EAI_FAIL                            (-1765328145L)\n#define KRB5_EAI_NODATA                          (-1765328144L)\n#define KRB5_EAI_NONAME                          (-1765328143L)\n#define KRB5_EAI_SERVICE                         (-1765328142L)\n#define KRB5_ERR_NUMERIC_REALM                   (-1765328141L)\n#define KRB5_ERR_BAD_S2K_PARAMS                  (-1765328140L)\n#define KRB5_ERR_NO_SERVICE                      (-1765328139L)\n#define KRB5_CC_READONLY                         (-1765328138L)\n#define KRB5_CC_NOSUPP                           (-1765328137L)\n#define KRB5_DELTAT_BADFORMAT                    (-1765328136L)\n#define KRB5_PLUGIN_NO_HANDLE                    (-1765328135L)\n#define KRB5_PLUGIN_OP_NOTSUPP                   (-1765328134L)\n#define ERROR_TABLE_BASE_krb5 (-1765328384L)\n\nextern const struct error_table et_krb5_error_table;\n\n#if !defined(_WIN32)\n/* for compatibility with older versions... */\nextern void initialize_krb5_error_table (void) /*@modifies internalState@*/;\n#else\n#define initialize_krb5_error_table()\n#endif\n\n#if !defined(_WIN32)\n#define init_krb5_err_tbl initialize_krb5_error_table\n#define krb5_err_base ERROR_TABLE_BASE_krb5\n#endif\n/*\n * et-h-kdb5_err.h:\n * This file is automatically generated; please do not edit it.\n */\n\n\n#define KRB5_KDB_RCSID                           (-1780008448L)\n#define KRB5_KDB_INUSE                           (-1780008447L)\n#define KRB5_KDB_UK_SERROR                       (-1780008446L)\n#define KRB5_KDB_UK_RERROR                       (-1780008445L)\n#define KRB5_KDB_UNAUTH                          (-1780008444L)\n#define KRB5_KDB_NOENTRY                         (-1780008443L)\n#define KRB5_KDB_ILL_WILDCARD                    (-1780008442L)\n#define KRB5_KDB_DB_INUSE                        (-1780008441L)\n#define KRB5_KDB_DB_CHANGED                      (-1780008440L)\n#define KRB5_KDB_TRUNCATED_RECORD                (-1780008439L)\n#define KRB5_KDB_RECURSIVELOCK                   (-1780008438L)\n#define KRB5_KDB_NOTLOCKED                       (-1780008437L)\n#define KRB5_KDB_BADLOCKMODE                     (-1780008436L)\n#define KRB5_KDB_DBNOTINITED                     (-1780008435L)\n#define KRB5_KDB_DBINITED                        (-1780008434L)\n#define KRB5_KDB_ILLDIRECTION                    (-1780008433L)\n#define KRB5_KDB_NOMASTERKEY                     (-1780008432L)\n#define KRB5_KDB_BADMASTERKEY                    (-1780008431L)\n#define KRB5_KDB_INVALIDKEYSIZE                  (-1780008430L)\n#define KRB5_KDB_CANTREAD_STORED                 (-1780008429L)\n#define KRB5_KDB_BADSTORED_MKEY                  (-1780008428L)\n#define KRB5_KDB_CANTLOCK_DB                     (-1780008427L)\n#define KRB5_KDB_DB_CORRUPT                      (-1780008426L)\n#define KRB5_KDB_BAD_VERSION                     (-1780008425L)\n#define KRB5_KDB_BAD_SALTTYPE                    (-1780008424L)\n#define KRB5_KDB_BAD_ENCTYPE                     (-1780008423L)\n#define KRB5_KDB_BAD_CREATEFLAGS                 (-1780008422L)\n#define KRB5_KDB_NO_PERMITTED_KEY                (-1780008421L)\n#define KRB5_KDB_NO_MATCHING_KEY                 (-1780008420L)\n#define KRB5_KDB_DBTYPE_NOTFOUND                 (-1780008419L)\n#define KRB5_KDB_DBTYPE_NOSUP                    (-1780008418L)\n#define KRB5_KDB_DBTYPE_INIT                     (-1780008417L)\n#define KRB5_KDB_SERVER_INTERNAL_ERR             (-1780008416L)\n#define KRB5_KDB_ACCESS_ERROR                    (-1780008415L)\n#define KRB5_KDB_INTERNAL_ERROR                  (-1780008414L)\n#define KRB5_KDB_CONSTRAINT_VIOLATION            (-1780008413L)\n#define KRB5_LOG_CONV                            (-1780008412L)\n#define KRB5_LOG_UNSTABLE                        (-1780008411L)\n#define KRB5_LOG_CORRUPT                         (-1780008410L)\n#define KRB5_LOG_ERROR                           (-1780008409L)\n#define ERROR_TABLE_BASE_kdb5 (-1780008448L)\n\nextern const struct error_table et_kdb5_error_table;\n\n#if !defined(_WIN32)\n/* for compatibility with older versions... */\nextern void initialize_kdb5_error_table (void) /*@modifies internalState@*/;\n#else\n#define initialize_kdb5_error_table()\n#endif\n\n#if !defined(_WIN32)\n#define init_kdb5_err_tbl initialize_kdb5_error_table\n#define kdb5_err_base ERROR_TABLE_BASE_kdb5\n#endif\n/*\n * et-h-kv5m_err.h:\n * This file is automatically generated; please do not edit it.\n */\n\n//#include <com_err.h>\n\n#define KV5M_NONE                                (-1760647424L)\n#define KV5M_PRINCIPAL                           (-1760647423L)\n#define KV5M_DATA                                (-1760647422L)\n#define KV5M_KEYBLOCK                            (-1760647421L)\n#define KV5M_CHECKSUM                            (-1760647420L)\n#define KV5M_ENCRYPT_BLOCK                       (-1760647419L)\n#define KV5M_ENC_DATA                            (-1760647418L)\n#define KV5M_CRYPTOSYSTEM_ENTRY                  (-1760647417L)\n#define KV5M_CS_TABLE_ENTRY                      (-1760647416L)\n#define KV5M_CHECKSUM_ENTRY                      (-1760647415L)\n#define KV5M_AUTHDATA                            (-1760647414L)\n#define KV5M_TRANSITED                           (-1760647413L)\n#define KV5M_ENC_TKT_PART                        (-1760647412L)\n#define KV5M_TICKET                              (-1760647411L)\n#define KV5M_AUTHENTICATOR                       (-1760647410L)\n#define KV5M_TKT_AUTHENT                         (-1760647409L)\n#define KV5M_CREDS                               (-1760647408L)\n#define KV5M_LAST_REQ_ENTRY                      (-1760647407L)\n#define KV5M_PA_DATA                             (-1760647406L)\n#define KV5M_KDC_REQ                             (-1760647405L)\n#define KV5M_ENC_KDC_REP_PART                    (-1760647404L)\n#define KV5M_KDC_REP                             (-1760647403L)\n#define KV5M_ERROR                               (-1760647402L)\n#define KV5M_AP_REQ                              (-1760647401L)\n#define KV5M_AP_REP                              (-1760647400L)\n#define KV5M_AP_REP_ENC_PART                     (-1760647399L)\n#define KV5M_RESPONSE                            (-1760647398L)\n#define KV5M_SAFE                                (-1760647397L)\n#define KV5M_PRIV                                (-1760647396L)\n#define KV5M_PRIV_ENC_PART                       (-1760647395L)\n#define KV5M_CRED                                (-1760647394L)\n#define KV5M_CRED_INFO                           (-1760647393L)\n#define KV5M_CRED_ENC_PART                       (-1760647392L)\n#define KV5M_PWD_DATA                            (-1760647391L)\n#define KV5M_ADDRESS                             (-1760647390L)\n#define KV5M_KEYTAB_ENTRY                        (-1760647389L)\n#define KV5M_CONTEXT                             (-1760647388L)\n#define KV5M_OS_CONTEXT                          (-1760647387L)\n#define KV5M_ALT_METHOD                          (-1760647386L)\n#define KV5M_ETYPE_INFO_ENTRY                    (-1760647385L)\n#define KV5M_DB_CONTEXT                          (-1760647384L)\n#define KV5M_AUTH_CONTEXT                        (-1760647383L)\n#define KV5M_KEYTAB                              (-1760647382L)\n#define KV5M_RCACHE                              (-1760647381L)\n#define KV5M_CCACHE                              (-1760647380L)\n#define KV5M_PREAUTH_OPS                         (-1760647379L)\n#define KV5M_SAM_CHALLENGE                       (-1760647378L)\n#define KV5M_SAM_CHALLENGE_2                     (-1760647377L)\n#define KV5M_SAM_KEY                             (-1760647376L)\n#define KV5M_ENC_SAM_RESPONSE_ENC                (-1760647375L)\n#define KV5M_ENC_SAM_RESPONSE_ENC_2              (-1760647374L)\n#define KV5M_SAM_RESPONSE                        (-1760647373L)\n#define KV5M_SAM_RESPONSE_2                      (-1760647372L)\n#define KV5M_PREDICTED_SAM_RESPONSE              (-1760647371L)\n#define KV5M_PASSWD_PHRASE_ELEMENT               (-1760647370L)\n#define KV5M_GSS_OID                             (-1760647369L)\n#define KV5M_GSS_QUEUE                           (-1760647368L)\n#define ERROR_TABLE_BASE_kv5m (-1760647424L)\n\nextern const struct error_table et_kv5m_error_table;\n\n#if !defined(_WIN32)\n/* for compatibility with older versions... */\nextern void initialize_kv5m_error_table (void) /*@modifies internalState@*/;\n#else\n#define initialize_kv5m_error_table()\n#endif\n\n#if !defined(_WIN32)\n#define init_kv5m_err_tbl initialize_kv5m_error_table\n#define kv5m_err_base ERROR_TABLE_BASE_kv5m\n#endif\n/*\n * et-h-krb524_err.h:\n * This file is automatically generated; please do not edit it.\n */\n\n//#include <com_err.h>\n\n#define KRB524_BADKEY                            (-1750206208L)\n#define KRB524_BADADDR                           (-1750206207L)\n#define KRB524_BADPRINC                          (-1750206206L)\n#define KRB524_BADREALM                          (-1750206205L)\n#define KRB524_V4ERR                             (-1750206204L)\n#define KRB524_ENCFULL                           (-1750206203L)\n#define KRB524_DECEMPTY                          (-1750206202L)\n#define KRB524_NOTRESP                           (-1750206201L)\n#define KRB524_KRB4_DISABLED                     (-1750206200L)\n#define ERROR_TABLE_BASE_k524 (-1750206208L)\n\nextern const struct error_table et_k524_error_table;\n\n#if !defined(_WIN32)\n/* for compatibility with older versions... */\nextern void initialize_k524_error_table (void) /*@modifies internalState@*/;\n#else\n#define initialize_k524_error_table()\n#endif\n\n#if !defined(_WIN32)\n#define init_k524_err_tbl initialize_k524_error_table\n#define k524_err_base ERROR_TABLE_BASE_k524\n#endif\n/*\n * et-h-asn1_err.h:\n * This file is automatically generated; please do not edit it.\n */\n\n//#include <com_err.h>\n\n#define ASN1_BAD_TIMEFORMAT                      (1859794432L)\n#define ASN1_MISSING_FIELD                       (1859794433L)\n#define ASN1_MISPLACED_FIELD                     (1859794434L)\n#define ASN1_TYPE_MISMATCH                       (1859794435L)\n#define ASN1_OVERFLOW                            (1859794436L)\n#define ASN1_OVERRUN                             (1859794437L)\n#define ASN1_BAD_ID                              (1859794438L)\n#define ASN1_BAD_LENGTH                          (1859794439L)\n#define ASN1_BAD_FORMAT                          (1859794440L)\n#define ASN1_PARSE_ERROR                         (1859794441L)\n#define ASN1_BAD_GMTIME                          (1859794442L)\n#define ASN1_MISMATCH_INDEF                      (1859794443L)\n#define ASN1_MISSING_EOC                         (1859794444L)\n#define ERROR_TABLE_BASE_asn1 (1859794432L)\n\nextern const struct error_table et_asn1_error_table;\n\n#if !defined(_WIN32)\n/* for compatibility with older versions... */\nextern void initialize_asn1_error_table (void) /*@modifies internalState@*/;\n#else\n#define initialize_asn1_error_table()\n#endif\n\n#if !defined(_WIN32)\n#define init_asn1_err_tbl initialize_asn1_error_table\n#define asn1_err_base ERROR_TABLE_BASE_asn1\n#endif\n#endif /* KRB5_KRB5_H_INCLUDED */\n\n#endif /* __KERBEROS5__ */\n\n\n"
  },
  {
    "path": "push_to_test.sh",
    "content": "\t#!/bin/bash +x \n\nset -x\nSECURITY_PLUGIN_PATH=\"/Library/Security/SecurityAgentPlugins/XCredsLoginPlugin.bundle\"\n\nif [ \"${1}\" ]; then\nREMOTE_MAC=$1\nelse \nREMOTE_MAC=\"test.local\"\nfi\necho running ssh\nssh \"root@${REMOTE_MAC}\" rm -rf  \"${SECURITY_PLUGIN_PATH}\"\n\necho copying files\nscp -r \"${BUILD_ROOT}/Release/XCredsLoginPlugin.bundle\" \"root@${REMOTE_MAC}\":\"${SECURITY_PLUGIN_PATH}\" \n\nssh \"root@${REMOTE_MAC}\" killall -9 SecurityAgent\n\nexit 0\n"
  },
  {
    "path": "release-notes.md",
    "content": "## tag-5.8(9058) (2025-12-09)\n\n*  added error message for fv not skipped [View](https://github.com/twocanoes/xcreds/commit/e99aae77f256b73568ab63b1feb6d96d366efcbb)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/d14cba7ebf125d81b9bac2af5ab39079fb8a3622)\n\n\n## tag-5.8(9057) (2025-12-09)\n\n*  added error message for fv not skipped [View](https://github.com/twocanoes/xcreds/commit/375954f4e6cf797f1aa88b7bff6d6edd232138e2)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/ca7e7a9d6e2eeec84500e60d689078b487559602)\n\n\n## tag-5.8(9056) (2025-12-09)\n\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/c33928f67341be20344c0f9de3feb2405932548a)\n\n\n## tag-5.8(9055) (2025-12-09)\n\n*  fixed refactor issue [View](https://github.com/twocanoes/xcreds/commit/acaf8e24cbc7408f157cc7650690ae213d3145a0)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/b41547b22ff2505430be4ebecd88c0c89fac1284)\n\n\n## tag-5.8(9054) (2025-12-09)\n\n*  fixed plist [View](https://github.com/twocanoes/xcreds/commit/2b073e43781130a2f3178877826b60a24d35f39e)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/23f97d5f94e34bfd9c28de290bb4ddfb159450a0)\n\n\n## tag-5.8(9053) (2025-12-09)\n\n*  fixed fdesetup [View](https://github.com/twocanoes/xcreds/commit/7e90c73d7cba021073bbf0ad3cff625fac151eb2)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/a11dc2499dfaf5bb293df58f346d44e66d52fa17)\n\n\n## tag-5.8(9052) (2025-12-05)\n\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/b40b50b8c2b10183dc90f5fd5c7f4820dfe12d80)\n\n\n## tag-5.8(9051) (2025-12-05)\n\n*  updated oss tools [View](https://github.com/twocanoes/xcreds/commit/cd58a599764a11604a90bff11a1ea27ab0a6c399)\n*  fixed refresh token when not LDAP or ROPG [View](https://github.com/twocanoes/xcreds/commit/0c9baba20c3c17f4f23dc9a813d52190d01fb30b)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/faf6edc93eecf31555e61ae00bbe37bb3ef641ac)\n\n\n## tag-5.8(9050) (2025-11-24)\n\n*  added password check with google ldap [View](https://github.com/twocanoes/xcreds/commit/5d8e9c480dc43d563c4ce03e526028fdad671e5b)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/57b17e5a8323b2dc28110a9f74ba4f75c3c9ec26)\n\n\n## tag-5.7(9047) (2025-11-17)\n\n*  fixed term status of fdesetup [View](https://github.com/twocanoes/xcreds/commit/4710a271b6a1ccae6a985a3101c91284b5f3f22c)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/ab11496bf65746b085b0e13f61e5f576c580fe94)\n\n\n## tag-5.7(9046) (2025-11-17)\n\n*  removed auth fv failure message [View](https://github.com/twocanoes/xcreds/commit/8e9814eac13c2426493f9323a1e4579adab82d56)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/d75b420bf640599f901d65149d8f4c9d2eb0594e)\n\n\n## tag-5.7(9045) (2025-11-17)\n\n*  fixed issue where auth fv is always true [View](https://github.com/twocanoes/xcreds/commit/26734d5b93ec1b87d109b25400f34f9c12bed965)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/bdedf07891bf775b21cbae674addb1a89ee5e9ed)\n\n\n## tag-5.7(9044) (2025-11-17)\n\n*  check for securetoken user [View](https://github.com/twocanoes/xcreds/commit/e03e7c88d07c85e90350a7ba522213567f9021f2)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/c93b6f2011681b48f7b83c55bd77d2fa8e121820)\n\n\n## tag-5.7(9043) (2025-11-13)\n\n*  updated trusted apps [View](https://github.com/twocanoes/xcreds/commit/27acbfdbbac014e725e466997826f0821b712dee)\n*  updated tools [View](https://github.com/twocanoes/xcreds/commit/57b813f1b8cc079b94c24a7a36674910be90cc39)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/6f048ccee6a0dd4e44b31485cc96784fb9760bbe)\n\n\n## tag-5.7(9042) (2025-11-13)\n\n*  updated trusted apps [View](https://github.com/twocanoes/xcreds/commit/91fe95e249b0dc38f6bfbbb3bc3398df4f75e843)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/769f6087894692cc8bc6d29840887755a310c06d)\n\n\n## tag-5.7(9041) (2025-11-12)\n\n*  fixed fv auth [View](https://github.com/twocanoes/xcreds/commit/77efa902d8e7977350a491cef99c47e4b9e4097d)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/f1044dfa67b36391e959492d2fb67af32a20aa11)\n\n\n## tag-5.7(9038) (2025-11-12)\n\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/d80dfc95388af248aca3b945d145451304e752dd)\n\n\n## tag-5.7(9037) (2025-11-12)\n\n*  fixed FV unlock as admin when setup [View](https://github.com/twocanoes/xcreds/commit/a049f13e068e6bf56ea9a19e9f5e14d10581704b)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/f51112000a0340ece11c6f46d6acd3e385ac36b9)\n\n\n## tag-5.7(9036) (2025-11-12)\n\n*  added more logging [View](https://github.com/twocanoes/xcreds/commit/c2dac3ba6d052a7bd215c9bacfa4200ac4c8c4d6)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/f82ca5967e33fc2a94773176365d12ca8ad6fcfa)\n\n\n## tag-5.7(9035) (2025-11-11)\n\n*  added emojis to popover to make it fancy [View](https://github.com/twocanoes/xcreds/commit/de4a4eed7eb22adc0cff953ca4eec1f2b0f6d63b)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/a658da59e4da3704ea1a84cd0861550772c69a81)\n\n\n## tag-5.7(9022) (2025-11-11)\n\n*  added FV login indicator at login window and menu item [View](https://github.com/twocanoes/xcreds/commit/59a56aa533b233ca0cb6f130ebe78a1b5fa55bf5)\n*  added sample profile for fv skip [View](https://github.com/twocanoes/xcreds/commit/4209457d6a6f3b4715955268c87145d6fe59f82e)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/a892668be9e504dba44e9150e469b5beb11d10fa)\n\n\n## tag-5.7(9020) (2025-11-11)\n\n*  fixed issue with copying info to ds [View](https://github.com/twocanoes/xcreds/commit/7f51197c0ee91df24dd5e3ef748959654055f53a)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/38032c9649161e09451b103f6a33243c5e76fbf1)\n\n\n## tag-5.7(9016) (2025-11-10)\n\n*  fixed regression of DS migrate [View](https://github.com/twocanoes/xcreds/commit/5aae0f125c70e46a6f5f193986d16cec94263fbf)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/46098e1e2a7eb6d768c8b7bcb683fcc17489431b)\n\n\n## tag-5.7(9015) (2025-11-05)\n\n*  updated js; fixed ctk shim for tahoe [View](https://github.com/twocanoes/xcreds/commit/036bd7ac69a84d4e855713f40c42a4888574541b)\n*  updated open source tools [View](https://github.com/twocanoes/xcreds/commit/5e0a72ea62f7f3809d3d1cf5fbd8b801d789e84e)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/93e60e1f67c192098b232330d2cb3538ac71b158)\n\n\n## tag-5.7(9014) (2025-11-05)\n\n*  bumped manifest version: Bump manifest version #362 [View](https://github.com/twocanoes/xcreds/commit/f0fb5c810e9cdcc878205a4a235158c231c33de1)\n*  Fix typos for shouldSkipFileVaultLogin and shouldSkipFileVaultLoginAdmin descriptions #361 [View](https://github.com/twocanoes/xcreds/commit/046aa51a5e5160bb2dfd051dbe14510d1e18b6ac)\n*  Cloud password detection can fail if login form has option to show password #358 [View](https://github.com/twocanoes/xcreds/commit/f045b4323e434a0d0aa4aaaf3cc5ba056d85fb45)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/97d5b3c9a6bd0fab0b34b18d3cae3fb71f483629)\n\n\n## tag-5.7(9013) (2025-10-28)\n\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/91a9e47fddef2ece7f1855f727d4f2793f5ab78c)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/284ac6f723e68ec0c633a17c4736d94b4324649a)\n\n\n## tag-5.7(9012) (2025-10-28)\n\n*  reverted trustedapp code due to bad merge [View](https://github.com/twocanoes/xcreds/commit/f219029e817aa1d549bb863c976a207ed039677d)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/8a3284cb46559dac26369eb478254e79b5ec4db5)\n\n\n## tag-5.7(9011) (2025-10-27)\n\n*  reverted js [View](https://github.com/twocanoes/xcreds/commit/b43685451bb787cc0eb5e1f8c2fa93a275dd62ee)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/1dfd3d63618f7c01994e4fe7508d883108d24a52)\n\n\n## tag-5.7(9010) (2025-10-24)\n\n*  added skip FV as admin pref and implemented [View](https://github.com/twocanoes/xcreds/commit/1bff20ee2a9b0f558e876efb3f46dc161026e22e)\n*  added javascript update issue #358: Cloud password detection can fail if login form has option to show password #358 [View](https://github.com/twocanoes/xcreds/commit/9cabc425bab0a833e12c2fb3c770b5ce4edc1160)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/fc5a0376860e95f301ff3e0ae160d54b53132a42)\n\n\n## tag-5.7(9009) (2025-10-24)\n\n*  fixed default value for shouldSkipFileVaultLogin [View](https://github.com/twocanoes/xcreds/commit/47e2282a3255e27d16c7a3010a0b98d6ab5d97b6)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/1b5089b1869ae214a5d1591781d10491c1002aa0)\n\n\n## tag-5.7(9008) (2025-10-11)\n\n*  updated build info [View](https://github.com/twocanoes/xcreds/commit/ee0b960b4f42df74e90347c3b108da903a072445)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/9d353132acbfd0096d369f64b0c5cc96163e842c)\n\n\n## tag-5.7(9007) (2025-10-11)\n\n*  updated build info [View](https://github.com/twocanoes/xcreds/commit/1a32f1c44d84c64cf661858ec7123a0afeb27cf2)\n*  updated build number, manifest and other build files [View](https://github.com/twocanoes/xcreds/commit/9522d01a296ca20a64a833defd2bdf86b5af5038)\n\n\n## tag-5.7(9006) (2025-10-11)\n\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/7b8c10567ffe64291f02a908246821d6fbedbf94)\n*  updated build number [View](https://github.com/twocanoes/xcreds/commit/106843bb816077f5936c99e78ae3e3793d13bd44)\n*  updated build number [View](https://github.com/twocanoes/xcreds/commit/4d81b4c6d5d41686450ce5c16b091e9543c1c198)\n\n\n## tag-5.7(9005) (2025-10-11)\n\n*  changed project name case; minor fix in autofill for nonxcreds user [View](https://github.com/twocanoes/xcreds/commit/302d7efc640e1a37c50d116dbadfe1d5140884df)\n\n\n## tag-5.7(9004) (2025-10-10)\n\n*  remove unused image [View](https://github.com/twocanoes/xcreds/commit/23d5d1597b5e33cf5273cd8c672951145d8b9989)\n*  save password to user keychain for local users [View](https://github.com/twocanoes/xcreds/commit/b352e2e349d62c9e784df3136b237bd938616f02)\n*  bump [View](https://github.com/twocanoes/xcreds/commit/3a28398f8f1adcce2ad7ad5bf02e075b6c45f9bd)\n\n\n## tag-5.7(9003) (2025-10-10)\n\n*  moved filevaultlogin to main app [View](https://github.com/twocanoes/xcreds/commit/1ab0adfac89e3340d3d32adb174edab038d896bc)\n*  bump [View](https://github.com/twocanoes/xcreds/commit/b4ef828176d23cee17777e2119b35d294bce55ea)\n\n\n## tag-5.7(9001) (2025-10-09)\n\n*  fixed build number [View](https://github.com/twocanoes/xcreds/commit/68e5141e5ce00f73dd461a1139d9e1979b3d2c80)\n*  fixed build number [View](https://github.com/twocanoes/xcreds/commit/73f70a0f9cd97aac25992257a39625ed43ed1224)\n\n\n## tag-5.7(30) (2025-10-09)\n\n*  set skip install on new targets [View](https://github.com/twocanoes/xcreds/commit/acd16de3fe0cc8f9a902c281a112423980371d37)\n\n\n## tag-5.7(29) (2025-10-09)\n\n*  fixed ropg prompting issue [View](https://github.com/twocanoes/xcreds/commit/58633f3a0e5716a154fc31c12a26d282c999ad8b)\n*  fixed build number [View](https://github.com/twocanoes/xcreds/commit/fb82b4096acd045a205ab6347f2a2a0879b31d9c)\n\n\n## tag-5.7(8992) (2025-10-08)\n\n*  fixed issue with not prompting and password changing [View](https://github.com/twocanoes/xcreds/commit/a1e5efa2f9b786244f431e5b332b0d1b9384f227)\n\n\n## tag-5.7(8981) (2025-10-07)\n\n*  reorged projecdt [View](https://github.com/twocanoes/xcreds/commit/20dbeded4e35e385def5ad612a2a309bf69c6d21)\n\n\n## tag-5.7(8980) (2025-10-07)\n\n*  bumped to 5.7 [View](https://github.com/twocanoes/xcreds/commit/917a61d740f358edda392085412d923c4f5909e1)\n*  updated cartfile to use binary [View](https://github.com/twocanoes/xcreds/commit/2a9161c914568370d746d3bed0ab4c2c41cc3cb2)\n\n\n## tag-5.6(8979) (2025-10-07)\n\n*  added save to system keychain [View](https://github.com/twocanoes/xcreds/commit/ef40190c5c18394599babbb27264f7228e57a846)\n*  fixed issue setting new password in keychain [View](https://github.com/twocanoes/xcreds/commit/a2f727ac2552c35d4d55315f174b9cc77ff3013d)\n\n\n## tag-5.6(8978) (2025-09-29)\n\n*  reverted issue #355 due to keychain prompting issues; removed logging statement [View](https://github.com/twocanoes/xcreds/commit/76517681f918a0f4e9ae59fd7cf309abc47c9ddd)\n\n\n## tag-5.6(8977) (2025-09-26)\n\n*  fixed dont replace good password #355 [View](https://github.com/twocanoes/xcreds/commit/22494f104e33afb5d294987f14354055c62523ec)\n\n\n## tag-5.6(8976) (2025-09-26)\n\n*  bump [View](https://github.com/twocanoes/xcreds/commit/9bf44ea57ecfcc1dee139ade914e395310ef7fbc)\n\n\n## tag-5.6(8975) (2025-09-26)\n\n*  fixed issue with initial login password prompt [View](https://github.com/twocanoes/xcreds/commit/aa1ee07acb2890218331ddb8d69b87a4ccbe9119)\n*  fixed issue with initial login password prompt [View](https://github.com/twocanoes/xcreds/commit/16396110e09d6f1c1f2a05774effa0a408366952)\n*  fixed issue with initial login password prompt [View](https://github.com/twocanoes/xcreds/commit/9f87cb98981d24cd11cbb66db90194b320d24899)\n*  bump [View](https://github.com/twocanoes/xcreds/commit/366f8c4c1c1cc399f890f9a917a8653ddd5a900d)\n*  bump [View](https://github.com/twocanoes/xcreds/commit/3f18acb5cc5378da2e7379f5949fa8b95d68c3bd)\n\n\n## tag-5.6(8974) (2025-09-26)\n\n*  fixed issue with initial login password prompt [View](https://github.com/twocanoes/xcreds/commit/aa1ee07acb2890218331ddb8d69b87a4ccbe9119)\n\n\n## tag-5.6(8970) (2025-09-26)\n\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/91890600eb68f45222fdf5c55e57c2084defc634)\n\n\n## tag-5.6(8969) (2025-09-26)\n\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/6f1119cbf44bfb4800c5ee5bbbefeedf6d40acce)\n\n\n## tag-5.6(8968) (2025-09-26)\n\n*  updated OIDCLite for better ROPG/Entra support [View](https://github.com/twocanoes/xcreds/commit/dd651e2f776ebfc7a5b2c3f8dfe598f4d1570274)\n\n\n## tag-5.6(8967) (2025-09-26)\n\n*  fixing error checking [View](https://github.com/twocanoes/xcreds/commit/72459545788c73c41dbb4674cf0f5b48175b0e89)\n\n\n## tag-5.6(8966) (2025-09-26)\n\n*  added more error messages [View](https://github.com/twocanoes/xcreds/commit/119277a843f1126855ef68236c398da76c3e8493)\n\n\n## tag-5.6(8965) (2025-09-26)\n\n*  added more error messages [View](https://github.com/twocanoes/xcreds/commit/1067d4ab8d380328f9bdd38d4dfee254c215383e)\n\n\n## tag-5.6(8964) (2025-09-25)\n\n*  updated manifest with max and deprecated [View](https://github.com/twocanoes/xcreds/commit/8ce9ebf3de98fc0bf69ebbd6efd6f1f93045cac1)\n*  resolved issue #355 dont replace good password [View](https://github.com/twocanoes/xcreds/commit/f03a810a964671a012661d094f96a4e2e66d785a)\n*  [Feature Request] Better handling of deployment to FileVault-enabled laptops #354 [View](https://github.com/twocanoes/xcreds/commit/eda1f963313b6d9e0f820e24f44e82fdbc81b426)\n*  Clarify manifest #352 [View](https://github.com/twocanoes/xcreds/commit/b6f367d206bfdc68b027bcdc446a63ba244d5693)\n*  [Feature Request] Add an extra line or two in the UI for resetPasswordDialogTitle #350 [View](https://github.com/twocanoes/xcreds/commit/2446f9936e2b823ee07c348f7a3cb5bf2123afb3)\n\n\n## tag-5.6(8963) (2025-09-23)\n\n*  bumped [View](https://github.com/twocanoes/xcreds/commit/b24eee69e9ebd29cf9b6a32a5b00322aaae9fbc7)\n*  updated profile with fixes when getting ready to submit [View](https://github.com/twocanoes/xcreds/commit/92fd8dfbfdd080e26213888bcdba4bff387ebbc1)\n*  fixed issue with tahoe 26.1 [View](https://github.com/twocanoes/xcreds/commit/4b98046158426b12014d4ec1d791924513d86a97)\n*  cleaned up test code [View](https://github.com/twocanoes/xcreds/commit/17218d01f5cebb033a261aea8ce37599af70ba13)\n*  more cleanup [View](https://github.com/twocanoes/xcreds/commit/c1215216a9e914ad51950429d4ce4b6a4d8dac81)\n\n\n## tag-5.6(8920) (2025-09-11)\n\n*  bumped build to 9000 [View](https://github.com/twocanoes/xcreds/commit/6cabaa338c049d6887d23f466e42bca7d4e4850a)\n\n\n## tag-5.6(8919) (2025-09-11)\n\n*  only show id token in log [View](https://github.com/twocanoes/xcreds/commit/e8d94102eb8663186e1706acc109ef2656a6b48d)\n\n\n## tag-5.6(8918) (2025-09-11)\n\n*  fixed issue with select account in AD [View](https://github.com/twocanoes/xcreds/commit/3e378272a36162c0b35838dce0bcdc0fddad5783)\n\n\n## tag-5.5(8916) (2025-09-11)\n\n*  added logging statement [View](https://github.com/twocanoes/xcreds/commit/f530f1e07f1e6fe70c13b695591851244d7e5e3d)\n*  fixed keychain password reset moving keychain aside issue [View](https://github.com/twocanoes/xcreds/commit/a4d2d6f0dce8820be0b4926371bd915b1e59f6d0)\n*  bumped [View](https://github.com/twocanoes/xcreds/commit/7ea958960354fdf6fc119b39eaf92911f8e18767)\n\n\n## tag-5.5(8915) (2025-09-11)\n\n*  added logging statement [View](https://github.com/twocanoes/xcreds/commit/f530f1e07f1e6fe70c13b695591851244d7e5e3d)\n\n\n## tag-5.5(8914) (2025-09-10)\n\n*  fixed min version [View](https://github.com/twocanoes/xcreds/commit/8a9150af3dc3265b41d054e2cdb63d28fca3ee47)\n\n\n## tag-5.5(8913) (2025-09-10)\n\n*  reverted password js [View](https://github.com/twocanoes/xcreds/commit/87e876a60d6cc29157db2c303fd73ddcbaab7a0e)\n\n\n## tag-5.5(8912) (2025-09-09)\n\n*  updated javascript to get password [View](https://github.com/twocanoes/xcreds/commit/330746ca5ba691cf8c3bd843941ea1b264ab876b)\n\n\n## tag-5.5(8911) (2025-09-09)\n\n*  skipping refresh if typing detected in last 30 seconds [View](https://github.com/twocanoes/xcreds/commit/132b5981ade67143236baadf45310fa50b1ef7a5)\n\n\n## tag-5.5(8910) (2025-09-09)\n\n*  reverted un/pw to last release [View](https://github.com/twocanoes/xcreds/commit/287baf8add86a691a5a64a2a2a3abc30d768922d)\n\n\n## tag-5.5(8902) (2025-09-09)\n\n*  fixed image on un/pw window [View](https://github.com/twocanoes/xcreds/commit/b0dda03afe0bfd78aeee2fcba9a3f70d3a5c9b58)\n\n\n## tag-5.5(8888) (2025-08-29)\n\n*  updated login window appearance [View](https://github.com/twocanoes/xcreds/commit/e4fb55901cc7b0603f3ee919a1cccb7c7ee8d3e2)\n\n\n## tag-5.5(8832) (2025-08-28)\n\n*  fixed regression when login window not showing [View](https://github.com/twocanoes/xcreds/commit/7086af2af4ae81ed062a72eb5f3f25e5432e25b6)\n*  bumped [View](https://github.com/twocanoes/xcreds/commit/fa11aba4723f64fe302b5f05667d0f45568bfd2b)\n\n\n## tag-5.5(8831) (2025-08-28)\n\n*  updated manfest; added refresh after wake [View](https://github.com/twocanoes/xcreds/commit/6a95b84a0961f805471003c95a56d302eab6df8b)\n*  updated versioncheck to use framework [View](https://github.com/twocanoes/xcreds/commit/b2773d2b276e53a50ff70a104628ed4bae7d8263)\n*  changed manifest version [View](https://github.com/twocanoes/xcreds/commit/607aabcc0d53be3239d956c7665d659b209805d3)\n*  bumped [View](https://github.com/twocanoes/xcreds/commit/91c2decb24719eed16904d06ef650bc7aee5658e)\n*  changed build script to check git  earlier [View](https://github.com/twocanoes/xcreds/commit/cf7ef53ec75238ef82ba91d1884285ab63ba3b0c)\n\n\n## tag-5.5(8786) (2025-08-24)\n\n*  cleared up warnings [View](https://github.com/twocanoes/xcreds/commit/26ae43b58002a37e22ae2f2120a0ca2fb835228a)\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/a4f9377255b15782b625de9ea9b9cf865a9a40ac)\n\n\n## tag-5.5(8780) (2025-08-22)\n\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/83234752970d91eddc8389e2588efa06ae4b1c16)\n\n\n## tag-5.5(8779) (2025-08-22)\n\n*  put in pref to reload page [View](https://github.com/twocanoes/xcreds/commit/0f3d2574881ff3c3324abc2732cf97cec9cd774f)\n*  added in more logging [View](https://github.com/twocanoes/xcreds/commit/d841927cc8fcc869f70b6061ac97c36ec595be63)\n*  fixed hanging issue [View](https://github.com/twocanoes/xcreds/commit/1e412b6b855c991e23b9dcbb2cd8ef5f1059f8de)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/b6d81607cf0782c5ce5ba3070fce8b06298fc01b)\n\n\n## tag-5.5(8776) (2025-08-20)\n\n*  wip [View](https://github.com/twocanoes/xcreds/commit/c1efd367be841bfea1d761a34ff7ee4a84925b34)\n*  added license activity and more logging [View](https://github.com/twocanoes/xcreds/commit/81832d95502c09fc3f1e0a90252c8d43640ca7f0)\n\n\n## tag-5.5(8771) (2025-08-13)\n\n*  added new key to skip user setup buddy and code to do just that [View](https://github.com/twocanoes/xcreds/commit/85cc848d248169ed2e98abad34b8cf5380f2d078)\n\n\n## tag-5.5(8769) (2025-08-13)\n\n*  fixed utf8 password encoding for keychain [View](https://github.com/twocanoes/xcreds/commit/1ebdc5b5015e3d2cf37c4e8c8e3d86969a5c95f6)\n\n\n## tag-5.5(8757) (2025-08-12)\n\n*  added check for first login for local user [View](https://github.com/twocanoes/xcreds/commit/f22d82c665a42cae6865311bbdb61220b1217813)\n\n\n## tag-5.5(8742) (2025-08-12)\n\n*  made progress indicator a bar at top [View](https://github.com/twocanoes/xcreds/commit/c2a1f0ee45757dbeb9d0597cf6cec7a2f830dbe5)\n\n\n## tag-5.5(8729) (2025-08-12)\n\n*  wip [View](https://github.com/twocanoes/xcreds/commit/bc286b3a89f014b42dabe36162b8eebc9c9614ed)\n\n\n## tag-5.5(8728) (2025-08-12)\n\n*  more fix for black screen [View](https://github.com/twocanoes/xcreds/commit/fb1da0ac91617eded0e59125fe679a176d6fece9)\n\n\n## tag-5.5(8722) (2025-08-12)\n\n*  fix for black screen [View](https://github.com/twocanoes/xcreds/commit/953502857ad759c21b7ae87e632a5be7ef351354)\n\n\n## tag-5.5(8716) (2025-08-11)\n\n*  wip [View](https://github.com/twocanoes/xcreds/commit/6f843b7e66d95abb7b9289692fa015ce1f330ea3)\n\n\n## tag-5.5(8715) (2025-08-11)\n\n*  wip [View](https://github.com/twocanoes/xcreds/commit/88b2483eb0571564a654da14ec79ecbfc76b81d8)\n*  added dont hide background during first login [View](https://github.com/twocanoes/xcreds/commit/52652451a66afa078d63ce0ca16649b1a347bd29)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/af4fba25331e3b9cc06a1fbcc40762fd68811f3d)\n\n\n## tag-5.5(8710) (2025-06-27)\n\n*  fixed #340: [Feature Request] XCreds should use shouldUpdateKerberosUserPrincipalADDomain \"here\" [View](https://github.com/twocanoes/xcreds/commit/447ad1aabee7acc143fd6d44433c066a5ced11f4)\n\n\n## tag-5.5(8709) (2025-06-08)\n\n*  refactored local oidc first login [View](https://github.com/twocanoes/xcreds/commit/d284da29d764bcbb1c441764a2d9a7482c8c83d0)\n\n\n## tag-5.5(8696) (2025-06-07)\n\n*  fixed window showing briefly when force showing but valid credentials [View](https://github.com/twocanoes/xcreds/commit/017ae28f66ec765dba3988311d5c9662ad0b9ae7)\n\n\n## tag-5.5(8694) (2025-06-07)\n\n*  fixed issue with oidc username and ropg [View](https://github.com/twocanoes/xcreds/commit/41d6bea7e5db91a90dce3417101e0d47762ba7ca)\n\n\n## tag-5.5(8686) (2025-06-07)\n\n*  updated to use oidc_username from prefs if not in DS when checking for token refresh [View](https://github.com/twocanoes/xcreds/commit/f2b7843941f1c7e32dc704a4a7129e50a7e67591)\n\n\n## tag-5.5(8685) (2025-05-27)\n\n*  release notes updated [View](https://github.com/twocanoes/xcreds/commit/e6c3fc85dfc308afbddd0e4a321cc936ef6034f9)\n*  fixed default values on new keys [View](https://github.com/twocanoes/xcreds/commit/5862dc8745f45e82dba2b345cdaa60588a5bb0bc)\n*  fixed type in profile [View](https://github.com/twocanoes/xcreds/commit/b579c67d13373fe8cbf69045071e9272d66a4717)\n*  added new pref for primaryGroupID [View](https://github.com/twocanoes/xcreds/commit/af1fffb58e9a3faf18e3b8dd9cb4618ae7fa4bf8)\n\n\n## tag-5.4(8684) (2025-05-12)\n\n*  shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen does not change background #323 [View](https://github.com/twocanoes/xcreds/commit/3965c4080826b61207746990832eac3219cac04f)\n\n\n## tag-5.4(8683) (2025-05-09)\n\n*  fixed secondary fill [View](https://github.com/twocanoes/xcreds/commit/6dcb759f10fd66407c670d8ad2b579d4a8680ae0)\n\n\n## tag-5.4(8681) (2025-05-09)\n\n*  Clarify AD native password change textbox label #333 [View](https://github.com/twocanoes/xcreds/commit/b73ec3183ff1da878d9c86ab2de308dfe3de6106)\n*  Restore manifest format requirement for passwordChangeURL #332 [View](https://github.com/twocanoes/xcreds/commit/ee516abdcfb2095fa8b391964d6ef9b6253abba1)\n*  shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen does not change background #323 [View](https://github.com/twocanoes/xcreds/commit/8488385fa8b6b82df19835182e3cefb84f8fb0a7)\n*  shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen does not change background #323 [View](https://github.com/twocanoes/xcreds/commit/3847c54fa3ec2b0ebbdd5f00751308a935dd28f6)\n*  Update default background image urls #335 [View](https://github.com/twocanoes/xcreds/commit/7d80f4f8ce31f6683750b864ec16cd7b104bfbfc)\n\n\n## tag-5.4(8653) (2025-05-07)\n\n*  AD user is prompted by menubar app for prior local password #321 [View](https://github.com/twocanoes/xcreds/commit/a6e841536eda9b83057dfaeac58bc94f6f76767a)\n*  passwordChangeURL has error when http not present in url #331 [View](https://github.com/twocanoes/xcreds/commit/6db87c2c5a7b5b486464334e0ed4e251617552a4)\n*  Local Login Window Logo #329 [View](https://github.com/twocanoes/xcreds/commit/68cbec0df62fa9175cfdc41c0a2c473549bdc694)\n*  Update manifest pfm_version #330 [View](https://github.com/twocanoes/xcreds/commit/2b95ecd9959cc39985d4a58ff7cd62032cf55f68)\n*  system info button does not stay open #322 [View](https://github.com/twocanoes/xcreds/commit/8db4c9ad197a9e5924fca2522cfbfce6755338ec)\n*  shouldLoginWindowSecondaryMonitorsBackgroundImageFillScreen does not change background #323 [View](https://github.com/twocanoes/xcreds/commit/b2590373800701f77458ecb55a34d0d4c73176c7)\n*  Alias is not used at UNPW login screen #325 [View](https://github.com/twocanoes/xcreds/commit/eda83890c62d0b5ecf05829513b40934fac1bf3f)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/d984e5bfadd5a6874f10d69e9c3cb110bbd6c17d)\n\n\n## tag-5.4(8642) (2025-05-06)\n\n*  if logo is blank string, then remove logo [View](https://github.com/twocanoes/xcreds/commit/1f27e8a33be254c787f4a23548a80e99d8d0762f)\n*  if logo is blank string, then remove logo. loginWindowLogoPath, that is [View](https://github.com/twocanoes/xcreds/commit/ede08957505033d433d9e1990f6343fc1076b654)\n\n\n## tag-5.4(8640) (2025-05-06)\n\n*  fixed schedule issue where change in kerberos password prompted for local password at next check [View](https://github.com/twocanoes/xcreds/commit/fdb717d1b9a046bd9972c0986c15343bcf84d01b)\n\n\n## tag-5.4(8638) (2025-05-06)\n\n*  fixed crash when changing AD password; made focus on password; fixed main window opening when password changing password fails [View](https://github.com/twocanoes/xcreds/commit/b6dd18a996bb585c5ff22827629fae51b950504e)\n\n\n## tag-5.4(8631) (2025-05-05)\n\n*  fixed small issue where error caused ui to not reset [View](https://github.com/twocanoes/xcreds/commit/36d45a2a989067ab65e40681b2eee829cf5140b5)\n\n\n## tag-5.4(8628) (2025-05-05)\n\n*  fixed password reset for AD [View](https://github.com/twocanoes/xcreds/commit/39c84e7e42b29a7a06cf419f2a6b1780659d372a)\n*  fixed password reset for AD [View](https://github.com/twocanoes/xcreds/commit/5fd09a6bfdba319c30f6cce5b6418d90e107f058)\n\n\n## tag-5.4(8608) (2025-05-04)\n\n*  fixed encoding issue in ropg in oidclite [View](https://github.com/twocanoes/xcreds/commit/31fd85a5da8edf2cf19ef446d6104bf1ef58d863)\n\n\n## tag-5.4(8607) (2025-04-30)\n\n*  added support for array of aud in json [View](https://github.com/twocanoes/xcreds/commit/986c1f79196684f6b4e0dda1ca0c0db5e0caf8c8)\n\n\n## tag-5.4(8605) (2025-04-15)\n\n*  Add \"Reset Password\" option to menu for AD password reset #320 [View](https://github.com/twocanoes/xcreds/commit/cc0096ac31389f7d786e9e1abc8592f80d4064a2)\n\n\n## tag-5.3(8604) (2025-04-13)\n\n*  fixed issue with error message when no network connection [View](https://github.com/twocanoes/xcreds/commit/18dc4493671746723ff49f47383c3904ccbc33f2)\n*  fixed User is asked twice for local password after a reset #319 [View](https://github.com/twocanoes/xcreds/commit/648601535ebcfacb6712a1f2bf5f000bf4ddd88e)\n*  fixed Update manifest default for shouldShowQuitMenu #315 [View](https://github.com/twocanoes/xcreds/commit/292b7a5286bfd5a8926345a73ef4bcde87d5a5d1)\n\n\n## tag-5.3(8579) (2025-04-04)\n\n*  fixed password reset in AD when account is requiring password reset [View](https://github.com/twocanoes/xcreds/commit/42ac2733731c7e5a47e3a1c7237b40b345fed3be)\n\n\n## tag-5.3(8578) (2025-04-04)\n\n*  fixed issue with admin override in AD login [View](https://github.com/twocanoes/xcreds/commit/839fdbc1f165a7a33bd9c6c3eab45799c1e205e4)\n\n\n## tag-5.3(8577) (2025-04-04)\n\n*  fixed issue with WebViewController not showing text from defaults for refreshTitleTextField [View](https://github.com/twocanoes/xcreds/commit/41c48f016e2e6c6eeff7604fd11407fefbc0bdaa)\n\n\n## tag-5.3(8576) (2025-04-03)\n\n*  fixed password setting in keychain when AD password changed [View](https://github.com/twocanoes/xcreds/commit/f9abe96208420aa1cdaffb13fed9da4ced408500)\n\n\n## tag-5.3(8566) (2025-04-03)\n\n*  fixed extra prompt when changing password and not updating local passowrd; slight change of order of menu items [View](https://github.com/twocanoes/xcreds/commit/ecfb9d05245b7c1a2ebbb291cd68d2d435455373)\n\n\n## tag-5.3(8562) (2025-04-01)\n\n*  fixed pixelated refresh button [View](https://github.com/twocanoes/xcreds/commit/d6d53aee3e3e9073bfd6e906b4baed14c57b48da)\n\n\n## tag-5.3(8559) (2025-03-31)\n\n*  added shouldRemoveMenuItemAutoLaunch to remove menu item autolaunch launchagent [View](https://github.com/twocanoes/xcreds/commit/e3469a6ef003fc3e69f3ed9dc106dbb9b79af9b2)\n*  update gitignore [View](https://github.com/twocanoes/xcreds/commit/2dd18baaa183a44b1d01101552e10cc0228d6038)\n*  update gitignore [View](https://github.com/twocanoes/xcreds/commit/581146a9b4dca00102756e36f16fc1ad610ce4fc)\n\n\n## tag-5.3(8558) (2025-03-30)\n\n*  added new pref to update kerberos principal if principal domain is not the same as the addomain. shouldUpdateKerberosUserPrincipalADDomain. [View](https://github.com/twocanoes/xcreds/commit/2d0d90f2f2e155bfd5288ce99cec8582e16e972d)\n*  fixed centering of logo [View](https://github.com/twocanoes/xcreds/commit/3696dca7aedda26bf2f947c5a80b6433b3255a81)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/53739ef047c22cd765aeb242cefa53c12a14f5b2)\n*  logo resizing. now default 128x256 [View](https://github.com/twocanoes/xcreds/commit/9b16f2ad29089c56e768d7e720440f3ffbdafcb5)\n*  made password have focus for local username / password when incorrect password [View](https://github.com/twocanoes/xcreds/commit/0de7ba06169a555f5ff4fbd1bf6cf40655897201)\n*  added version check [View](https://github.com/twocanoes/xcreds/commit/f92ea603c537ac3b14011254c51c51005e35de6f)\n*  fixed crashing issue due to timer show window not on main thread [View](https://github.com/twocanoes/xcreds/commit/f4abf8dcbfbe0d2b6cda9f0ed1e698731fece383)\n*  fixed crash due to main run loop and UI [View](https://github.com/twocanoes/xcreds/commit/94da4dab380e96b056f5a70af53e0b8d445a2311)\n*  added shouldUpdateKerberosUserPrincipalADDomain to manifest [View](https://github.com/twocanoes/xcreds/commit/b19d703db188700e6ec18518f2759520631cc00a)\n*  fixed kerberos message in menu; updated Sign In to open sign in window [View](https://github.com/twocanoes/xcreds/commit/44e8df7f82fd817e0b132796cf06386b87ae1baa)\n*  added sample profile for cloud + AD [View](https://github.com/twocanoes/xcreds/commit/4bba49ebf5f70841b0f0dfec3ab069b8db019809)\n*  updated ropgResponseValue [View](https://github.com/twocanoes/xcreds/commit/e100d0dfe3270e4ce90b60cd9faf5a94e0a41029)\n*  fixed placement of additional menu items and added app icon as default icon in UN/PW window [View](https://github.com/twocanoes/xcreds/commit/4a85b8b805a8c0cd70104294db9ced0851f94cdb)\n*  added sample icon for un/pw to target show it actually shows [View](https://github.com/twocanoes/xcreds/commit/6b61b2e72eccd5353ead43a66213f383ad6a440b)\n*  better updating of screen after refresh and rounded corners [View](https://github.com/twocanoes/xcreds/commit/549dfbd1ba9612cb275225907e99c04b4f17c0a4)\n*  added a bit more spacing to the UN/PW top and bottom [View](https://github.com/twocanoes/xcreds/commit/1a0eb33ae5c262fba3d4df8199d54847132ceadf)\n*  added icon for UN/PW to menu native control login [View](https://github.com/twocanoes/xcreds/commit/31335f46b6521bc65154e606744012187f84ecb6)\n*  localized dates [View](https://github.com/twocanoes/xcreds/commit/fd6ed325fd0405b71eedfa53d11b826a44e077ce)\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/a19a9cb3875f5206eda42866db775e8e6f8d9d95)\n*  refactored locked out account code [View](https://github.com/twocanoes/xcreds/commit/2d1877dafd9b853a31e4037afb406e734769cc9e)\n*  Fix manifest description for shouldUpdateKerberosUserPrincipalADDomain #312 [View](https://github.com/twocanoes/xcreds/commit/c1acde6209f01aba15b95c7fc704150b89298198)\n*  Change default for shouldShowQuitMenu #311 [View](https://github.com/twocanoes/xcreds/commit/684dcae78476d8d99f866eaae7117773c39ae353)\n*  Manifest fixes #310 [View](https://github.com/twocanoes/xcreds/commit/2d4cc560c969738febfda6eec12ba0ae581d93db)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/c743752a30a01a97de3c1c418c2ccb21e01a7f81)\n\n\n## 5.3.8427 (2025-03-24)\n\n*  added kswitch after getting kerb credentials [View](https://github.com/twocanoes/xcreds/commit/4a7b39fdabdbc7132fd80b9dfe98e899beef1367)\n*  moved settings to project level [View](https://github.com/twocanoes/xcreds/commit/feb35883a9bad95300809732e9051913bf2b848e)\n*  added ability to recover from locked account [View](https://github.com/twocanoes/xcreds/commit/f63acb2717da18937ef02f9b417d5e730b4991db)\n*  removed password prompt as root when installing [View](https://github.com/twocanoes/xcreds/commit/60348cec0aac6c9271a9a82a426335205c809451)\n*  Customize Dialog #306 [View](https://github.com/twocanoes/xcreds/commit/7c7c181a2adec01e6512abec5a67aade11685658)\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/93299970d0fcb4174eda069fcb57fdb212830aef)\n*  fixed up manifest for standard descriptions [View](https://github.com/twocanoes/xcreds/commit/9188605c012b0d357b85d3045a3c496b828a17e6)\n*  fixed shadow and login artifacts from background [View](https://github.com/twocanoes/xcreds/commit/94e86beb32ff999629e06eabbb3b276c23c007c1)\n*  Okta sometimes uses only two passwords fields [View](https://github.com/twocanoes/xcreds/commit/ab9bd57c45191b192316fedbf0bbb0eb7d7c5886)\n*  add loginWindowSecondaryMonitorsBackgroundImageURL and friends [View](https://github.com/twocanoes/xcreds/commit/35992456f6d4af37ab55e616ffd8b02d03fb5bec)\n*  fixing updating kerberos password [View](https://github.com/twocanoes/xcreds/commit/a678fa4162b6635ade60fe9b7087d02ece87e836)\n*  redid timers and network check [View](https://github.com/twocanoes/xcreds/commit/3c1f7957edfc6c7add7926c936716932ba9204a0)\n*  integraetd updated OIDC package [View](https://github.com/twocanoes/xcreds/commit/64087a69ca4dc8c2621e5ae03a6f4784d1168c09)\n*  set timestamp for last oidc user in DS to use as reference to not prompt on menu item launch [View](https://github.com/twocanoes/xcreds/commit/dcc7decc8f415b0cbd85e8fef2f615b4db9200b9)\n*  added test to prevent lockout if invalid password [View](https://github.com/twocanoes/xcreds/commit/d06eaa20e3fdcd575ec4183d524b9c3046a647cd)\n*  fixed date parsing because OMG dates [View](https://github.com/twocanoes/xcreds/commit/a8e851e886f87d859154680249afbff0d10c7297)\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/0bdb0985ee3815cbf5f5e7bec78266c4db4a05bd)\n*  changed background color to white from black to make alpha look better [View](https://github.com/twocanoes/xcreds/commit/c798feb61aff207c5db5669f2b2567c32e266a58)\n*  adjusted colors; added autolaunching and keepalive [View](https://github.com/twocanoes/xcreds/commit/8265203df1d5c865dc9e27cf6cafa3eeadf5fd69)\n\n\n## 5.2.8270 (2025-02-04)\n\n*  fixed issue with admin username / password in prefs/override script [View](https://github.com/twocanoes/xcreds/commit/b682714b27b2ab602b9fe463b10398e9551e113f)\n*  fixed issue with detecting network is up [View](https://github.com/twocanoes/xcreds/commit/5a4ce888550faf503b92031f915adb99efd8e3d0)\n*  fixed issue with shouldDetectNetworkToDetermineLoginWindow [View](https://github.com/twocanoes/xcreds/commit/b1d0997d2505f0ea12509e71eafe591191097317)\n*  put files under scm [View](https://github.com/twocanoes/xcreds/commit/0127a523a7b93963b3e63e595d857632d7d851a0)\n*  fixed issue where popover cant be closed [View](https://github.com/twocanoes/xcreds/commit/2f723e87357ccf7e058af698bf4fed636d36b0c7)\n\n\n## 5.2.8251 (2025-01-29)\n\n*  fixed issue with mapping kerberos domain; fixed local admin override in local secure store [View](https://github.com/twocanoes/xcreds/commit/1c14b7732cca9ba73479de78608e5d15cec28815)\n*  show popover on start [View](https://github.com/twocanoes/xcreds/commit/2be2614507b02ceac516b5f5b10c9218f8abe214)\n\n\n## 5.2.8214 (2025-01-27)\n\n*  added rfid [View](https://github.com/twocanoes/xcreds/commit/3dc09cf436901e019c793809827114649882688d)\n*  added rfid [View](https://github.com/twocanoes/xcreds/commit/def4a61c03e67427efc7505fdf4ca6d8927b582f)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/1baa7e0b06e99ddf39bde1729463fdbd9252e95c)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/176bbc4fd7a39a68ce667c9ceb7f9c17d5c245b6)\n*  added user db [View](https://github.com/twocanoes/xcreds/commit/e6d522e58ed381ce6fbf0733058ab283a0810816)\n*  added new mech to read from user db [View](https://github.com/twocanoes/xcreds/commit/d056914e22ba304ce046a0a7f77653c3c224b49f)\n*  cleanup [View](https://github.com/twocanoes/xcreds/commit/150b38b370203e6f80d9009b93a4b1ae6956c4f2)\n*  fixed issue with nsarchive class names [View](https://github.com/twocanoes/xcreds/commit/87720b18808bc8e0b3e14073236d7db859838be5)\n*  implemented rfid user and local admin hints [View](https://github.com/twocanoes/xcreds/commit/f4e487d646c17d1de13d829028869ee4f3342558)\n*  added login with rfid and local admin keychain overide with secure users [View](https://github.com/twocanoes/xcreds/commit/c435e58909f9c40152762a2f82011fd9665d95e9)\n*  added uid and full name to RFID login [View](https://github.com/twocanoes/xcreds/commit/75c495e5826426d5968e1c695e437eb014e4a5d5)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/1749e419ce6fd94d7a68d1ee09b64b1a1e676024)\n*  bumped to 5.2 [View](https://github.com/twocanoes/xcreds/commit/a679ab589677317ac59656d92ac86ca3d4001e16)\n*  added -r to allow registering of CTK extension as root [View](https://github.com/twocanoes/xcreds/commit/90c16ec1e82f2ecae8ff00de72967ce3dc8b1e3b)\n*  updated rfid user passwords and updated network up test code [View](https://github.com/twocanoes/xcreds/commit/5d9cc6ace5e3a049d33614b0f2d00414af289c07)\n*  cleaned up login window switching (mac native to xcreds) [View](https://github.com/twocanoes/xcreds/commit/d2d899cb44c6f2b5ff6bc4feceda89fc4e8b2bd1)\n*  added command line rfid tools [View](https://github.com/twocanoes/xcreds/commit/3fa642be5765ff604c37233ccfde586a1fdc9ba5)\n*  removed debug output [View](https://github.com/twocanoes/xcreds/commit/4a2c2bf0546129edf184c8b190d6d85d2a7cc2bd)\n*  added command line status output [View](https://github.com/twocanoes/xcreds/commit/f1bc9cda39860ac47553b229ce0c99bdd34246aa)\n*  WIP [View](https://github.com/twocanoes/xcreds/commit/d9412e052ac9010da4a41a057d3ab472ccdfacb7)\n*  added subdomain support [View](https://github.com/twocanoes/xcreds/commit/35c207ac1e5f245588748bfa8819e387537e887e)\n*  added sample profile [View](https://github.com/twocanoes/xcreds/commit/5d9ffcf8ac94e72aa00310b6897c6a5400d8c8fd)\n*  cleaned up sample profile [View](https://github.com/twocanoes/xcreds/commit/624c3aa4cd94d6b86be588e1a7cd0ebaff60fc48)\n*  updated build number [View](https://github.com/twocanoes/xcreds/commit/ae1cfbb2e84c104d62b241d556b6248d9d7bd82b)\n*  fixed kerberos ticket for subdomain [View](https://github.com/twocanoes/xcreds/commit/6fd54132170b81e1d9557695e01b8c85757c861f)\n*  added upn mapping and sample profile [View](https://github.com/twocanoes/xcreds/commit/1815d083d6527ac1bc18feaaa819dcd4114afa3b)\n*  added ability to setup card login [View](https://github.com/twocanoes/xcreds/commit/a61f68db298bc99fffff94b1d283d9610d18c1a0)\n*  card login [View](https://github.com/twocanoes/xcreds/commit/0f0dc00cac287bda240890028c9d63f51fdc2f88)\n*  local admin in new security db [View](https://github.com/twocanoes/xcreds/commit/1488e41441e034407735c83ddf96e4febfdb9a08)\n*  issue #287 Add AdditionalADDomains to manifest and issue #290 Checkbox for Offline Authentication needs association with label [View](https://github.com/twocanoes/xcreds/commit/08b0b9c5beb977272fa2851f16c536ca71902f21)\n*  Typo in CLI help description #283 [View](https://github.com/twocanoes/xcreds/commit/4dd27c3366230827fd3665876cc697d7814edf19)\n*  Update manifest with min version info for new keys #284 [View](https://github.com/twocanoes/xcreds/commit/1cd63e4d2a6d782482f609ac7682591758d7c65d)\n*  Add command line option for clear single user #286 [View](https://github.com/twocanoes/xcreds/commit/43c395c11529399fd23d19a2b3623da121d997fd)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/36c851d3b49ffbef432cb5961519fc9bfb6a177d)\n*  Resolve issue with secrets.bin file #285 [View](https://github.com/twocanoes/xcreds/commit/9b8d90b0135f0d0fa2c0966cb74e5a6e9aa73988)\n*  mailto: links in XCreds menu #282 [View](https://github.com/twocanoes/xcreds/commit/934aacf3cdad58882e056bbd777626f1be3603af)\n*  added error message when inserting to wrong reader [View](https://github.com/twocanoes/xcreds/commit/8a13f936c4eda738f689a462b1d5d16e614a4144)\n*  added setting pin fix for rfid card [View](https://github.com/twocanoes/xcreds/commit/e69995fdeb71d0a7ac0f0b3f037c9540f72de31b)\n*  added Auth0 sample profile [View](https://github.com/twocanoes/xcreds/commit/2b3a57ea2140b4720fe3d5de512109e7d95c6eda)\n*  typo fixed [View](https://github.com/twocanoes/xcreds/commit/c793b18f39c86be28cf495856f6718e036def96e)\n*  made provisioning login card dynamic [View](https://github.com/twocanoes/xcreds/commit/603093cf2883a1bc22ab072885213bbaa103a4e4)\n*  Typo in manifest for shouldAllowLoginCardSetup #296 [View](https://github.com/twocanoes/xcreds/commit/23622455bcbd76c5a3d72cc5421f8d5ec62c8d9a)\n*  Typo in description for upnSuffixToDomainMappings #295 [View](https://github.com/twocanoes/xcreds/commit/4341b339eabfa7e93cc4eb0df4a23d25092cfbd2)\n*  Error parsing some csv files for cli user import #293 [View](https://github.com/twocanoes/xcreds/commit/2b6b4aff0d035d62400b0cc5e0461ce26a93ac35)\n*  Typo in description for upnSuffixToDomainMappings #295 [View](https://github.com/twocanoes/xcreds/commit/802c67f68db7a493e072138a9c211f9d640f956a)\n*  Show/hide \"Setup Login Card\" checkbox #292 [View](https://github.com/twocanoes/xcreds/commit/0ff9d544a9915fb96ef4309dcfd562a15b6c2d9e)\n*  added more command line options; added more status update options [View](https://github.com/twocanoes/xcreds/commit/6e8ed3fd474230bd1663144b2bb3332c5220b263)\n*  cleaned up cli output [View](https://github.com/twocanoes/xcreds/commit/1b222e4b36e7000bb2ba0b6f4c4fc89b74ef9b0a)\n*  changed target name [View](https://github.com/twocanoes/xcreds/commit/9280d9e1a3a9d66b68f6a3ad19e0a7c4c5b6f16c)\n*  Fixes for command line output #298 [View](https://github.com/twocanoes/xcreds/commit/49f90c20690a6204bd05e4b427b35cbadc412702)\n*  fixed issue with blank screen with multiple monitors; added background to multiple display setup [View](https://github.com/twocanoes/xcreds/commit/e7995c6b7905e0557106842527d290fea61cee9d)\n\n\n## release-5.1 (2024-10-27)\n\n*  Manifest default for ropgResponseValue needs change #279 [View](https://github.com/twocanoes/xcreds/commit/150d63efb8b8159c41182d1c7278676b0432f39d)\n*  fixed linking issue; fixed artifacts showing during FV passthrough [View](https://github.com/twocanoes/xcreds/commit/7f8d8594c658602f40bd954c142288952f816515)\n*  fixed issue with productlicense framework [View](https://github.com/twocanoes/xcreds/commit/ff69ec573dad335dbd3604bb51e270ab26e49e64)\n*  changed shouldActivateSystemInfoButton to no by default [View](https://github.com/twocanoes/xcreds/commit/d975c6347451108185beac2dfb530cdbbafad3fe)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/193e6b033aed7d4067190359acc5f6a01acad9b6)\n\n\n## 5.1.7250 (2024-10-22)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  Add Okta example profile [View](https://github.com/twocanoes/xcreds/commit/02d1538cc004121ec610f7604e4ad3ac36a2ced9)\n*  Update example profiles for identity provider settings [View](https://github.com/twocanoes/xcreds/commit/90e753b95094ce7004b9afd3f33bc1fab41a0df7)\n*  Add example profile for change app settings [View](https://github.com/twocanoes/xcreds/commit/4d678af8f5bc765a1afeff561b5beb4bbdd668ee)\n*  add encoding for special characters to tokenmanager [View](https://github.com/twocanoes/xcreds/commit/73aa03134cf7287353be41be6f74d0763fd07ad5)\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/eaf319e143d9b6d25270981c7acb0f050506902b)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/d3322b7498584bf9dee1b9120cc25049b724eefe)\n*  updated map for full username [View](https://github.com/twocanoes/xcreds/commit/219fdde8358bf5c9a56fb323d898538a222cb946)\n*  updated release notes [View](https://github.com/twocanoes/xcreds/commit/f5e583d16706ede019ef35ba9d0575bfcefed61e)\n*  updated manifest version [View](https://github.com/twocanoes/xcreds/commit/e665d9312578a3ef37ffee8eeab1356f923eb446)\n*  updated manifest version [View](https://github.com/twocanoes/xcreds/commit/a621ee74c9955018457b56d1ecc6b14e5eca6dbd)\n*  added showing 14 day notice when license expiring; fixed tab navigatin [View](https://github.com/twocanoes/xcreds/commit/bdaaf6ae293f9db5304aded0f5a1c243848e3f81)\n*  bumped version number [View](https://github.com/twocanoes/xcreds/commit/404b4514a4a6d2e4fb78a25f908b2136a6af457c)\n*  added more logging [View](https://github.com/twocanoes/xcreds/commit/e4c539bc2965460d875d33c7d82087b83a2a8dde)\n*  updated sample config profile [View](https://github.com/twocanoes/xcreds/commit/41380808a82fa192f5d5cf4aeceb2f9cc27bb7db)\n*  Provide ability to override status popover with own info #241 [View](https://github.com/twocanoes/xcreds/commit/b8e83b01f362bf80d42716e2bfb48ba04bbd5bec)\n*  Error dialog rendered twice for passwordElementID warning #263; User login restriction dialog rendered twice #262 [View](https://github.com/twocanoes/xcreds/commit/178045607aaf81f0a199c21b820d12ea9fa758d4)\n*  Add key to popup system info by default #273 [View](https://github.com/twocanoes/xcreds/commit/a10cfb0526b9544f545ad65d7a42087c5bc6e355)\n*  added support for Azure ROPG [View](https://github.com/twocanoes/xcreds/commit/a476aaddcf76ae6f429122fd7053d7ed44bbde36)\n*  make autofill registration async [View](https://github.com/twocanoes/xcreds/commit/3372de1f42d211aacbc5caf6fc4ceb5c570a02b7)\n*  added better handling of license issues [View](https://github.com/twocanoes/xcreds/commit/c53b086c335d97a601b4506b047ebf476d7ecafe)\n*  Mouse Disappearing on XCreds Login Screen #272 [View](https://github.com/twocanoes/xcreds/commit/49c7adac7617c5770c4d40e7746406989f596bda)\n*  Mouse Disappearing on XCreds Login Screen #272 [View](https://github.com/twocanoes/xcreds/commit/5c774d41531d6bdb212522a062f798ca53e84492)\n*  Mouse Disappearing on XCreds Login Screen #272 [View](https://github.com/twocanoes/xcreds/commit/ad2d41856f74d31273c97664b8dc1dde8fcb290d)\n*  made shouldActivateSystemInfoButton always keep popover showing [View](https://github.com/twocanoes/xcreds/commit/79df8d50be0ad37df96dcf183c2912ae9dc7945b)\n*  fixed issue in ropgResponseValue value in manifest [View](https://github.com/twocanoes/xcreds/commit/0f42ce305a9bc3d4541b03b32aec0c14a4024a35)\n*  added app min for manifest for ropgResponseValue [View](https://github.com/twocanoes/xcreds/commit/8b82c5ba5121f2872c277e900e6a9e8f3c3e51d1)\n*  removed product license ref [View](https://github.com/twocanoes/xcreds/commit/4f67a19dfa63636a567554c11fc42ee878eadda4)\n*  removed client secret from sample profile [View](https://github.com/twocanoes/xcreds/commit/fc16a3c5b796442c3e259fe4a3bed297ce4e26af)\n\n\n## 5.0.7176 (2024-08-28)\n\n*  fixed issue with green dot [View](https://github.com/twocanoes/xcreds/commit/9bf6d0379105220e2f9de3f435f301c0ac5f81ae)\n*  fixed initial off center of main view at login window [View](https://github.com/twocanoes/xcreds/commit/5c1e3b392b8837ee1595dd01d40ea644782c7533)\n*  added autofill plugin registration in setup script [View](https://github.com/twocanoes/xcreds/commit/c387a5c4f841112c45a65df4a7afb8ca42d72331)\n*  Fix manifest description for settingsOverrideScriptPath #261 [View](https://github.com/twocanoes/xcreds/commit/0961143a8e5ea0a2ab2eaea8188594c36ad88459)\n*  Fix description for allowLoginIfMemberOfGroup #260 [View](https://github.com/twocanoes/xcreds/commit/024a639ad64d13afb47e734419496c2edc075ca0)\n*  fixed autofill [View](https://github.com/twocanoes/xcreds/commit/bb5aa802af0904d153a4ea0a305960aa8af8c1b7)\n*  fixed autofill launching [View](https://github.com/twocanoes/xcreds/commit/1aec12c21b55fbe3b9024cac36a608e03462b196)\n*  5.0.7176 [View](https://github.com/twocanoes/xcreds/commit/1968fdeac3f816661c66d5f362e71544984ffedc)\n\n\n## 5.0.7144 (2024-08-15)\n\n*  migration changed to include admin user [View](https://github.com/twocanoes/xcreds/commit/7fcc359648de23b1f3791b4039f93cdc04eece3b)\n*  allowLoginIfMemberOfGroup causes screen rendering issue after blocking sign in #233 [View](https://github.com/twocanoes/xcreds/commit/ea51cd295018d3b2c777914106567b0560f61afe)\n*  Update login window when resolution changes #187 [View](https://github.com/twocanoes/xcreds/commit/1d787bad242af35c9641785980fd1510afb15a90)\n*  [Feature Request] AD User Account Creation Name Mapping #172 [View](https://github.com/twocanoes/xcreds/commit/01ce07dcf0fce9f293b6503d487f72ef0f72de83)\n*  updated mapping and removed menu bar date [View](https://github.com/twocanoes/xcreds/commit/f2dd672911e16c680079830d907cfe3813b84e89)\n\n\n## 5.0.7130 (2024-08-06)\n\n*  Local login window dims and gets stuck after failed login attempt #242 [View](https://github.com/twocanoes/xcreds/commit/2863934334eeb86af7ef28359d0d1c91494c6de3)\n*  more [View](https://github.com/twocanoes/xcreds/commit/5a0a65001f834780a40dfca224bca6dd12bbc1ee)\n*  Enhancement request: Group Membership Zendesk Ticket 69193 #209 [View](https://github.com/twocanoes/xcreds/commit/25bed7fe823cd769306480868aca1b3eb419fdc1)\n*  added missing files [View](https://github.com/twocanoes/xcreds/commit/f3790316276340cf4c4e70580a8918a6493a230b)\n*  Update login window when resolution changes #187 [View](https://github.com/twocanoes/xcreds/commit/314909800a150e3556d01ded46181fc2167107ef)\n*  Update manifest description for CreateAdminIfGroupMember #251 [View](https://github.com/twocanoes/xcreds/commit/81da5019f98edf50b04a5af7990049b9fc4a7ed3)\n*  XCreds Login Window Overlay Wallpaper not caching? #247 [View](https://github.com/twocanoes/xcreds/commit/a566de45b7bed7107f709b302bbf51759eacc538)\n*  Clarify manifest descriptions for AD property names #245 [View](https://github.com/twocanoes/xcreds/commit/d248361497cc5dc453954cca8b2ba90ad477c67f)\n*  Issue with HomeMountEnabled #236 [View](https://github.com/twocanoes/xcreds/commit/e98fab1e44f012f6806d42d718d1d89106a7c9f9)\n*  Issue with HomeMountEnabled #236 [View](https://github.com/twocanoes/xcreds/commit/b469dc0227068311056001b4755f584585e809fa)\n*  Fail on map_username for AD #244 [View](https://github.com/twocanoes/xcreds/commit/c14a5453fffbf882ce39ad61c7b870dae56f565e)\n*  allowLoginIfMemberOfGroup causes screen rendering issue after blocking sign in #233 [View](https://github.com/twocanoes/xcreds/commit/f66645cb663ef8ccaa18f1d08b78212e0b8e81e8)\n*  add missing files to repo [View](https://github.com/twocanoes/xcreds/commit/e973bdcd827275c7b4369e2f320d9c54e5cd782e)\n*  updated package ref [View](https://github.com/twocanoes/xcreds/commit/42b1452296f468ba052996f895372357a7530f3d)\n*  added build file instructions [View](https://github.com/twocanoes/xcreds/commit/c0910425056906c6c45c5b547247b03d0abe7116)\n*  allowLoginIfMemberOfGroup causes screen rendering issue after blocking sign in #233 [View](https://github.com/twocanoes/xcreds/commit/4f91b5d63e63ad0b6c201fc5ce7ac12b36a1d581)\n*  fixed HideExpiration in manifest [View](https://github.com/twocanoes/xcreds/commit/a59caeb19edabfbfa4942036363bb016af218522)\n*  updated history [View](https://github.com/twocanoes/xcreds/commit/c559c3b74998fab81eb225deaaa6d1b4d743a474)\n\n\n## 5.0.7087 (2024-06-24)\n\n*  Enhancement Request \"Mechanism to force xCreds to reevaluate Login Window Background Image\" #227 [View](https://github.com/twocanoes/xcreds/commit/ad1b403b4deb2d8e0cb52a1e5fc4c595e2897744)\n*  Add LocalFallback to manifest #229 [View](https://github.com/twocanoes/xcreds/commit/390e36a0993d2c51f38dabc223b926b4ecc99037)\n*  Update description for allowLoginIfMemberOfGroup #228 [View](https://github.com/twocanoes/xcreds/commit/d52eb5b22c3674fd060f4d48c988794551115e0f)\n*  Customize menu bar app icon #189 [View](https://github.com/twocanoes/xcreds/commit/7f8ee246d25d714671bcbba1556d11e1ea535a4e)\n*  improved login animation [View](https://github.com/twocanoes/xcreds/commit/77bd03ce4c06b45add40f421c0ba18f8ddb8770a)\n*  Menubar sign in does not follow shouldUseROPGForMenuLogin #184 [View](https://github.com/twocanoes/xcreds/commit/fc111b579ec9a64b5dafdc1a3bb8ef9b6a48df92)\n*  XCreds 5: Unexpected behavior of IP & MAC info via XCReds login window #232 [View](https://github.com/twocanoes/xcreds/commit/36a32958a8c949b1eeb32520081f9dc9444ef100)\n*  Feature Request: HideExpiration key #198 [View](https://github.com/twocanoes/xcreds/commit/94be9ce97b9348230bfbecddfdcbe664a09a24f1)\n*  Allow user to use full name to sign in at XCreds username/password screen #178 [View](https://github.com/twocanoes/xcreds/commit/1f66e9cba9ef73d5fbf566a7a4ae1c435c4b2091)\n*  \"Change Password\" menuitem is now greyed out #239 [View](https://github.com/twocanoes/xcreds/commit/8252c5f9505ea187207a36e1f445e39bdb0a0964)\n*  keyCodeForLoginWindowChange not working as expected #231 [View](https://github.com/twocanoes/xcreds/commit/250955b0bae1d6d10357110628f072b05107f161)\n*  updated history [View](https://github.com/twocanoes/xcreds/commit/d35d876c237bb2a18f1b1e9beeb62d2c3d7ea64c)\n*  Expected AD field values not shown in XCreds log #237 [View](https://github.com/twocanoes/xcreds/commit/498d0f563a1d9d7cfd9991994152b3f3faa04cf6)\n*  updated history [View](https://github.com/twocanoes/xcreds/commit/15233e01b8e56fcd1428681333bf74bbc47f17ea)\n\n\n## 5.0.7066 (2024-06-16)\n\n*  fixed fixed size image [View](https://github.com/twocanoes/xcreds/commit/f1a2e7217811677734ad94c9cf692fb10a262fe2)\n*  fixed issue with google redirect [View](https://github.com/twocanoes/xcreds/commit/e2daed192268a7e41a68b1c65e40526d37647bff)\n*  added credential provider [View](https://github.com/twocanoes/xcreds/commit/0336c04ae5b18598dfba2452a566e63456b08d65)\n*  added missing resources [View](https://github.com/twocanoes/xcreds/commit/503622ce9a6057e8f116c36f9d7f640a10095d55)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/24ddcc3d6c04a515050a4da219c413300d98cfe3)\n*  implemented Feature Request - Change the wording of the password change pop-up #202 [View](https://github.com/twocanoes/xcreds/commit/c5e672199726bf5331f39d88d61e290e17c5c759)\n*  System Info on XCreds Login Window #154 [View](https://github.com/twocanoes/xcreds/commit/af63d9f32f4f19bd37d2887de38c57ca6cc16b33)\n*  updated version to 5 [View](https://github.com/twocanoes/xcreds/commit/b6f73cfb06ea8f4f712ebb11242c00ef6d4b1ce2)\n*  added option for system info button title #154 [View](https://github.com/twocanoes/xcreds/commit/f04ee39d4c813b0cbbafe817b96fc7d4564ac09a)\n*  fixed Fix manifest title for ROPG pref #183 [View](https://github.com/twocanoes/xcreds/commit/86ac4201a1b282166c5a94a222d5cf3e2307d7c6)\n*  bumped version of manifest Update manifest pfm_last_modified and pfm_version #164 [View](https://github.com/twocanoes/xcreds/commit/93916f5714450e2cdd923a1b07106014c0a14d92)\n*  Allow override of killall loginwindow in xcreds postinstall script #181 [View](https://github.com/twocanoes/xcreds/commit/3a0057a18f3c3ab77de180c30d8b059565f087aa)\n*  added new preference to manage more buttons on login screen: shouldShowShutdownButton, shouldShowRestartButton, shouldShowSystemInfoButton. Feature Request - Add key to disable showing shutdown and/or restart on login overlay #203 [View](https://github.com/twocanoes/xcreds/commit/7304170591be5e9848dcd4d496c1bd54ab5f07cf)\n*  Feature Request: EnforceSignIn #199 [View](https://github.com/twocanoes/xcreds/commit/7ef5ac3262fe9b2a905077cd96895ed47a68c033)\n*  [Feature Request] Add option to customize the Refresh Banner text #176 [View](https://github.com/twocanoes/xcreds/commit/baab351ec2de975b2c4f9942941d5c173ecfde4e)\n*  updated history [View](https://github.com/twocanoes/xcreds/commit/92117943a1688581ac509eff239af15de9ad82de)\n*  changed manifest version back one; added copying DS user attibutes to prefs. Enhancement Request: XCreds app cant update ds #212 [View](https://github.com/twocanoes/xcreds/commit/4d5515cb974327f18ccc3db65ab8eb81ebe37bfe)\n*  Clarify key name an description for shouldShowIfLocalOnlyUser #219 [View](https://github.com/twocanoes/xcreds/commit/5a6d888aa27e429d5f52417dc5af7ded5dbe9dc9)\n*  systemInfoButtonTitle does not respond to plain text values #220 [View](https://github.com/twocanoes/xcreds/commit/22876caddaaa3f4a1b50df6b30a44d2a462d4e3c)\n*  AD attributes #166 [View](https://github.com/twocanoes/xcreds/commit/c2fa08ed471fdcd16563e835dfb1ffb160732569)\n*  [Feature Request] AD - User friendly fail prompts #193 [View](https://github.com/twocanoes/xcreds/commit/8e171587f1a346e11eeade5522eb06de5726807c)\n*  [Feature Request] AD User Account Creation Name Mapping #172 [View](https://github.com/twocanoes/xcreds/commit/46415fde1ece8c3eb308fd7f30a8b917d6129997)\n*  [Feature Request] Customize the XCReds app's native login dialog box #179 [View](https://github.com/twocanoes/xcreds/commit/77561251ef95717253ca8bafe7cc5fe6cfab921b)\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f9957663cd973a37666f2abb27d4c28df1c61be)\n*  Hang at login after password reset #223 [View](https://github.com/twocanoes/xcreds/commit/a4b4d30008346e7aa57e8aea30e7f68c409ccc77)\n*  Corrections for manifest #224 [View](https://github.com/twocanoes/xcreds/commit/8c7024e642b402b842f2c3fc78a76a83552d65c4)\n*  Fix formatting for systemInfoButtonTitle #221 [View](https://github.com/twocanoes/xcreds/commit/dbbb158ac7099010eae570d6190e723c2aca404d)\n*  Menubar refresh is delayed when setting shouldPromptForADPasswordChange #195 [View](https://github.com/twocanoes/xcreds/commit/89c81d527962b821213f8346a8f1104d1da9c047)\n*  Map UID #186 [View](https://github.com/twocanoes/xcreds/commit/1f107437dc5447f97112780c898ceace221a78f5)\n*  updated history [View](https://github.com/twocanoes/xcreds/commit/2a262065704baee6cd3dfd59899e9eb5c3aacc88)\n*  Setting HomeMountEnabled to false removes the home folder from the XCreds menuitems #213 [View](https://github.com/twocanoes/xcreds/commit/8e2afaf513e2453ae0b03e4581a26ba22207ed70)\n*  Enhancement request: Group Membership Zendesk Ticket 69193 #209 [View](https://github.com/twocanoes/xcreds/commit/a611f2e23ff3c4af44d03b8ee1f642a207c03c01)\n*  Custom Mac login window key combo #206 [View](https://github.com/twocanoes/xcreds/commit/b148e494644ea9c7266a3ffac18d4bc966a945fb)\n*  [Feature Request] Add a Password Expire date or Days for OIDC users and more #165. To test, set map_password_expiry to a claim in Azure (like street address) with a value in seconds from token issue (like 300 seconds) and verify that menu shows the correct date [View](https://github.com/twocanoes/xcreds/commit/5983f9320c4e792f40ba06b43276847013d2a1c7)\n*  added battery function [View](https://github.com/twocanoes/xcreds/commit/f1745fab048f8bd0f5193172782d22fb77e772b2)\n*  added battery function [View](https://github.com/twocanoes/xcreds/commit/390b06e8ff4ff971f221f9dedb8dc4eb22ee3856)\n\n\n## 4.1.6375 (2024-02-28)\n\n*  updated release notes, fixed script typo [View](https://github.com/twocanoes/xcreds/commit/cdd59f8bfe7b6153c038fb2bbfcc2e2b663b8380)\n*  updated release notes [View](https://github.com/twocanoes/xcreds/commit/88c96dff9b1de5199bf8511c4cf04c21bb42daa8)\n*  added remounting and refresh kerb ticket after network change [View](https://github.com/twocanoes/xcreds/commit/8db9ec64dab9655635cf7b5cd4f0a5911c1e344a)\n*  fixed \"Sign in\" window issue (OIDC and AD Configured) #170 and Admin user set to Standard user on Local Login #173 [View](https://github.com/twocanoes/xcreds/commit/0b8d9feab4e8dc9bf2d3c31377d2d7bacd49cb01)\n*  Sign in prompted (While not connected to a network) #168 [View](https://github.com/twocanoes/xcreds/commit/4ccca1c62d3308a1bcbefe9caf3af83a8c5ad7d9)\n*  updated profile manifest [View](https://github.com/twocanoes/xcreds/commit/fb8ca59c9951b13c458cb2a2391527dcd221085a)\n*  [Feature Request] Local User Behavior #174 [View](https://github.com/twocanoes/xcreds/commit/009d1bfc6d2c849194f207e0106cdafe5226e179)\n*  fixed crash on menu and edge case with both web and username password views showing [View](https://github.com/twocanoes/xcreds/commit/d6a1b173fc42c3a9724c3e484ab3f06afb26ba9c)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/d5840c37a8410fbf4076ee362d720da4910ff2dd)\n\n\n## 4.1.6346 (2024-02-13)\n\n*  added fix for override still prompting when overridesilent set [View](https://github.com/twocanoes/xcreds/commit/dec4a69c78ff5ee8876c6b00d33a1a09400ced92)\n*  fixed silentoverride issue [View](https://github.com/twocanoes/xcreds/commit/253a29c608e728c6177bd86e4ec70339611e95a8)\n*  fixed multiple share mounting [View](https://github.com/twocanoes/xcreds/commit/fbc40e45085a2c338f671f5fb827828e2683950d)\n*  fixed Update manifest pfm_last_modified and pfm_version #164 [View](https://github.com/twocanoes/xcreds/commit/a9f5ccc89dd7a7b673d3886aedef8073fe87c980)\n*  implemented [Feature Request] AD - Option to hide Sign-In menu item #150 [View](https://github.com/twocanoes/xcreds/commit/629dfe117cd0665192a536f6f984dbf00a31ee57)\n*  implemented [Feature Request] Standard wallpaper options for default background #155 [View](https://github.com/twocanoes/xcreds/commit/81509683f4e54462c6cc697331132980ee7b58a1)\n\n\n## 4.1.6313 (2024-02-06)\n\n*  fixed issue with menu item not updating tokens [View](https://github.com/twocanoes/xcreds/commit/7661fc2d703c065a9a71b0751a6427f1b636783e)\n*  fixed automount [View](https://github.com/twocanoes/xcreds/commit/8a9f8c2aa143ab3138e2741e2ce6061cdd35419b)\n*  remove admin if we made them admin [View](https://github.com/twocanoes/xcreds/commit/e87ec92d5bdb3ace68060f6db3469d76d0dbf0cc)\n*  added check for not removing last admin user [View](https://github.com/twocanoes/xcreds/commit/fbe883413f83d7f96fb5ba0da68ca93ced5e9484)\n*  fixed prompting when both AD and cloud are configured [View](https://github.com/twocanoes/xcreds/commit/32f2bebb4707ed70e21ccfb50f30d09eff076ce9)\n*  added kerberosprincipalname pref and getting kerb ticket with oidc login [View](https://github.com/twocanoes/xcreds/commit/c14fd13e6e347d9be49a709531ecb24b08bafb96)\n*  added menuItemWindowBackgroundImageURL [View](https://github.com/twocanoes/xcreds/commit/7c81253b3643a76c0468d4424344f61fe578d520)\n*  better selection of menu item prompting if both AD and OIDC is setup [View](https://github.com/twocanoes/xcreds/commit/a4140ace5ca7f22d26bf502da72fd928dc4388c6)\n*  fixed issue with ACL on tokens in keychain [View](https://github.com/twocanoes/xcreds/commit/4aeda19969b358ae27baa02aec067ac0f9318a29)\n*  added custom menu item pref [View](https://github.com/twocanoes/xcreds/commit/9453fbd3a3b09887ffd1807dee6ae9e6e8eb574a)\n*  ability to customize Share menu item; added username for AD and OIDC in menu [View](https://github.com/twocanoes/xcreds/commit/b67970aaa2a5ef450cb6d5888338ce4536a2e891)\n*  added pref for shares [View](https://github.com/twocanoes/xcreds/commit/9c8d920744cd44a2b27163db2c1a84d81c5665b3)\n*  added better descriptions to share manifest [View](https://github.com/twocanoes/xcreds/commit/2004767b7c99782c41f3b0a43079ce92daa22374)\n*  updated whats new [View](https://github.com/twocanoes/xcreds/commit/f81c831706a7fdbf124a5d0926fe790b728a4366)\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/a3ca6493d51a71006d2e612df747ea1c1747acb9)\n\n\n## release-4.0 (2024-01-29)\n\n\n\n## 4.0.6274 (2024-01-29)\n\n*  fixed issue with local password update [View](https://github.com/twocanoes/xcreds/commit/b12e859184f6812080906256315d1d7b2f29e496)\n*  updated ropg prefs and checking [View](https://github.com/twocanoes/xcreds/commit/e3149de819f2b72a7e11f9891815de5d5c6511b9)\n*  Minor fixes for ropg [View](https://github.com/twocanoes/xcreds/commit/f99bdd5aa288331c469bd8d6fca83af3642fd622)\n*  fixed passwordElementID preference can cause issue with setting local password #161 [View](https://github.com/twocanoes/xcreds/commit/5b547377d591c7e8dcfc6165197fcf5d94bd881b)\n*  PasswordOverwriteSilent does not prevent user prompt for password #160 [View](https://github.com/twocanoes/xcreds/commit/a438d09a10fa35c914877559a8bab415083a428a)\n*  shouldUseROPGForMenuLogin hides offline login option at XCreds login window #158 [View](https://github.com/twocanoes/xcreds/commit/17f24dd92b8c83bb591b5cd9bb50e41c9ac4086f)\n*  Improvement for refreshRateMinutes description #157 [View](https://github.com/twocanoes/xcreds/commit/cc6e736f0429bb78ac0a925395b305f21d98af4a)\n*  Typos in manifest descriptions #156 [View](https://github.com/twocanoes/xcreds/commit/eae6dff1654237d13bbab857a5e1d8c30c5ffe11)\n*  added release notes [View](https://github.com/twocanoes/xcreds/commit/af102f94dd2fdf999b775f6c01cc2fbd98935819)\n\n\n## 4.0.6261 (2024-01-15)\n\n*  built release notes [View](https://github.com/twocanoes/xcreds/commit/7440e188957a5c489891d75513dad33df2ec6aec)\n*  applied patch from Jim Zajkowski to fix integration issues [View](https://github.com/twocanoes/xcreds/commit/278862f63decc361c2dcc1e99da541c431b7099d)\n*  fixed up kerb ticket status in menu [View](https://github.com/twocanoes/xcreds/commit/93371b9a3b32c7f09e23d1b55fb1c783ffd580de)\n*  refactored menu code [View](https://github.com/twocanoes/xcreds/commit/a76b7f843d4a156233abeb9039152748e2dc52c9)\n*  fixed issue with updating keychain [View](https://github.com/twocanoes/xcreds/commit/d0b70c3142e385a51c79c1f94812393a6067e178)\n*  more attempt at sharemounter integration [View](https://github.com/twocanoes/xcreds/commit/18e44d1d6b156ffb63686db8d52905e287dc5f24)\n*  implemented shares [View](https://github.com/twocanoes/xcreds/commit/8bd74a3ac8fe78088e280c19d9ee80eeb1658129)\n*  added additional sample profiles [View](https://github.com/twocanoes/xcreds/commit/721bf74a6f58cce0b09b1aa2e88f6317b643bede)\n*  fixed home mounting [View](https://github.com/twocanoes/xcreds/commit/b4ffa8ff9788cdd76694174c54dd0bc3ce9ddbcc)\n*  fixed enabing window state with AD [View](https://github.com/twocanoes/xcreds/commit/24d17c9845baa29acbd7ec408c02553dd4d7ea3d)\n*  pointed package to main branch for oidclite [View](https://github.com/twocanoes/xcreds/commit/7f23a07412363c7d45ce093eaff0bbac644265bb)\n*  Allow forcing of webview login window [View](https://github.com/twocanoes/xcreds/commit/88eaaf49ff27a7fb38c879d15e597912f06c0d29)\n*  Support separate client ID and secret for ropg [View](https://github.com/twocanoes/xcreds/commit/4e008168bbf206d6678d7c1649e26ec7424928a3)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/7d5fba55eab2430038c2a86b79c08f714316e57b)\n*  fixed issue with ropg clientid/secret selection [View](https://github.com/twocanoes/xcreds/commit/1642241ea03ddc43b4a04b7e9a4f0885113ab4dc)\n*  Keychain is reset on cloud password change when user enters old local password #148 [View](https://github.com/twocanoes/xcreds/commit/79f1bb531ce5fa20389b4fed319bac3539314e96)\n*  Admin status does not change after removed from group #145 [View](https://github.com/twocanoes/xcreds/commit/f9821f992afe305d2be9bec0ee0aec9e1b5dbdca)\n*  Fix manifest key name for loadPageInfo #143 [View](https://github.com/twocanoes/xcreds/commit/b747d621e864a40906b13b85e6d184ead1fb485c)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/aad768b0f0b76345a3e7ee2ea0d02fbcf6e953b1)\n\n\n## 4.0.6203 (2024-01-01)\n\n*  added release notes and script to generate release notes [View](https://github.com/twocanoes/xcreds/commit/ff9dc64fea8e6f438755e1d72837fce4391d167c)\n*  Feature Request: Allow \"loadpage.html\" to be customized. #126. To test, add in new keys \"loadPageTitle\" and \"loadPageInfo\" or try the xcreds_example_azure_loadPageTitle_loadPageInfo.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/37c7477f66362c1823c49138b49afcad388abbc5)\n*  Update description in manifest for loginWindowWidth and loginWindowHeight #138 [View](https://github.com/twocanoes/xcreds/commit/5951d753b391fda49534c5dda13d508479e66fd8)\n*  [feature request] LocalAD - make sync password with AD optional with preference key #130. To test, set the shouldPromptForADPasswordChange to false and set the user account to require password change on next login and verify the user is not prompted [View](https://github.com/twocanoes/xcreds/commit/0b85b4ffb8e95b8d79ffcf455ac034c05ce4d4f4)\n*  XCreds breaking Munki's logout/install @loginscreen logic #102. Test by defining hideIfPathExists to a path like /tmp/hide and then add/remove and UI should show /hide. Or use sample profile xcreds_example_azure_hide.mobileconfig [View](https://github.com/twocanoes/xcreds/commit/770c179262658ccfd27f9de3808b931cc69a86e4)\n*  Option to enforce account to log in #21. To test, create allowedUsersArray with name of user allowed to log in and define allowUsersClaim with an OIDC claim that contains that value. Or use the xcreds_example_azure_allow_fred.mobileconfig to test [View](https://github.com/twocanoes/xcreds/commit/ee95927865f1e912898c4d030cb367fd589db114)\n*  Feature Request: Force Wi-Fi on option or Wi-Fi on/off switch in \"Configure Wi-Fi\" #58 [View](https://github.com/twocanoes/xcreds/commit/bfa28014c7d0c000369d49bf9a3896128616901a)\n*  added removeadmin function but not used since it can cause local admins to unadmin [View](https://github.com/twocanoes/xcreds/commit/cc322befaf88bf3440a9d086089468660a4354f3)\n*  loginWindowBackgroundImageURL image should be cached if not a file:// URL #72 [View](https://github.com/twocanoes/xcreds/commit/b2cfd643ac6419904cc30037eaceaf5bb939cc7b)\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/500575b7dfa81c7a9a7231aeac88bd3cfe6a5497)\n\n\n## 4.0.6177 (2023-12-28)\n\n*  added date to license agreement to resolve Date not shown on user agreement #134 [View](https://github.com/twocanoes/xcreds/commit/17df8ec0734b9a8eddb2485e4d16af25ddd2df30)\n*  fixed Password reset dialog rendering and text need fixes #133 [View](https://github.com/twocanoes/xcreds/commit/a03c7f1463be0ab89a787d08f2f211c8bb9a6552)\n*  Cloud login screen button section pushed to left side #132 [View](https://github.com/twocanoes/xcreds/commit/0a300f842d6ab85e8c28501c9b4b87e57b5e0017)\n*  Active Directory login - blank login after expired user attempts sign-in #114 [View](https://github.com/twocanoes/xcreds/commit/b8d52d586aaa8db98487a8bd8279fbd673992ad8)\n*  Prompt for Secure Token Admin Login When Required for AD #127 [View](https://github.com/twocanoes/xcreds/commit/42002e66a6d90726e9a5f4132f232afd107736d7)\n*  [bug] Build 6023 LocalAD - cancelling Change Password prompt breaks login fields. #129 [View](https://github.com/twocanoes/xcreds/commit/be300977b25f12e409b506de0f0d6fc1addd9ebd)\n*  Add ability to select active directory login to select mapped user account #136 [View](https://github.com/twocanoes/xcreds/commit/19260d33f6a35b1564112c9be94e804bf892cb14)\n*  fixed issue with initial focus [View](https://github.com/twocanoes/xcreds/commit/f40cf398168bffd52a75745ab3527b7f9bfc9f20)\n*  https://github.com/twocanoes/xcreds/issues/54 [View](https://github.com/twocanoes/xcreds/commit/270732273500c8d5d1e791b565df25d581f5e0f4)\n*  Request: display user password expiration (days left or specific date) in app. #54 [View](https://github.com/twocanoes/xcreds/commit/2774028c41b4a2b5031296e284d1cde5ae48541f)\n*  Refresh does not change next password check time #88 [View](https://github.com/twocanoes/xcreds/commit/fdcd94b1dd7f99c6baf635af6d7978d0aad30df3)\n*  changed cartfile to point to github [View](https://github.com/twocanoes/xcreds/commit/960fa77bb2cb6b21719fb33481febbb594b53f90)\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/ed417781d823012a779fd93c4c29cf46259d0bee)\n*  removed framework [View](https://github.com/twocanoes/xcreds/commit/c054c66e231955a396f9f28bd26d8352ae7ed48f)\n*  added key for ROPG at login window [View](https://github.com/twocanoes/xcreds/commit/716934b3e90d1f8cc454e7f25232584e3f2b5d3a)\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/1c0fc161b10042d6f88097ffb255749e682023bf)\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/e24b7e07ec5ceefeacda3cbaa2b92e71a7261ecf)\n*  partial refactor wip [View](https://github.com/twocanoes/xcreds/commit/f651bc35965ad5a1a1c713a4ff0a3cd4b20cb00b)\n*  ropg at login window initial implementation [View](https://github.com/twocanoes/xcreds/commit/32ad7b391c89e870fe373cdac46e62744fb79221)\n*  cleaned up ropg login code [View](https://github.com/twocanoes/xcreds/commit/e9b12682acdcdd8f5b3bd9f1035c80ca2e359995)\n*  hide refresh when on username/password window; move focus to blank password when not entered for username/password window [View](https://github.com/twocanoes/xcreds/commit/b54cf49b000fa8806229300455901955f2f1edf2)\n*  fixed menu app password verification [View](https://github.com/twocanoes/xcreds/commit/93ac8b9bfbeefb2d7b5df4585d033005b6907300)\n*  added ShareMounter and missing KerbUtil filet [View](https://github.com/twocanoes/xcreds/commit/3f14dc2639807400e8c1b6f8824a05d6ea2b474b)\n*  added username / password view to prompt in userspace [View](https://github.com/twocanoes/xcreds/commit/a56020e4ba24ef0d2d634f4e3ad71964c561eaad)\n*  fixed cancel for AD userspace cancel [View](https://github.com/twocanoes/xcreds/commit/8acaf42493adf20b98f132182b7951fae9181976)\n*  fixed override script in usersapce [View](https://github.com/twocanoes/xcreds/commit/bdd67573335b01e9aa809a8af6570474183751cb)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/48329e1d05488dd2b66820ab8d62b6c540901f41)\n\n\n## 4.0.6023 (2023-12-12)\n\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\n*  fixed issue #124: Default behavior wrong for shouldAllowKeyComboForMacLoginWindow [View](https://github.com/twocanoes/xcreds/commit/6f3737257205f4d2faa035b6f051bf6bfed2074b)\n*  refactored code to add admin to user account based on group membership each login (issue #109); added groups claim value to OD record on each login in _xcreds_oidc_groups (issue #117) [View](https://github.com/twocanoes/xcreds/commit/8376942e6e23f8804bd5cec3cfff383792391031)\n*  updated license agreement (issue #90) [View](https://github.com/twocanoes/xcreds/commit/f41411c5a51706ba7b33776edc845a409400bf1e)\n*  Detect when no password was entered #17 [View](https://github.com/twocanoes/xcreds/commit/7cf2837f3d653a893f2f5c031c0a72298340aa70)\n*  updated animation when logging in [View](https://github.com/twocanoes/xcreds/commit/51387b15384032bc5f4e82a5d6fea8a49c6e2625)\n*  adding arbitrary claims to local DS user account [View](https://github.com/twocanoes/xcreds/commit/e47832e21a76d3ae86af3e7e5fee41f29772436f)\n*  fixed Active Directory issue after password change #112 [View](https://github.com/twocanoes/xcreds/commit/14e2a7c1e1d15e8655f44bef182a2e14bc0892ce)\n*  partial fix for #114 [View](https://github.com/twocanoes/xcreds/commit/856a3549bec86c6c52b4ed368b2e59d25c38c5a7)\n*  refactored windows to views [View](https://github.com/twocanoes/xcreds/commit/8a0994c7dfbe071ce5397d52070c2a4c9ab9a309)\n*  fixed centering and cloud login sizing [View](https://github.com/twocanoes/xcreds/commit/f83d523c57cf9f65f6f1b7931bdf34ad5a04c090)\n*  fixing timing for animation when logging in; tweaked UI [View](https://github.com/twocanoes/xcreds/commit/9c659dbb4a12c9ee4cbe396119a058d2594e6827)\n*  streamlined startup process [View](https://github.com/twocanoes/xcreds/commit/1895f0365a3aba91fc9c43961bca78ee6a9482e6)\n*  refactored dialogs for prompting for user info; fixed ad groups for making admin user [View](https://github.com/twocanoes/xcreds/commit/7c5af73cb91a83c8f323edc1d8bd9538b02fbd71)\n*  added missing template for package [View](https://github.com/twocanoes/xcreds/commit/281fe86d7bb33c7f278f05117794069c991efb47)\n*  fixed showing offline button [View](https://github.com/twocanoes/xcreds/commit/72ffc3fd5434eb742e1cffa3cb073228f4883292)\n*  implemented feature request: localad/kebereros support for saving groups to prefs #125 [View](https://github.com/twocanoes/xcreds/commit/1d3e2be0a87c3e5d2843767db28de90894bc12cc)\n*  fixed enabling views when logging in [View](https://github.com/twocanoes/xcreds/commit/3ac6e3739200a3ae6f708be731c4d7acdf279e7e)\n*  fixed javascript to key on input instead of keydown/keyup [View](https://github.com/twocanoes/xcreds/commit/3d41a199cfd92f233677cc6859f837ede388311c)\n*  implemented Prompt for Secure Token Admin Login When Required #123 [View](https://github.com/twocanoes/xcreds/commit/32b118fe0c96b6cee8bd8a37bcff22611f28e55b)\n*  fixed Update documented minimum for loginWindowWidth and loginWindowHeight #91 [View](https://github.com/twocanoes/xcreds/commit/21814425a055f0240fb4c11c37c0d01045620fd6)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/a5aca79363b6f3cc974442534bbc7818b0e4775b)\n*  fixed issue with updating password in userspace [View](https://github.com/twocanoes/xcreds/commit/9e483c451eccac80fc533f993fe21a526970fd9e)\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/867fc0f3337cde76a06cb821471de2bcd6fb9506)\n\n\n## v3.2.1.6002 (2023-12-11)\n\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\n*  updated js [View](https://github.com/twocanoes/xcreds/commit/e621f6a8da59c6923f0ba12b6a3abf5c9a916f34)\n*  bumped version and build [View](https://github.com/twocanoes/xcreds/commit/7140e72c2e619e26b2db99e21f917f6b3147570a)\n*  adde missing credits file [View](https://github.com/twocanoes/xcreds/commit/81f8e48a696c1eeab46bbcb4f36eea66fe6113f4)\n\n\n## v3.3.5269 (2023-11-27)\n\n*  use default desktop from CoreServices [View](https://github.com/twocanoes/xcreds/commit/c2c99e2657bc7c4e77aa12628c00a1cec35e65dc)\n*  reload the login window when wifi is connected [View](https://github.com/twocanoes/xcreds/commit/64b6876f8ba181c57d1a4ecb9ab8276cc7acb173)\n*  fix conflicts in XCreds app [View](https://github.com/twocanoes/xcreds/commit/e29288a7b32a91a9dabe978caadaa41cce0549f6)\n*  Add new NetworkMonitor and reload webview on network changes [View](https://github.com/twocanoes/xcreds/commit/e6fd5e31e6b573eaeec5d9df9cb8d7545e4d693e)\n*  add new networkmonitor [View](https://github.com/twocanoes/xcreds/commit/0ede34aef5b8ec9c41c41f4a57526cfd2be6b06c)\n*  better handling of loginwindow reload [View](https://github.com/twocanoes/xcreds/commit/472754db230ba77da0ff36c07ccb0a76ebc88dd7)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/0a130f4456899320bc2106dc3ee8d0179abf87c6)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/bec80f2ecde022f94e1bb6297b7c0d22b4b57d04)\n*  Resolves #111 by only refreshing when on cloud login [View](https://github.com/twocanoes/xcreds/commit/ca8e9851796b02efdcf0b8237cef4fe03622cbf0)\n*  removed tperfitt from logging. issu #108 [View](https://github.com/twocanoes/xcreds/commit/0f75ef578c89f3cfab35e83e1d863b3b281a88b7)\n*  added info in DS for sub and iss when user is logging in and account is created [View](https://github.com/twocanoes/xcreds/commit/a16e2f5b40d2dcdc35e15c864a7887959720f64c)\n*  initial implementation of allow user to select account to map to #98 [View](https://github.com/twocanoes/xcreds/commit/9b4b781714778a0346cb4047a61b5c6b0ce8e4fe)\n*  added preference shouldAllowKeyComboForMacLoginWindow and key combo (control-option return) to switch logon window. command-option-control return for mac login window. Feature Request: Show / Hide the switch login button with a pref key. #121 [View](https://github.com/twocanoes/xcreds/commit/71b874ecf39fcafd7e794306e3a8dfafbcb69ce8)\n*  Log shows tperfitt user profile path #108 [View](https://github.com/twocanoes/xcreds/commit/beb62fab79a1631780e12742763041c15f6aaecb)\n*  Feature Request: Option to alias IdP username to local DS user account #59 [View](https://github.com/twocanoes/xcreds/commit/dd428a9717546b5ea12d7c8677fa99084ce2cccf)\n*  add missing Credits.txt file [View](https://github.com/twocanoes/xcreds/commit/ccadd3398bc60d7b11807980f306dfbd8453c59f)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/0e668f6af5873f5b7ff8770cc34b6ac6138d8e94)\n*  updated manifest for new keys [View](https://github.com/twocanoes/xcreds/commit/f418394373ad7c62d3e297c7f5cd224aaf8d19f9)\n*  showed Create New Account button in migration modal [View](https://github.com/twocanoes/xcreds/commit/59ab7e8d1dae2c1972041eb1e2b7082a98737ae6)\n\n\n## v3.2.5197 (2023-10-17)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  updated url in profile manifest [View](https://github.com/twocanoes/xcreds/commit/33ef0c9f2f30afc4260526b27ee4e6995e94fcfa)\n*  fixed issue 95: whitespace characters in password and username [View](https://github.com/twocanoes/xcreds/commit/63f4ca53c2c1ba31fd93fd4921042d21284570c6)\n*  shouldPreferLocalLoginInsteadOfCloudLogin [View](https://github.com/twocanoes/xcreds/commit/79e798afab9162255b7a019b74bbb3122330e83a)\n*  another attempt at fixing https://github.com/twocanoes/xcreds/issues/95 [View](https://github.com/twocanoes/xcreds/commit/819e9a047f8d1e9e6d5a4f26b32238cb7fc9da88)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/4ac36cbc2d085ee32bd8d82a66feeb925ff118fb)\n*  fixed keyboard nav for controls [View](https://github.com/twocanoes/xcreds/commit/c5c0cad10f5d5f22f8b6ce3d0993f5f1f72d8f3b)\n*  issue #100: Detect Offline [View](https://github.com/twocanoes/xcreds/commit/fe804f167446fc4b22e128cca576ddd7276fd96f)\n*  Add ability to check passwords via ROPG [View](https://github.com/twocanoes/xcreds/commit/f7c62c0466106cbc26f9f67be441dad847c32ecf)\n*  Rename prefkey to be more boolean [View](https://github.com/twocanoes/xcreds/commit/2909f625588fe25c2082fbf2ff88df468e19c79d)\n*  update to profile manifest [View](https://github.com/twocanoes/xcreds/commit/7fcb0a392b0e8d8c19e81f8e827d6de996da75c4)\n*  fixed typo in function name [View](https://github.com/twocanoes/xcreds/commit/8c12d454e393cc0c52a0feb314a67c357bbac1c9)\n*  added a smidge more logging [View](https://github.com/twocanoes/xcreds/commit/86256a2825eeeebf6eb63fe26451c372e149c2a2)\n*  added self healing for auth rights [View](https://github.com/twocanoes/xcreds/commit/9b43e1cb382cfea1b40a2f40b6cdf6189fed385b)\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/7cdf884f2aed100080069e9b3a589af736062c99)\n\n\n## release_3_1 (2023-07-14)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  updated history.md [View](https://github.com/twocanoes/xcreds/commit/85b71172d3192616371ccc30ea16fb6dd092a54e)\n*  fixed check timer to still work if mac sleeps [View](https://github.com/twocanoes/xcreds/commit/af491f5febf433bfeb8478d71a2fa29309676765)\n*  fixed issue with token update time [View](https://github.com/twocanoes/xcreds/commit/0d14279e4003400a0fef812247f3c790fc802f5e)\n*  fixed fade; cleaned up user mappings for weird characters [View](https://github.com/twocanoes/xcreds/commit/c6304954d6b02109d4ff90ed2d3b94963f761461)\n*  final touches [View](https://github.com/twocanoes/xcreds/commit/df5f1110c5800ac8aa31293ac509817a62fedfbc)\n*  bumped to 3.2; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/5a544859855835a6c1d8bfb35a39aeb30cda5962)\n*  bumped build number to 5000 [View](https://github.com/twocanoes/xcreds/commit/6250fdf999d7e57bfd51fe55186fde6fce92a3c0)\n*  updated permission for override_script [View](https://github.com/twocanoes/xcreds/commit/fac2af918a65d5f92c211e4707e9e14d36e5bee1)\n*  changed version back to 3.1; added better about window with history; changed override script requirments to be owned by _securityagent and be 700 [View](https://github.com/twocanoes/xcreds/commit/2f8dd4e599a71d02a88fa4a66814e419c71c0e65)\n*  added command click login window for mac login window [View](https://github.com/twocanoes/xcreds/commit/f0a5b1fc76c133f199da75f31202401476da2af1)\n*  text fixes [View](https://github.com/twocanoes/xcreds/commit/97c383e24729982c364e456ba5c3d49aa983060a)\n*  updated build script [View](https://github.com/twocanoes/xcreds/commit/b4fd79d1d43d922fac3581282c7eb9126d33ed8c)\n*  added back sample profie [View](https://github.com/twocanoes/xcreds/commit/6aa3ec4a58842f9a4dd748cd129ed4c14226888a)\n*  fixed timer minutes [View](https://github.com/twocanoes/xcreds/commit/e78b306018cd996176b9530ba302689bd1d3e358)\n\n\n## v3.1.4144 (2023-06-08)\n\n*  updated AD support: kerb ticket now obtained at user space app launch from password in keychain. udpated profile manifest with better comments; delete cookes on webview each time it appears; added local login button; shows username password if discoveryURL is not defined [View](https://github.com/twocanoes/xcreds/commit/d17509bd2ce49313561632e15bc2698e38f09721)\n\n\n## v3.1.4143 (2023-06-07)\n\n*  updated fullname [View](https://github.com/twocanoes/xcreds/commit/627199474b42349bd42f6dc47c4cd442b9c3357a)\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d2370669893dc37937617be59a5601109915e991)\n*  added shake to password field [View](https://github.com/twocanoes/xcreds/commit/d0f4efdbf886cbe9a21e449fe8d47f1ed671bdcd)\n*  get kerb ticket on login [View](https://github.com/twocanoes/xcreds/commit/b7f7ad622ceaa57d27e419fa3fad10f0e040f8e3)\n\n\n## v3.1.4081 (2023-05-27)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  added Package.resolved [View](https://github.com/twocanoes/xcreds/commit/91fb7f3da5e789dabb37a5a8585592c69c1a732c)\n*  added XCredsLoginPlugIn/errorpage.html [View](https://github.com/twocanoes/xcreds/commit/7bf66a34a1ef091f532959de62247ba1fbead13e)\n*  cleaned up build system a bit [View](https://github.com/twocanoes/xcreds/commit/f99ec4a8ae38ff00adabe9b43c1ff8577c803dd1)\n*  improved javascript parsing [View](https://github.com/twocanoes/xcreds/commit/ecf710eb181fd3f6dbdce7aedf511b8840e33ca6)\n*  fixed issue with initial javascript listener [View](https://github.com/twocanoes/xcreds/commit/574a51b5b8329be4cc2ec8c045f710548aecf7d6)\n*  cleaned up logging a bit [View](https://github.com/twocanoes/xcreds/commit/dfbf57f4a3d9649e2b35231bfedc6d591a7c3e41)\n*  removed reset option [View](https://github.com/twocanoes/xcreds/commit/3150fa654f3b8a55018f0a1e0390aa6ec541e125)\n*  removed KeychainReset and PasswordOverwriteSilent because it makes things worse [View](https://github.com/twocanoes/xcreds/commit/39362899ee0c0813f416057cad203061869daa84)\n*  added lock screen switch to login window [View](https://github.com/twocanoes/xcreds/commit/77c52ad11ab01b1afd5e011b38a06b3de9527196)\n*  fixed window levels, progress screen, background and boot runner issues [View](https://github.com/twocanoes/xcreds/commit/4c887fbdc82a0f63fcd8876aa662c6bc96ef7bbd)\n*  improved logging [View](https://github.com/twocanoes/xcreds/commit/e92ffe9e65f1a95b4b3e9f1c8ea1089ae7720863)\n*  checkpoint [View](https://github.com/twocanoes/xcreds/commit/488b66494c65e8460eefdf5bbb8c0d271102f298)\n*  added override script and secure token admin reset [View](https://github.com/twocanoes/xcreds/commit/6717b3aa2cd0ef9d387484e7571183e6f8ffbb5d)\n*  removed shouldFindPasswordElement since that is defaulit fallback behavior [View](https://github.com/twocanoes/xcreds/commit/2825ee7b6db005f6aa8ca6d60c72210ae7343af4)\n*  cleaned up ui a bit [View](https://github.com/twocanoes/xcreds/commit/b64496bcb55573dff889a9ab92be2ed3f9cdd5e3)\n*  dont refresh prefs so much [View](https://github.com/twocanoes/xcreds/commit/91ee8dcd371fe9e2182fd421674f9fcd484e4d81)\n*  added check for group membership in oidc claim [View](https://github.com/twocanoes/xcreds/commit/2c03586a59821a04948692dcb9a41006ebf735f7)\n*  added history file [View](https://github.com/twocanoes/xcreds/commit/5fa6c0436a58535e03fd457de9dd720186274a38)\n\n\n## release-3.0 (2023-05-08)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n\n\n## release_3_0 (2023-04-18)\n\n*  added trial license beginnings [View](https://github.com/twocanoes/xcreds/commit/5a6cc5a91715e909dc8f9510f800dfffe485b7d6)\n*  fixed regression for password change not capturing new password on azure [View](https://github.com/twocanoes/xcreds/commit/8db379d829d925409abfea85da72a788ead43d22)\n*  bumped version to 3600 [View](https://github.com/twocanoes/xcreds/commit/f9601726f3d7255414d4ad44e20b9ac526af0f7c)\n*  fixed issue with crash if time is far off [View](https://github.com/twocanoes/xcreds/commit/9c1d0d81ed62f525614b79e3a3dbc4b4bed3964b)\n*  fixed typo [View](https://github.com/twocanoes/xcreds/commit/f309f95218424ca8f67177b0daed79d98344e943)\n*  updated license [View](https://github.com/twocanoes/xcreds/commit/534be3e278d1daae48218952d20194e4e03b17b4)\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/e3c87a548a9e682b75ec01b4216ddfdda8a2ced2)\n\n\n## release_v2_4 (2023-03-28)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  added more logging for id token and bumped version to 2.3 [View](https://github.com/twocanoes/xcreds/commit/b8494ee343dab510fba1c1f304623efc985455a0)\n*  added remove keychain option [View](https://github.com/twocanoes/xcreds/commit/19032d8df58c0bdd6197fc47f9f3aa2d8d6694ea)\n*  updated language on keychain option and added pref in manifest [View](https://github.com/twocanoes/xcreds/commit/709a7f29e696c088cc8e13959dadba8f9c0f8c8e)\n*  added key for customizing return to xcreds; added preference and ability to automatically refresh login window [View](https://github.com/twocanoes/xcreds/commit/514a1ba5ddaec55bfb8e40ca3e6c98a43c50ec7b)\n*  added in login window height/width [View](https://github.com/twocanoes/xcreds/commit/18e974e67f2833862a1a6913a6c4563e339d4239)\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/6090d5ec4895045448920e774e16dc0614223919)\n*  added in login window height/width min value of 100 [View](https://github.com/twocanoes/xcreds/commit/0a7dad70364bd830b8028da2cadd62c98b79271d)\n*  fixed login window size and background image [View](https://github.com/twocanoes/xcreds/commit/339a66e7fdf6e8484da8f7c0a5c2ee6eed0aaef7)\n*  fixed focus issue [View](https://github.com/twocanoes/xcreds/commit/992512bb1ac27f36c655d1e1a02eafdbd47a2b80)\n*  updated sample configu [View](https://github.com/twocanoes/xcreds/commit/cd482e69520c8a7994eb8233e26c8a008c5048e7)\n*  tweaked text for user space refresh token window and added pref to show or hide [View](https://github.com/twocanoes/xcreds/commit/9f29893203caef8799683cc2ded3345f306c4528)\n*  fixed names and links in manifest [View](https://github.com/twocanoes/xcreds/commit/e759138ca72f2a4153fbea02f7b0b5cfd031bd01)\n*  fixed crashing issue due to null refreshview outlet [View](https://github.com/twocanoes/xcreds/commit/d3931983b53633c91c33494fc1fcccd7614948ad)\n*  added frontmost when prompting for keychain password [View](https://github.com/twocanoes/xcreds/commit/92ee6ed5c41dfefc798f1c839193aaa4a4a09f67)\n*  fixed issue with autorefresh [View](https://github.com/twocanoes/xcreds/commit/d7126a026281afaac27c9381a9c4e42d472b4b31)\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/7a3d45178e299b52014fb3dd0adf6c180667222f)\n*  fixed changing wifi not dismissing dialog [View](https://github.com/twocanoes/xcreds/commit/9ef84939d56cce29c9b8e3a84b0f070a30f7e30c)\n*  added 802.1x support; added support for pref key for finding password based on type=password [View](https://github.com/twocanoes/xcreds/commit/38ddeff5cd86d0cd43a97844c9d160da0ee446f3)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/72da3de9c054f4fb35fb19c9bb6ffd5c2ebbb47a)\n\n\n## release_v2_1 (2023-01-11)\n\n\n\n## realease_v2_2 (2023-01-11)\n\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/4f27ddcd3d2a3a8e47f51a40a7631a7bf3343d88)\n*  support getting password with get and adfs [View](https://github.com/twocanoes/xcreds/commit/494fdf75c79d8aa3b2c3cc6dc947f4423b2b3674)\n*  Revert \"support getting password with get and adfs\" [View](https://github.com/twocanoes/xcreds/commit/425bda9a9323fd7eb9437f09f9da63747db9dc8d)\n*  changed pref names for custom IDP / ADFS [View](https://github.com/twocanoes/xcreds/commit/83947497ec00cdfd7ec3b9a3683fa3b8e007aadf)\n*  fixed package template issue and updated manifest [View](https://github.com/twocanoes/xcreds/commit/f2540a6c64b5bc9971833e8fa859821d4822af9c)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/e99abc0bb097c042f0ce0283547045ec1916db63)\n*  enabled rekeying FileVault implementation [View](https://github.com/twocanoes/xcreds/commit/2ba233e3695b8a7bda297b0908da933d24bec1c4)\n*  Support a Azure AD host [View](https://github.com/twocanoes/xcreds/commit/c0415863273f9797808d32633d3e800d630f9a0f)\n*  If fullname is empty, shorname is used. [View](https://github.com/twocanoes/xcreds/commit/7764740647f8e4450b411fa08849e5f4cceba078)\n*  added autologin when fv enabled [View](https://github.com/twocanoes/xcreds/commit/c8b394e055e2aa176af8a7f9e8cce53a3066f408)\n*  added okta compatibility [View](https://github.com/twocanoes/xcreds/commit/5f38e70e641bc2c8129e940ae7e9f710380fea5b)\n*  added a bit more logging [View](https://github.com/twocanoes/xcreds/commit/e2d2330a5050ab419290de466cef9f0b63407215)\n*  removed \"prompt\":\"consent\" [View](https://github.com/twocanoes/xcreds/commit/3e0a5e6de6342f36c9622aba3ad55d2db4488942)\n*  fixed notification prompt [View](https://github.com/twocanoes/xcreds/commit/40423c3b3ba271483826e49b6010f95e5b5683c7)\n*  added shouldShowCloudLoginByDefault user default [View](https://github.com/twocanoes/xcreds/commit/d8658f333726d8151c2486a7fe38f94cc29cacb2)\n*  added idhostnames array so you can specify multiple tenants [View](https://github.com/twocanoes/xcreds/commit/663dfa99b6bfb54487ca5cbc8d83618c8d180496)\n*  removed registration reminder [View](https://github.com/twocanoes/xcreds/commit/738dff1ab4396e14d701da2dcb79c5c657533433)\n*  removed spaces [View](https://github.com/twocanoes/xcreds/commit/180c2b9f4c267479723810a22a1dcc7715d992ce)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/70082e7da4df6b71284735eb788b992df4c8ca40)\n*  added mappings for user info [View](https://github.com/twocanoes/xcreds/commit/074ac99d5b3b72f3a8fb553670968f6e67da8f10)\n*  bumped version to 2.2 and build [View](https://github.com/twocanoes/xcreds/commit/23d902d5227eab2f3e61a6c931ccf63b94bc0ccb)\n*  added new key for OIDC mapping [View](https://github.com/twocanoes/xcreds/commit/485be954afebf7cbe808a8b23e0be6a7c5efa495)\n*  made keys lowercase for mappings [View](https://github.com/twocanoes/xcreds/commit/7432620d1a5c7e22e98975a5e806b73a9140d5ee)\n*  changed case of keys [View](https://github.com/twocanoes/xcreds/commit/ecac4002bd45677fa72386cc73a56bfe6d3f53ed)\n*  renamed mapped prefs with a prefix [View](https://github.com/twocanoes/xcreds/commit/aadd1445d92ac12e084946e1b40d97cf9f5aa6c7)\n*  username hint was not being set [View](https://github.com/twocanoes/xcreds/commit/aba884ce568c39653fec406f7c95b21b1c554642)\n*  added startup script [View](https://github.com/twocanoes/xcreds/commit/9c374670c37ba1b522e1247ec96a850a4e663b8e)\n*  added credit to script [View](https://github.com/twocanoes/xcreds/commit/e36e74db471c955bd356f150dbc9b19d240a50d4)\n*  implemented KeychainReset [View](https://github.com/twocanoes/xcreds/commit/0c34708fdeb9c9aa4303daa8382948d4e7d8143d)\n*  implemented PasswordOverwriteSilent [View](https://github.com/twocanoes/xcreds/commit/8fcee904d23440051516c74228213a64b4ead348)\n*  removed show prefs menu [View](https://github.com/twocanoes/xcreds/commit/d34328d71ec93b2663b75c080e41c8e0707b1f8e)\n*  fixed timer issue [View](https://github.com/twocanoes/xcreds/commit/1d37d90a8ce81a142b90874b5d35641db4a9c1a8)\n*  fixed shouldShowCloudLoginByDefault not working [View](https://github.com/twocanoes/xcreds/commit/570576b00c63db1f11ab5d7799301c9faed7f1e9)\n*  fixed edge case when not showing xcreds login when logging out [View](https://github.com/twocanoes/xcreds/commit/3447f7be9e35a5e894911c0fa7366be4fa0d3b05)\n*  removed test time [View](https://github.com/twocanoes/xcreds/commit/5bd5f84563b2a05fd4c2c169e1601cf5c270d8a9)\n*  added sub as local user account if other methods not available; added some additional logging [View](https://github.com/twocanoes/xcreds/commit/fd4067d3a54850244f5f456825cbb531800dca85)\n*  remove progress screen overlay because it was hiding filevault [View](https://github.com/twocanoes/xcreds/commit/453a9b79a19bbd05c4d638c01337b4752943898d)\n\n\n## release_v2_0 (2022-08-30)\n\n*  bumped version to 1.1 [View](https://github.com/twocanoes/xcreds/commit/d6a4c915da4e771335915c6aa1dae53d94c8c039)\n*  added sample profile for google [View](https://github.com/twocanoes/xcreds/commit/342c8590fd5392822a9a57dd9a3293aa5f276eb6)\n*  Cloud password verification dialog not centered... #15 [View](https://github.com/twocanoes/xcreds/commit/b1d8ee6069a92e6b231b8bce944f684fa36ec68e)\n*  add \"have token\" indicator #10 [View](https://github.com/twocanoes/xcreds/commit/db746fd65ae1623e1d69f3c075391f474c9ccc3e)\n*  Hide \"About XCreds\" menu item #18; Ability to add a custom URL and menu item for \"Change Password #18 [View](https://github.com/twocanoes/xcreds/commit/f1c4593b4ad1b73899f9bc2cbfe61cd2d37eac11)\n*  start of login window [View](https://github.com/twocanoes/xcreds/commit/ce6cc87d6f5e0ee87ecea89514865fd7b92df476)\n*  pass username and password for login window [View](https://github.com/twocanoes/xcreds/commit/6addc7950cf499fb9bdeee098af1e0f9d35bfb63)\n*  added fade to login window complete [View](https://github.com/twocanoes/xcreds/commit/3fd2f6dd2f69f8ec41e7eda52937e98cf0a30738)\n*  restart and shutdown buttons [View](https://github.com/twocanoes/xcreds/commit/fde13dea140cf02043c8f9404c08917868bb5ecc)\n*  implemented swiching back to mac login window [View](https://github.com/twocanoes/xcreds/commit/85545c29a8ad7c2b28daef1f8e8024bf377761ba)\n*  wip [View](https://github.com/twocanoes/xcreds/commit/e755e305eb936a965cb0ef133d9f7c1cfb7cc765)\n*  fixed xcreds breakage due to refactoring for xcreds login window [View](https://github.com/twocanoes/xcreds/commit/f41778819ed0d04325880e641799f723732ca6f3)\n*  added keychain updating with tokens [View](https://github.com/twocanoes/xcreds/commit/2e3114e4f657761addd714abe7de790350623c83)\n*  xcreds login window [View](https://github.com/twocanoes/xcreds/commit/03e929f9fa582b394686bb7669b28d0e906c4cd9)\n*  added return to cloud login and wait message [View](https://github.com/twocanoes/xcreds/commit/f29ea30d43e51b6ef44bfbdad7d0ccd1d650a6b3)\n*  bumped version [View](https://github.com/twocanoes/xcreds/commit/7fb698159e5f0b6cd54057d0938ddd0a448bd321)\n*  updated manifest [View](https://github.com/twocanoes/xcreds/commit/ce8b9197c101d106605d5ea8e6bf87f5b52412ac)\n*  added username to manifest [View](https://github.com/twocanoes/xcreds/commit/aa7945756f9c0a0573cf79b48c677c35dfbe7469)\n*  fixed install scripts [View](https://github.com/twocanoes/xcreds/commit/ad2152c8e24b03dd685627d052b3116e5badfd62)\n*  updated readme [View](https://github.com/twocanoes/xcreds/commit/690e6966e81bcb27f8859c010c230d2d0af4ba0a)\n*  updaed sample profiles [View](https://github.com/twocanoes/xcreds/commit/5cd70f021fc8a4b7321dbfe7bd5cf1298a901609)\n*  added arbitrary check for password in form [View](https://github.com/twocanoes/xcreds/commit/9d1dadac7750544dffa4db82fc258f0b7ed9663e)\n*  bumped build number [View](https://github.com/twocanoes/xcreds/commit/bb90624c3d9a45870956621f22b41da5434e2bce)\n*  fixed idtoken required values causing failure [View](https://github.com/twocanoes/xcreds/commit/de5dd6affee913fc6f2f65125188a8e894460b65)\n*  added build number when starting up [View](https://github.com/twocanoes/xcreds/commit/2d4b70a192e119352cccc2d7318b8997e3c7fe74)\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/5f6bdd336f311caa991f10c380b15f9acc2f5bb2)\n*  added build number when starting up in mechnism [View](https://github.com/twocanoes/xcreds/commit/26b995a2173376ea6275a037a7866ea154b9ef31)\n*  create user mech [View](https://github.com/twocanoes/xcreds/commit/2bd3cb885f9cfc2557cc709404a8c665e99236f1)\n*  tweaked create user [View](https://github.com/twocanoes/xcreds/commit/4bfdd1017266b30d25e9fb0162decbe54fe3b5a9)\n*  added FDE enable [View](https://github.com/twocanoes/xcreds/commit/2422e5588412d4cc721f93c0695405d939096c42)\n*  updated prefs [View](https://github.com/twocanoes/xcreds/commit/14d39e3fe023b6412a73b6cba2a214b283a1b7d7)\n*  added fde option [View](https://github.com/twocanoes/xcreds/commit/2b022b47d6c23e2bbf6fcd6f0b7bb249df689bc1)\n*  added network changing detection to reload page [View](https://github.com/twocanoes/xcreds/commit/de4acf06e2e7b18c232dd0dcd5ce55e8944d2e2a)\n*  fixed status icon issue; fixed lack of prompting on first launch [View](https://github.com/twocanoes/xcreds/commit/9aa2d77b366fe963aed1ec78c932c467d83f5b63)\n*  added default to create keychain [View](https://github.com/twocanoes/xcreds/commit/27be41527d7716df6fbcd9ed276f542b80e53682)\n*  added better loading at start [View](https://github.com/twocanoes/xcreds/commit/1223e399814d061d9962a75d6c037445cd9862f9)\n*  updated loading message [View](https://github.com/twocanoes/xcreds/commit/d8d1b96e3e2927eb110747155942c4f000c8872c)\n*  smother transitions and background image [View](https://github.com/twocanoes/xcreds/commit/6f6f2b9c7b24a3724440b77b52d86cfaeca3169d)\n*  fixed background image url [View](https://github.com/twocanoes/xcreds/commit/8164b122c71f76b0bea9a3237d386ffac9ec0d30)\n*  fixed overlay not showing [View](https://github.com/twocanoes/xcreds/commit/6cedc60bbaad9747209ae73521a0af480a8301a0)\n*  fixed regression with back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/ff3dee83940377a8544283d207e011f5854be8c3)\n*  add tweak to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/7aafd66a0d75a3ee09dc6a4cd1c7f211877fb15b)\n*  more tweaks to back to my xcreds [View](https://github.com/twocanoes/xcreds/commit/b2ef99f2db8056933eb2c047f28d6449059103dd)\n*  fixed minor issues with prefs [View](https://github.com/twocanoes/xcreds/commit/18bccee23ceb28e47bd25f7ed38433dea76e787b)\n*  reverted default [View](https://github.com/twocanoes/xcreds/commit/5fe505fa6c90b1ae198bc1d5aeac6068e0e9ecdc)\n*  project update [View](https://github.com/twocanoes/xcreds/commit/4ea4da0da0260d9d9379ea599689d1c5ed1515b5)\n\n\n## prebeta (2022-06-15)\n\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/7289a72ae79005797fa4651dc61328354aca7c2b)\n*  Update README.md [View](https://github.com/twocanoes/xcreds/commit/07947e9e66f68db049481b6e35373a8a5b5a4bf5)\n*  added support for Google IdP [View](https://github.com/twocanoes/xcreds/commit/4733a6cdeef503db2e08a21bb9443700bfb9526d)\n\n\n"
  },
  {
    "path": "release_notes.sh",
    "content": "#!/usr/bin/env bash\nprevious_tag=0\nfor current_tag in $(git tag --sort=-creatordate)\ndo\n\nif [ \"$previous_tag\" != 0 ];then\n    tag_date=$(git log -1 --pretty=format:'%ad' --date=short ${previous_tag})\n    printf \"## ${previous_tag} (${tag_date})\\n\\n\"\n    git log ${current_tag}...${previous_tag} --pretty=format:'*  %s [View](https://github.com/twocanoes/xcreds/commit/%H)' --reverse | grep -v Merge\n    printf \"\\n\\n\"\nfi\nprevious_tag=${current_tag}\ndone\n"
  },
  {
    "path": "release_notes_plain.sh",
    "content": "#!/usr/bin/env bash\nprevious_tag=0\nfor current_tag in $(git tag --sort=-creatordate)\ndo\n\nif [ \"$previous_tag\" != 0 ];then\n    tag_date=$(git log -1 --pretty=format:'%ad' --date=short ${previous_tag})\n    printf \"## ${previous_tag} (${tag_date})\\n\\n\"\n    git log ${current_tag}...${previous_tag} --pretty=format:'*  %s'  --reverse | grep -v Merge\n    printf \"\\n\\n\"\nfi\nprevious_tag=${current_tag}\ndone\n"
  },
  {
    "path": "run_script.sh",
    "content": "#!/bin/sh\n\nexit 0\n"
  },
  {
    "path": "scripts/setup_xcreds_autostart.sh",
    "content": "#!/bin/bash -e\n\n#thanks to Simon Andersen for crafting the core of this.\n\nif [ ! -d \"/Library/LaunchAgents\" ]; then\n\tmkdir /Library/LaunchAgents\nfi\n\nif [ -e \"/Library/LaunchAgents/local.xcreds.plist\" ]; then\n\techo \"/Library/LaunchAgents/local.xcreds.plist already exists. exiting.\"\nelse\n\t/usr/libexec/PlistBuddy -c \"Add :Label string local.xcreds\" /Library/LaunchAgents/local.xcreds.plist\n\t/usr/libexec/PlistBuddy -c \"Add :ProgramArguments array\" /Library/LaunchAgents/local.xcreds.plist\n\t/usr/libexec/PlistBuddy -c \"Add :ProgramArguments:0 string /Applications/XCreds.app/Contents/MacOS/XCreds\" /Library/LaunchAgents/local.xcreds.plist\n\t/usr/libexec/PlistBuddy -c \"Add :KeepAlive bool YES\" /Library/LaunchAgents/local.xcreds.plist\n\n\techo \"successfully set up xcreds to launch at login for every user.\"\nfi \n"
  },
  {
    "path": "tap/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionAttributes</key>\n\t\t<dict>\n\t\t\t<key>com.apple.ctk.class-id</key>\n\t\t\t<string>com.twocanoes.xcreds.tap</string>\n\t\t\t<key>com.apple.ctk.driver-class</key>\n\t\t\t<string>$(PRODUCT_MODULE_NAME).TokenDriver</string>\n\t\t\t<key>com.apple.ctk.token-type</key>\n\t\t\t<string>smartcard</string>\n\t\t</dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.ctk-tokens</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "tap/Token.swift",
    "content": "//\n//  Token.swift\n//\n//  Created by Timothy Perfitt on 6/18/24.\n//\n\nimport CryptoTokenKit\n\nclass Token: TKSmartCardToken, TKTokenDelegate {\n\n    init(smartCard: TKSmartCard, aid AID: Data?, tokenDriver: TKSmartCardTokenDriver) throws {\n        \n        let instanceID = \"xcredstap\" // Fill in a unique persistent identifier of the token instance.\n        super.init(smartCard: smartCard, aid:nil, instanceID:instanceID, tokenDriver: tokenDriver)\n    }\n\n    func createSession(_ token: TKToken) throws -> TKTokenSession {\n        return TokenSession(token:self)\n    }\n\n}\n"
  },
  {
    "path": "tap/TokenDriver.swift",
    "content": "//\n//  TokenDriver.swift\n//\n//  Created by Timothy Perfitt on 6/18/24.\n//\n\nimport CryptoTokenKit\n\nclass TokenDriver: TKSmartCardTokenDriver, TKSmartCardTokenDriverDelegate {\n\n    func tokenDriver(_ driver: TKSmartCardTokenDriver, createTokenFor smartCard: TKSmartCard, aid AID: Data?) throws -> TKSmartCardToken {\n        return try Token(smartCard: smartCard, aid: nil, tokenDriver: self)\n    }\n\n}\n"
  },
  {
    "path": "tap/TokenSession.swift",
    "content": "//\n//  TokenSession.swift\n//\n//  Created by Timothy Perfitt on 6/18/24.\n//\n\nimport CryptoTokenKit\n\nclass TokenSession: TKSmartCardTokenSession, TKTokenSessionDelegate {\n\n    func tokenSession(_ session: TKTokenSession, beginAuthFor operation: TKTokenOperation, constraint: Any) throws -> TKTokenAuthOperation {\n        return TKTokenSmartCardPINAuthOperation()\n    }\n    \n    func tokenSession(_ session: TKTokenSession, supports operation: TKTokenOperation, keyObjectID: Any, algorithm: TKTokenKeyAlgorithm) -> Bool {\n        // Indicate whether the given key supports the specified operation and algorithm.\n        return true\n    }\n    \n    func tokenSession(_ session: TKTokenSession, sign dataToSign: Data, keyObjectID: Any, algorithm: TKTokenKeyAlgorithm) throws -> Data {\n        var signature: Data?\n        \n        // Insert code here to sign data using the specified key and algorithm.\n        signature = nil\n        \n        if let signature = signature {\n            return signature\n        } else {\n            // If the operation failed for some reason, fill in an appropriate error like objectNotFound, corruptedData, etc.\n            // Note that responding with TKErrorCodeAuthenticationNeeded will trigger user authentication after which the current operation will be re-attempted.\n            throw NSError(domain: TKErrorDomain, code: TKError.Code.authenticationNeeded.rawValue, userInfo: nil)\n        }\n    }\n    \n    func tokenSession(_ session: TKTokenSession, decrypt ciphertext: Data, keyObjectID: Any, algorithm: TKTokenKeyAlgorithm) throws -> Data {\n        var plaintext: Data?\n        // Insert code here to decrypt the ciphertext using the specified key and algorithm.\n        plaintext = nil\n        \n        if let plaintext = plaintext {\n            return plaintext\n        } else {\n            // If the operation failed for some reason, fill in an appropriate error like objectNotFound, corruptedData, etc.\n            // Note that responding with TKErrorCodeAuthenticationNeeded will trigger user authentication after which the current operation will be re-attempted.\n            throw NSError(domain: TKErrorDomain, code: TKError.Code.authenticationNeeded.rawValue, userInfo: nil)\n        }\n    }\n    \n    func tokenSession(_ session: TKTokenSession, performKeyExchange otherPartyPublicKeyData: Data, keyObjectID objectID: Any, algorithm: TKTokenKeyAlgorithm, parameters: TKTokenKeyExchangeParameters) throws -> Data {\n        var secret: Data?\n        \n        // Insert code here to perform Diffie-Hellman style key exchange.\n        secret = nil\n        \n        if let secret = secret {\n            return secret\n        } else {\n            // If the operation failed for some reason, fill in an appropriate error like objectNotFound, corruptedData, etc.\n            // Note that responding with TKErrorCodeAuthenticationNeeded will trigger user authentication after which the current operation will be re-attempted.\n            throw NSError(domain: TKErrorDomain, code: TKError.Code.authenticationNeeded.rawValue, userInfo: nil)\n        }\n    }\n}\n"
  },
  {
    "path": "tap/tap.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.smartcard</key>\n    <true/>\n</dict>\n</plist>\n"
  }
]